Elasticsearch 8.X DSL 如何优化更有助于提升检索性能?

这篇具有很好参考价值的文章主要介绍了Elasticsearch 8.X DSL 如何优化更有助于提升检索性能?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

dsl优化dsl优化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 的查询要快!

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

dsl优化dsl优化

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

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

尤其数据量大的场景。

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

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

dsl优化

检索语句如下:

dsl优化

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

dsl优化

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

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

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

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

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

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

dsl优化

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

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

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

dsl优化

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

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

我们同样对比一下性能。

dsl优化

初步结论:加上 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 字段多,意味着传输的字节数多,必然会越慢。

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

dsl优化

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

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

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

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

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

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

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

3、小结

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

dsl优化

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

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

推荐阅读

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

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

  3. 如何系统的学习 Elasticsearch ?

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

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

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

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

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

dsl优化

比同事抢先一步学习进阶干货!文章来源地址https://www.toymoban.com/news/detail-573667.html

到了这里,关于Elasticsearch 8.X DSL 如何优化更有助于提升检索性能?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何优化vue项目 如何提升速度

    优化 Vue 项目和提升速度可以从多个方面入手。下面是一些常见的优化技巧: 使用生产环境构建:在部署项目时,使用 Vue 的生产环境构建可以去除开发环境的调试工具和警告信息,减小项目的体积。 代码拆分和懒加载:将项目代码拆分成多个小模块,并使用 Vue 的异步组件

    2024年02月10日
    浏览(36)
  • 如何优化档案库房管理?一招学会轻松提升效率

    在现代企业运营中,档案库房扮演着重要的角色,承载着大量宝贵的纸质档案资料。这些档案包含着企业的历史、客户信息、法律文件等重要数据,对于企业的正常运转和决策制定至关重要。然而,传统的档案库房管理方式存在一系列的挑战和难题。 传统的档案库房管理通常

    2024年02月11日
    浏览(50)
  • 如何通过优化服务器提升网站的SEO排名

    在当今数字化时代,拥有一个高效、稳定的服务器对于网站的成功至关重要。然而,服务器不仅仅是为了提供网站的基本运行,它还可以对搜索引擎优化(SEO)起到关键作用,于是就有了多IP站群服务器这样对SEO非常友好的服务器。通过优化服务器设置和配置,可以提升网站的性

    2024年02月07日
    浏览(96)
  • Elasticsearch:人类语言到 Elasticsearch 查询 DSL

    Elasticsearch 为开发者提供了强大的搜索功能。Elasticsearch 使用 DSL 来进行查询。对于很多从关系数据库过来的人,这个很显然不很适应。虽然我们可以使用 SQL 来进行查询,但是我们必须通过一些命令来进行转换。我们可以通过阅读文章: Elasticsearch:Elasticsearch SQL介绍及实例

    2024年02月04日
    浏览(48)
  • elasticsearch 笔记二:搜索DSL 语法(搜索API、Query DSL)

    从索引 tweet 里面搜索字段 user 为 kimchy 的记录 从索引 tweet,user 里面搜索字段 user 为 kimchy 的记录 从所有索引里面搜索字段 tag 为 wow 的记录 说明:搜索的端点地址可以是多索引多 mapping type 的。搜索的参数可作为 URI 请求参数给出,也可用 request body 给出 URI 搜索方式通过 URI

    2024年02月04日
    浏览(55)
  • Elasticsearch:DSL Query

    Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有的数据,一般测试用,例如:match_all,但有分页限制,一次20条左右 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。常见的有两种

    2024年02月10日
    浏览(53)
  • 【Elasticsearch】DSL查询文档

    目录 1.DSL查询文档 1.1.DSL查询分类 1.2.全文检索查询 1.2.1.使用场景 1.2.2.基本语法 1.2.3.示例 1.2.4.总结 1.3.精准查询 1.3.1.term查询 1.3.2.range查询 1.3.3.总结 1.4.地理坐标查询 1.4.1.矩形范围查询 1.4.2.附近查询 1.5.复合查询 1.5.1.相关性算分 1.5.2.算分函数查询 1)语法说明 2)示例 3)小

    2024年02月16日
    浏览(41)
  • 【ElasticSearch】DSL查询语法

    Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。官方文档: 其中,常见的查询类型有: 查询所有 :查询出所有数据,一般测试用。例如: 全文检索(full text)查询 :利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: 精确查询 :根据精确

    2024年02月16日
    浏览(44)
  • 【Elasticsearch】DSL操作相关

    索引操作 ES的索引与SQL的表很类似 新建索引 查询索引 查看所有索引 这里的查询结果表示索引的状态信息,按顺序数据表示结果如下: 内容 含义 具体描述 yellow 单点正常 当前服务器健康状态: green (集群完整) yellow (单点正常、集群不完整) red(单点不正常) open status 索引打开

    2024年02月06日
    浏览(39)
  • Elasticsearch Query DSL

    这里使用的 Elasticsearch 的版本为 7.12.1 。 1.1 文档(Document) ElasticSearch 是面向文档的,文档是所有可搜索数据的最小单位,例如 MySQL 的一条数据记录。 文档会被序列化成为 json 格式,保存在 ElasticSearch 中。 每个文档都有一个唯一 ID,例如 MySQL 中的主键 ID。 JSON文档 一篇文档包

    2024年02月15日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包