Elasticsearch:如何提高查询性能

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:如何提高查询性能相关的知识,希望对你有一定的参考价值。

在我之前的文章 “Elasticsearch:增加 Elasticsearch 写入吞吐量和速度的完整指南”,它详细地描述了如何提高数据的摄入速度。在今天的文章中,我来详细讲一下如果提高查询的性能。

尽量使用 filters

如果你的搜索结果和分数没有关系,那么尽量使用 filter 来进行搜索。这样会省去大量的计算分数的时间。此外,经常使用的过滤器缓存在节点查询缓存中。当我们进行第二次查询时,速度会变快。使用 filter 的另外一个好处是,可以减少搜索目标的文档数量,这样可以提高搜索的速度。

避免使用脚本的 filter

这个在我之前的文章 “Elasticsearch:避免不必要的脚本 - scripting” 中已经讲过。 由于脚本是在运行时计算的,那么针对大的数据集时,这个计算量可能会很大,那么可能会造成性能的问题。

按日期进行搜索,避免使用 now

这其中的原因就是:如果使用 now,那么就不能进行 caching。

不要过度使用节点和分片

这其中的原因也是很直接。如果我们有过多的节点和分片,那么作为请求的协调节点需要更多的时间来聚合所有的搜索结果。这可能会造成性能上的瓶颈。详细阅读可以参考链接 Elasticsearch Search Latency - Handling Search Bursts, Outages & More。这往往是一个索引含有太多的小的 shard 所引起的。

优化 index settings 对 Elasticsearch 性能起关键作用,例如分片和副本的数量。 在许多情况下,拥有更多副本有助于提高搜索性能。

避免 sparse records

如果一个索引的文档含有很多字段,但是并不是所有的文档都含有所有的值。可能有的文档只有1/3的字段有值,那么这样的文档我们称之为 sparse records。尽管这些文档很多字段没有数值,但是它们还是需要被分配内存,这样会造成资源的浪费及性能的降低。

针对大数据集,使用分页搜索

针对小的搜索结果,我们可以使用 size 来限定返回的数据大小,但是针对大的返回结果,我们可以使用分页来返回结果。具体操作可以参阅 “Elasticsearch:分页搜索结果”。

尽量使用 cache

关于 cache 的使用,请参阅我的另外一篇文章 “Elasticsearch:cache 在 Elasticsearch 中的应用”。


已经被删除的文档

Elasticsearch 索引中有大量已删除的文档也会导致搜索性能问题,如本官方文档中所述。 Force merge API 可用于删除大量已删除的文档并优化分片。

避免使用 wildcard 查询

避免使用通配符,尤其是前导通配符查询,这会导致扫描整个 Elasticsearch 索引。我们可以参阅另外一篇文章 “Kibana:如何在 Kibana 中禁止查询中使用前置通配符查询”。

Regex 及 parent-child

请注意,Regex 查询和父子查询可能会导致搜索延迟。

繁重的聚合

避免使用 unique ID 的繁重聚合。

Timeout 及 terminate_after

当执行大量搜索或结果数据很大时,timeoutteminate_after 可能很有用。

以上是关于Elasticsearch:如何提高查询性能的主要内容,如果未能解决你的问题,请参考以下文章

[Elasticsearch] 邻近匹配 - 性能,关联单词查询以及Shingles

Elasticsearch 分片和副本搜索性能

如何提高ElasticSearch 索引速度

Elasticsearch:使用 Elasticsearch 提高网站搜索查询的相关性

亿级数据毫秒级查询!ElasticSearch是怎么做到的?

Elasticsearch(ES)配置及优化