我想知道弹性搜索是否需要先验地定义复合索引。通过复合指数,我的意思是像mongodb一样。
db.collection.ensureIndex({field1:1,field2:1,field3:1})
或类似mysql db的东西。
在mytable(field1,field2,field3)上创建索引adhoc_index;
所以我处理的数据非常平坦(大多数只是csv格式)。它看起来如下(为了完整性)。
field1,field2,...,fieldN
字段数是任意的。一个数据集可能有10个字段,另外20个,另外1000个。我基本上将每行转换为JSON文档,如下所示。
{
"field1" : "value1",
"field2" : "value2",
...
"fieldN" : "valueN"
}
将A,B和C表示为字段的三个互斥子集:{field1,field2,...,fieldN}。在任何给定的时间,我必须构建一个动态查询,过滤A = a,B = b和C = c的记录。
例如,
所以我的elasticsearch DSL查询可能看起来像下面这样(不确定这是否正确,但只是为了说明)。
"bool" : {
"must" : [
{"term" : { "field1" : "val1" },
{"term" : { "field2" : "val2" },
{"term" : { "field3" : "val3" },
{"term" : { "field4" : "val4" }
]
}
基本上,这个查询说,"给我所有的文件,其中field1 = val1,field2 = val2,field3 = val3,field4 = val4"。
我之所以提到弹性搜索的原因是因为我无法在互联网上找到关于复合索引的明确答案。他们甚至需要吗?
我也正在评估mongodb和mysql,我认为它们不能很好地适应我的情况,因为这些复合/复合索引必须先验地定义,而且我赢了。 t具有该信息直到运行时需要将哪组字段索引在一起以优化查询速度。当然,使用mysql,一旦我找到需要将哪一组字段编入索引(以及按哪种顺序),我可以返回创建索引,但如果数据集很大,则可能需要很长时间(数量)行> 100万)。
我是否只是通过弹性搜索获得了这个复合索引功能?意思是,我甚至不得不触摸索引映射文件/定义?
答案 0 :(得分:9)
ElasticSearch没有复合索引,但它在查询多个索引并将它们相交时非常有效(相交的位向量FTW)。
大多数情况下,即使对于您提到的查询4个不同字段的情况,也不需要复合索引。 ElasticSearch将愉快地查询4个不同的索引,然后以有效的方式交叉结果。根据我的经验,在类似的情况下,它的性能与MongoDB的性能相当并超过了它。
如果绝对必须具有复合索引,则可以考虑索引一个辅助字段,该字段的值是要索引的值的组合。