网站首页 > 教程文章 正文
1、企业级实战 DSL(数据已经脱敏)
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 的查询要快!
其实,初步结论是嵌套越深,执行越慢!
2.2 问题2:大量使用 wildcard 查询。
我之前血淋淋的教训告诉大家,非必要不使用 wildcard !
尤其数据量大的场景。
参见:Elasticsearch 警惕使用 wildcard 检索!然后呢?
依然拿 228 万+的微博数据(JMeter 模拟 100 用户并发)作为样例索引数据进行验证。
检索语句如下:
使用:match_phrase 短语匹配较使用 wildcard 模糊匹配效率提升:6.34 倍!
初步结论:非必要,不使用 wildcard。
2.3 问题3:"track_total_hits": 2147483647 没有必要搞这么大?
认知前提:Elasticsearch 中 max_result_window 这个参数大家比较熟悉,就是允许 from + size 翻页检索命中的最多文档数为:10000 条记录。
那么问题来了,如果命中数据量超过 10000万怎么办?
- 一方面:我们可以修改:max_result_window 的默认值,但默认值修改要慎之又慎。
- 另一方面:我们可以在执行检索的时候加上 track_total_hits 这个参数。
问题来了?什么场景需要单独设置 track_total_hits 参数?什么时候不需要呢?
- 场景一:当索引设置层面设置了 index.sort 后,本质上写入的数据已经进行了预排序。如果只对前 N 个结果感兴趣,而不关心总命中数,可以简单地将 track_total_hits 设置为 false。
- 场景二:针对 filter 过滤检索的场景,用户仅关注是否存在,不关注相关性。可以分为如下两种情况:
(1)情况2.1:将 track_total_hits 设置为 false,检索结果将不再返回 hits.total 的具体值。
(2)情况2.2:将 track_total_hits 设置为给定的 N, 那么每个分片待召回 N 个文档后就返回。除此之外的业务场景,建议慎用 track_total_hits:true 的场景。
我们同样对比一下性能。
初步结论:加上 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 字段多,意味着传输的字节数多,必然会越慢。
还是拿微博数据验证一下,
初步结论,仅指定一个字段比全部默认字段(10个以上),影响时间要快很多!
2.6 问题6:match,match_phrase, wildcard 都混合使用,考虑分词问题解决。
推荐:字词混合索引方案。
一个线上问题引发的思考——Elasticsearch 8.X 如何实现更精准的检索?
2.7 问题7:建议线上使用复杂DSL,可以使用性能测试验证一下。
文中 JMeter 测试工具使用,推荐视频:
https://t.zsxq.com/0853Q9epD
3、小结
不要小瞧 DSL 的使用,不要堆砌一些不太理解的参数不加验证直接用于实战环境,后面的风险会变得很大。
DSL 的调优其实直接影响到检索性能。
- 上一篇: 软件负载测试工具常用的有哪些?_负载测试用例
- 下一篇: 性能测试完整流程_性能测试流程介绍
猜你喜欢
- 2025-09-06 Fiddler抓包测试基础教程_fiddler抓包tunnel to
- 2025-09-06 面试前这些接口测试知识要点,终于梳理好了,拿走不谢
- 2025-09-06 12K+ Star!新一代的开源持续测试工具!
- 2025-09-06 性能测试利器-Locust框架解析_测试用的框架
- 2025-09-06 Fiddler入门教程全家桶,建议收藏
- 2025-09-06 性能测试完整流程_性能测试流程介绍
- 2025-09-06 软件负载测试工具常用的有哪些?_负载测试用例
- 2025-09-06 接口测试——requests 的基本了解
- 2025-09-06 性能测试工具Locust_性能测试工具哪个好用
- 2025-09-06 常用的Jmeter参数化技巧总结,总有一个你不知道
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)