为什么IndexOrDocValuesQuery花费这么长时间?

时间:2019-01-13 15:27:45

标签: elasticsearch

我正在使用索引约为120GB的5节点Elasticsearch集群。

我们遇到了具有多个过滤器的慢查询问题。对查询进行概要分析后,我发现IndexOrDocValuesQuery每个查询大约花费3.2秒。每个查询包含大约4或5个步骤,这将花费20秒。奇怪的是,我想想TermQuery要贵得多,它花费了64毫秒。

我们应该在哪里寻找更多信息,以了解可能导致这些查询速度下降的原因?

Elasticsearch V5.5,我认为有2.8亿个文档,但有4000万个主要文档(无嵌套)

节点规格: 4个CPU 26 GB内存 12 GB堆

5个数据节点,2个主节点,2个客户端。主机和客户端的规格要比节点低得多。

以下是查询:https://gist.github.com/wakawaka54/d4cad864d858efc41a0b2806ea0041b4 1

以下是查询配置文件结果:https://gist.github.com/wakawaka54/6b52fd0eef2b8ead1589241e65c239fe

这是索引映射: https://gist.github.com/wakawaka54/417602c8f73a613830904b20398b7bac

1 个答案:

答案 0 :(得分:0)

首先要考虑术语查询和其他任何查询。字词查询最快,因为它们只需要按字词查找并获取所有匹配的文档ID。这是一个微不足道的操作,它利用术语词典,该信息的获取速度与键查找一样快。

当然,即使启用了DocValues(默认情况下),远程过滤器的速度也会慢得多。

我看不到您的numberSort是嵌套类型的。我想不确定是否可以加快搜索速度,但是值得一试,因为您希望将其嵌套。

如何加快查询速度?

  • 您已经选择了这些范围查询作为过滤器,应cache对它们进行过滤,以便以后可以有效地重用(因此,我希望您在预热之后测量数字)

  • 从索引的大小来看,很明显,如果将索引的 120 Gb 划分为5个节点,则每个数据节点大约为 24 Gb 。但是,您的RAM仅 26 Gb ,不足以mmap将所有索引文件放置在内存中(您只有26-12 = 14 Gb < / strong>用于mmap的RAM)。这种情况将需要将文件从磁盘加载/卸载到内存中,这将创建大量的IO(我认为您可以证明它,进行测量)。我建议增加RAM,以便它的非必需RAM足以获取该节点上的所有索引文件。通常这会加快很多速度。