当前位置: 首页 > 知识库问答 >
问题:

elasticsearch有复合索引吗?

万乐逸
2023-03-14

我想知道elasticsearch是否需要定义一个优先级的复合索引。通过复合索引,我的意思是像mongoDB一样的东西。

db.collection.ensure索引

或者类似mysql db的功能。

在mytable上创建索引adhoc_index(field 1, field 2, field 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={field 1}, B={field 2, field 3}, C={field 6}
  • A={field 2}, B={field 1}, C={field 1000, field 50}

因此,我的elasticsearch DSL查询可能如下所示(我自己不确定这是否正确,但只是为了举例说明)。

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

基本上,这个查询说,“给我所有带有field 1=val1、field 2=val2、field 3=val3、field 4=val4的文档”。

我问这个关于elasticsearch的原因是因为我在网上搜索复合索引时找不到一个明确的答案。他们甚至需要吗?

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

我是否可以通过弹性搜索直接获得这个复合索引功能?也就是说,我甚至不必接触索引映射文件/定义?

共有1个答案

东方和惬
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我想知道Elasticsearch是否需要先定义复合索引。通过复合索引,我的意思是像mongodb一样。 db.collection.ensureIndex({field1:1,field2:1,field3:1}) 或类似mysql db的东西。 在mytable(field1,field2,field3)上创建索引adhoc_index; 所以我要处理的数据非常平坦(大多数只是cs

  • 问题内容: 自几个月前以来,我的集群每天都有一个索引,每个索引有5个分片(默认),并且由于分片太多(超过1000个),我无法在整个集群上运行查询。 文档ID是自动生成的。 如何将索引合并为一个索引,处理有冲突的ID(甚至可能发生冲突)并更改类型? 我正在使用ES版本5.2.1 问题答案: 仅在使用ELK堆栈几个月并逐日创建索引后才可见的常见问题。这里有一些选项可以解决性能问题。 首先,您可以用来限

  • 我们将数据导入到elasticsearch集群中的索引很少,每个索引约为10GB。 同时,我们关心对现有索引的搜索,很少是小的-100MB,也很少是大的-10GB。 根据这些文章和拉请求,我们不应该接触合并设置在所有。 在这里非常困惑,任何帮助都非常感谢。

  • 问题内容: 我们的MySql表有2500万行 以下是表中的列 以上我们在c_id,c_name,s_id,l_type,域列上具有正常索引 我打算在域,l_time,l_type列上添加复合索引。因此,现在我可以删除域上的单个索引了吗? 谢谢 问题答案: 复合索引的任何前缀也将单独用作索引。因此,如果您有一个复合索引,则相当于在和上都有索引。无需分别将这些索引分开,它们将是多余的并且浪费空间。 因

  • 主要内容:创建索引,删除索引,获取索引,测试索引存在,打开/关闭索引API,索引别名,索引设置,分析,索引模板,索引统计,刷新清除数据, 刷新索引这些API负责管理索引的所有方面,如设置,别名,映射,索引模板。 创建索引 此API可用于创建索引。 当用户将对象传递到任何索引时,可以自动创建索引,也可以在此之前创建索引。 要创建索引,只需要发送包含设置,映射和别名的发布请求,或者只发送一个没有正文的简单请求。 例如, 响应 或者,加上一些设置 - 请求正文 响应 或使用映射 - 请求正文 响应 或

  • 问题内容: 我有一个包含多个重复条目的索引。它们具有不同的ID,但其他字段具有相同的内容。 例如: 删除重复项后: 有没有一种方法可以删除所有重复项并仅保留一个不同的条目,而无需手动比较所有条目? 问题答案: 我使用rails,如有必要,我将使用命令导入内容,该命令将删除并重新索引该索引和类型的所有内容……但是不确定您在哪个环境中运行ES。我只能看到的问题是数据源是否您正在从中导入(即数据库)的记