Elasticsearch 8.X DSL 如何优化更有助于提升检索性能?
创始人
2024-02-20 10:41:19
0

1、企业级实战 DSL(数据已经脱敏)

ec5e15c3314ca1853e84f5ba52246bfe.png31024cb25d4bae51d0ab7ae8f2576974.png1df1534f1e71a42c5fb572871ea76d98.png

2、大家可以看一下,能发现哪些问题?

根据我的实战和咨询经验,我发现如下几个问题。

当然,这是在和球友交流确认问题之后总结出来的。

2.1 问题1:bool 组合嵌套过深。

官方实际是有参数来约束的,indices.query.bool.max_nested_depth——bool 最大支持的嵌套层数是 20,并且过大的嵌套层数会导致“堆栈溢出”异常问题。

那 bool 组合嵌套越深是不是越慢呢?

我拿 228 万+的微博数据(JMeter 模拟100用户并发)作为样例索引数据进行验证。

  • 实验1:嵌套 10 层;执行 5 次,平均耗时:835 ms。

  • 实验2:嵌套 2 层;执行 5 次,平均耗时:674.8 ms。

对比看实验 2 执行查询较实验 1 的查询要快!

其实,初步结论是嵌套越深,执行越慢!

ad6e7626bd7b9cc043561db19268cce0.png8dbbb60e1cce1627fd8376aa439a6b50.png

2.2 问题2:大量使用 wildcard 查询。

我之前血淋淋的教训告诉大家,非必要不使用 wildcard !

尤其数据量大的场景。

参见:Elasticsearch 警惕使用 wildcard 检索!然后呢?

依然拿 228 万+的微博数据(JMeter 模拟 100 用户并发)作为样例索引数据进行验证。

5ac6ed008683bea3ee298315f2988ab2.png

检索语句如下:

f1335a610a90332f91bc4f484b8d313b.png

使用:match_phrase 短语匹配较使用 wildcard 模糊匹配效率提升:6.34 倍!

3631ee3a9ef3b72f730923670b14a891.png

初步结论:非必要,不使用  wildcard。

2.3 问题3:"track_total_hits": 2147483647 没有必要搞这么大?

认知前提:Elasticsearch 中 max_result_window 这个参数大家比较熟悉,就是允许 from + size 翻页检索命中的最多文档数为:10000 条记录。

那么问题来了,如果命中数据量超过 10000万怎么办?

  • 一方面:我们可以修改:max_result_window 的默认值,但默认值修改要慎之又慎。

  • 另一方面:我们可以在执行检索的时候加上 track_total_hits 这个参数。

36635b8522b0754146657647a15f4df9.png

问题来了?什么场景需要单独设置 track_total_hits 参数?什么时候不需要呢?

  • 场景一:当索引设置层面设置了 index.sort 后,本质上写入的数据已经进行了预排序。如果只对前 N 个结果感兴趣,而不关心总命中数,可以简单地将 track_total_hits 设置为 false。

  • 场景二:针对 filter 过滤检索的场景,用户仅关注是否存在,不关注相关性。可以分为如下两种情况:

51d1495ca2721b35ce4c30bb7e7ea946.png

(1)情况2.1:将 track_total_hits 设置为 false,检索结果将不再返回 hits.total 的具体值。

(2)情况2.2:将 track_total_hits 设置为给定的 N, 那么每个分片待召回 N 个文档后就返回。除此之外的业务场景,建议慎用 track_total_hits:true 的场景。

我们同样对比一下性能。

f11583de3c8c26e18fd7ebdb799056b0.png

初步结论:加上 track_total_hits,检索会变慢,我们要结合业务场景谨慎使用。

2.4 问题4:track_scores 确认是否必要使用!

track_scores 含义如下:When sorting on a field, scores are not computed. By setting track_scores to true, scores will still be computed and tracked.

也就是说这是个和排序相关的参数,如果走排序,就不计算评分。

如果想对排序加上评分处理,需要加这个参数。

