当前位置:  开发笔记 > 后端 > 正文

elasticsearch有复合指数吗?

如何解决《elasticsearch有复合指数吗?》经验,为你挑选了1个好方法。

我想知道弹性搜索是否需要先验地定义复合索引.通过复合指数,我的意思是像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万).

我是否只是通过弹性搜索获得了这个复合索引功能?意思是,我甚至不必触摸索引映射文件/定义?



1> Avish..:

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

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

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

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有