当前位置: 首页 > 面试题库 >

Elasticsearch有复合索引吗?

钱旻
2023-03-14
问题内容

我想知道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直接使用此复合索引功能?意思是,我什至不必触摸索引映射文件/定义?


问题答案:

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

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

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



 类似资料:
  • 我想知道elasticsearch是否需要定义一个优先级的复合索引。通过复合索引,我的意思是像mongoDB一样的东西。 db.collection.ensure索引 或者类似mysql db的功能。 在mytable上创建索引adhoc_index(field 1, field 2, field 3); 因此,我处理的数据非常简单(大部分只是csv格式)。为完整起见,如下所示。 字段1,字段2。

  • 问题内容: 自几个月前以来,我的集群每天都有一个索引,每个索引有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。我只能看到的问题是数据源是否您正在从中导入(即数据库)的记