一尘不染

Elasticsearch有复合索引吗?

elasticsearch

我想知道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的记录。

例如,

  • 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的文档”。

之所以问有关Elasticsearch的原因是因为我在互联网上找不到有关复合索引的明确答案。他们甚至需要吗?

我也在评估mongodb和mysql,并且我认为它们不能很好地适应我的情况,因为这些复合/复合索引必须先定义,并且直到运行时我才拥有该信息。字段需要一起索引以优化查询速度。当然,对于mysql,一旦我找出需要一起索引的字段组(以及顺序),我就可以返回创建索引,但是如果数据集很大(可能会花费很多时间)行>
100万)。

我是否可以通过elasticsearch直接使用此复合索引功能?意思是,我什至不必触摸索引映射文件/定义?


阅读 275

收藏
2020-06-22

共1个答案

一尘不染

ElasticSearch没有复合索引,但是在查询多个索引并将它们相交(相交位向量FTW)时非常有效。

在大多数情况下,甚至在您提到要查询4个不同字段的情况下,也不需要复合索引。ElasticSearch将愉快地查询4个不同的索引,然后以有效的方式将结果相交。以我的经验,在类似情况下,它的性能与MongoDB相当,甚至超过MongoDB。

如果绝对必须具有复合索引,则可以考虑为辅助字段建立索引,该辅助字段的值是要索引的值的组合。

2020-06-22