我想知道弹性搜索是否需要先验地定义复合索引.通过复合指数,我的意思是像mongodb那样的东西.
db.collection.ensureIndex({field1:1,field2:1,field3:1})
或类似mysql db的东西.
在mytable上创建索引adhoc_index(field1,field2,field3);
所以我处理的数据非常平坦(大多数只是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的记录.
例如,
A = {field1},B = {field2,field3},C = {field6}
A = {field2},B = {field1},C = {field1000,field50}
所以我的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,我认为它们不能很好地适应我的情况,因为这些复合/复合索引必须先验地定义,并且我将不会有这些信息,直到运行时哪个组字段需要索引在一起以优化查询速度.当然,使用mysql,一旦我找到需要将哪一组字段编入索引(以及按哪种顺序),我可以返回创建索引,但如果数据集很大,则可能需要很长时间(数量)行> 100万).
我是否只是通过弹性搜索获得了这个复合索引功能?意思是,我甚至不必触摸索引映射文件/定义?
ElasticSearch没有复合索引,但它在查询多个索引并将它们相交时非常有效(相交的位向量FTW).
大多数情况下,即使对于您提到的查询4个不同字段的情况,也不需要复合索引.ElasticSearch将愉快地查询4个不同的索引,然后以有效的方式交叉结果.根据我的经验,在类似的情况下,它的性能与MongoDB的性能相当并超过了它.
如果绝对必须具有复合索引,则可以考虑索引一个辅助字段,该字段的值是要索引的值的组合.