2.5 问题5:"_source": {"includes": [ 确认是否必须

其实有更快的建模方式,就是 store 设置 true 对字段单独建模。当然,这涉及到数据建模和写入。

_source 下召回的数据字段越多,肯定会越慢。暂且不说别的,网络传输的角度就可见一斑。

网络传输中,网速一定,但是 _source 字段多,意味着传输的字节数多,必然会越慢。

还是拿微博数据验证一下,

a6d75ca69876dc0c7d2070c90a05e71a.png

初步结论,仅指定一个字段比全部默认字段(10个以上),影响时间要快很多!

2.6 问题6:match,match_phrase, wildcard 都混合使用,考虑分词问题解决。

推荐:字词混合索引方案。

一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?

2.7 问题7:建议线上使用复杂DSL,可以使用性能测试验证一下。

文中 JMeter 测试工具使用,推荐视频:

https://t.zsxq.com/0853Q9epD

3、小结

不要小瞧 DSL 的使用,不要堆砌一些不太理解的参数不加验证直接用于实战环境,后面的风险会变得很大。

00e7a71e5db11a059a957fbc4954e157.png

DSL 的调优其实直接影响到检索性能。

大家对文中的 DSL 还有哪些调优建议,欢迎留言交流!

推荐阅读

  1. 全网首发!从 0 到 1 Elasticsearch 8.X 通关视频

  2. 重磅 | 死磕 Elasticsearch 8.X 方法论认知清单(2022年国庆更新版)

  3. 如何系统的学习 Elasticsearch ?

  4. esrally 如何进行简单的自定义性能测试?

  5. Elasticsearch 性能调优指南——推荐实战 DSL

  6. 让Elasticsearch飞起来!——性能优化实践干货

9ebcc51bdcc3edd789c2ed4c58dc2aab.jpeg

更短时间更快习得更多干货!

和全球 1800+ Elastic 爱好者一起精进!

6b1de16a5bba78e9be22e189e5848746.gif

比同事抢先一步学习进阶干货!

相关内容

热门资讯

20州因签证问题起诉联邦政府,... 【环球时报特约记者 任重】据美国《新闻周刊》13日报道,当地时间12日,美国20个州起诉联邦政府,反...
水晶宫主帅格拉斯纳:0比3失利... 在12月15日的英超联赛中,水晶宫主场迎战曼城,最终以0比3的比分落败。这场比赛不仅对水晶宫来说是一...
明年将根据形势出台实施增量政策 ● 本报记者 熊彦莎 中央财办分管日常工作的副主任、中央农办主任韩文秀12月13日在中国国际经济交流...
“何晴告别仪式”将以家人送别的... 12月13日,著名演员何晴在北京安然离世,享年61岁。 记者从98版《水浒传》制片主任汪瑞处获悉,根...
外籍男子携带多件文物出境被查!... 12月14日,南都N视频记者从“海关发布”公众号获悉,近日,西九龙站海关查获出境旅客携带11件/套古...
21场0球!哈曼:利物浦花1.... 在利物浦2-0战胜布莱顿的赛前,前利物浦球员哈曼在德国天空体育上对新加盟的维尔茨发表了颇具争议的看法...
公益诉讼保障快递小哥出行安全 本报讯(记者 徐慧瑶)“师傅,您的快递三轮车雨刷器、后视镜都完好吗?车辆有没有定期检修……”近日,顺...
俄罗斯免签政策落地:解锁跨境新... 当俄罗斯对中国居民免签的政策正式落地,不仅为普通民众打开了“说走就走”的跨境出行大门,更在经济、人文...
原创 从... 近年来,随着全球地缘政治的变动与经济重心的转移,“东升西降”的趋势愈发明显。或许在不久的将来,这一局...
4斤黄金凤冠被男童碰坏!谁该担... 千万网红张凯毅的4斤重黄金凤冠,在免费展览中被男童触碰掉落损坏,这顶由其老公亲手打造、意义非凡的展品...