关于如何减少 Elasticsearch 搜索延迟和优化搜索性能的 14 个技巧:
- size参数为 size 参数分配一个巨大的值会导致 Elasticsearch 计算大量的命中,从而导致严重的性能问题。您应该批量处理小尺寸的请求,而不是设置巨大的尺寸。
- 分片和副本优化对 Elasticsearch 性能起着至关重要作用的必要索引设置,例如分片数和副本数。在许多情况下,拥有更多副本有助于提高搜索性能。
- 删除文件Elasticsearch 索引中存在大量已删除文档也会导致搜索性能问题,如本官方文档中所述。Force merge API 可用于移除大量已删除的文档并优化分片。
- 搜索过滤器在 Elasticsearch 查询中有效使用过滤器可以显着提高搜索性能,因为过滤器子句1) 缓存,以及 2) 能够减少查询子句中要搜索的目标文档。
- 通配符查询避免使用通配符,尤其是前导通配符查询,这会导致扫描整个 Elasticsearch 索引。
- 正则表达式和父子请注意,Regex 查询和父子查询可能会导致搜索延迟。
- 实现功能有多种方法可以在 Elasticsearch 中实现特定功能。例如,自动完成可以以各种样式实现。
- 大量的小碎片拥有许多小分片可能会导致大量网络调用和线程,从而严重影响搜索性能;
- 重聚合避免涉及唯一 ID 的大量聚合。
- 超时并终止在执行繁重的搜索或结果数据量很大时,超时参数和终止参数非常有用。
- 搜索模板使用搜索模板实现更好的抽象,这意味着无需向用户公开您的查询语法。搜索模板还可以帮助您通过网络传输更少的数据,这在您有大型 Elasticsearch 查询时特别有用。
- 多搜索API尽可能使用msearch 。在大多数应用程序中,需要为单个事务查询多个 Elasticsearch 索引,有时即使不需要,用户也会按顺序执行。在这两种情况下,当您需要为同一事务查询多个索引并且这些查询的结果是独立的时,您应该始终使用 msearch 在 Elasticsearch 中并行执行查询。
- 术语Term查询当您需要精确匹配和关键字字段时使用术语查询。默认情况下,如果未提供显式映射,Elasticsearch 会为每个包含字符串值的字段生成文本和关键字字段。用户甚至倾向于在产品 ID 等关键字数据类型上使用匹配查询,因为匹配查询要经过分析操作,所以成本很高。阅读Term 与 Match 查询之间的区别,并始终对关键字数据类型以及需要精确搜索以获得更好性能的任何地方使用 term 查询。
- 来源过滤_source 过滤是在检索大量文档或大文档时提高 Elasticsearch 查询性能的好方法。默认情况下,Elasticsearch 返回匹配文档的完整来源。如果您根本不需要 _source 或只需要特定字段的值,则可以使用 _source 过滤来实现。