我想知道elasticsearch是否需要预先定义复合索引。通过复合索引,我的意思是类似于 mongodb 的东西。
db.collection.ensureIndex( { 字段1: 1, 字段2: 1, 字段3: 1 } )
或者类似于 mysql db 的东西。
在 mytable(field1, field2, field3) 上创建索引 adhoc_index;
所以我处理的数据非常扁平(大部分只是csv格式)。它看起来像下面这样(为了完整性)。
字段 1、字段 2、...、字段 N
字段的数量是任意的。一个数据集可能有 10 个字段,另一个有 20 个字段,另一个有 1000 个字段。我基本上将每一行转换为如下所示的 JSON 文档。
{
"field1" : "value1",
"field2" : "value2",
...
"fieldN" : "valueN"
}
将 A、B 和 C 表示为字段的三个互斥子集:{field1, field2, ..., fieldN}。在任何给定时间,我都必须构建一个动态查询来过滤 A=a、B=b 和 C=c 的记录。
例如,
- A = {字段1},B = {字段2,字段3},C = {字段6}
- A = {字段2},B = {字段1},C = {字段1000,字段50}
所以我的elasticsearch DSL查询可能看起来像下面这样(我自己不确定这是否正确,但只是为了说明)。
"bool" : {
"must" : [
{"term" : { "field1" : "val1" },
{"term" : { "field2" : "val2" },
{"term" : { "field3" : "val3" },
{"term" : { "field4" : "val4" }
]
}
基本上,这个查询说,“给我所有包含 field1=val1、field2=val2、field3=val3、field4=val4 的文档”。
我之所以问这个关于elasticsearch的问题是因为我在互联网上搜索复合索引时找不到明确的答案。他们还需要吗?
我也在评估 mongodb 和 mysql,我认为它们不能很好地适应我的情况,因为这些复合/复合索引必须先验定义,并且直到运行时我才会获得该信息字段需要一起建立索引以优化查询速度。当然,使用mysql,一旦我找出哪组字段需要一起索引(以及按什么顺序),我可以返回创建索引,但如果数据集很大(数据集的数量),这可能需要很长时间行数 > 100 万)。
我是否可以通过弹性搜索直接获得这个复合索引功能?意思是,我什至不必接触索引映射文件/定义?