我想知道Elasticsearch是否需要先定义复合索引。通过复合索引,我的意思是像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的文档”。
之所以问有关Elasticsearch的原因是因为我在互联网上找不到有关复合索引的明确答案。他们甚至需要吗?
我也在评估mongodb和mysql,并且我认为它们不能很好地适应我的情况,因为这些复合/复合索引必须先定义,并且直到运行时我才拥有该信息。字段需要一起索引以优化查询速度。当然,对于mysql,一旦我找出需要一起索引的字段组(以及顺序),我就可以返回创建索引,但是如果数据集很大(可能会花费很多时间)行> 100万)。
我是否可以通过elasticsearch直接使用此复合索引功能?意思是,我什至不必触摸索引映射文件/定义?
ElasticSearch没有复合索引,但是在查询多个索引并将它们相交(相交位向量FTW)时非常有效。
在大多数情况下,甚至在您提到要查询4个不同字段的情况下,也不需要复合索引。ElasticSearch将愉快地查询4个不同的索引,然后以有效的方式将结果相交。以我的经验,在类似情况下,它的性能与MongoDB相当,甚至超过MongoDB。
如果绝对必须具有复合索引,则可以考虑为辅助字段建立索引,该辅助字段的值是要索引的值的组合。