Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lucene elasticsearch是否有复合索引?_Lucene_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Lucene,elasticsearch" /> elasticsearch,Lucene,elasticsearch" />

Lucene elasticsearch是否有复合索引?

Lucene elasticsearch是否有复合索引?,lucene,elasticsearch,Lucene,elasticsearch,我想知道elasticsearch是否需要预先定义复合索引。所谓复合索引,我指的是mongodb所拥有的东西 ensureIndex({field1:1,field2:1,field3:1}) 或者类似mysql db的功能 在mytable上创建索引adhoc_索引(字段1、字段2、字段3) 因此,我所处理的数据非常简单(大部分只是csv格式)。(为了完整性)如下所示 字段1,字段2,…,字段n 字段的数量是任意的。一个数据集可能有10个字段,另外20个字段,另外1000个字段。我基本上将每一

我想知道elasticsearch是否需要预先定义复合索引。所谓复合索引,我指的是mongodb所拥有的东西

ensureIndex({field1:1,field2:1,field3:1})

或者类似mysql db的功能

在mytable上创建索引adhoc_索引(字段1、字段2、字段3)

因此,我所处理的数据非常简单(大部分只是csv格式)。(为了完整性)如下所示

字段1,字段2,…,字段n

字段的数量是任意的。一个数据集可能有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查询可能如下所示(我自己不确定这是否正确,只是为了举例说明)

基本上,这个查询说,“给我所有field1=val1,field2=val2,field3=val3,field4=val4的文档”

我之所以问elasticsearch这个问题,是因为我在互联网上搜索复合索引时找不到明确的答案。甚至需要它们吗

我也在评估mongodb和mysql,我认为它们不能很好地适应我的情况,因为这些复合/复合索引必须事先定义,而且在运行时之前,我不会知道哪些字段组需要一起索引以优化查询速度。当然,使用mysql,一旦我找到需要一起索引的字段组(以及顺序),我可以返回创建索引,但如果数据集很大(行数>100万),这可能需要很长时间


我是否只是通过弹性搜索从盒子中取出这个复合索引功能?也就是说,我甚至不必接触索引映射文件/定义

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

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


如果你必须有一个复合索引,你可以考虑索引一个辅助字段,它的值是你想要索引的值的组合。 你能解释一下复合指数到底允许你做什么吗?抱歉,我可能遗漏了一些内容…复合索引/索引允许您更快地查询/搜索。我不知道确切的内部工作/实现,但我认为它们看起来像一个倒排索引。在倒排索引中,键是术语,值是出现术语的文档列表。因此,复合索引可能有多个项作为键。但在mysql这样的系统中,术语的顺序很重要。例如,这个复合索引(field1,field2)不同于(field2,field1),因为它影响WHERE子句。至少对于mysql和mongodb,他们说你需要指定它。顺便说一下,在信息检索中,我也听说过“复合索引”被称为“复合索引”

"bool" : {
 "must" : [
  {"term" : { "field1" : "val1" },
  {"term" : { "field2" : "val2" },
  {"term" : { "field3" : "val3" },
  {"term" : { "field4" : "val4" }
 ]
}