Elasticsearch 8.X 检索实战调优锦囊 001

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

检索锦囊 1:尽可能的使用缓存

对于精准匹配的查询,不关注评分结果,只关注数据是否满足检索需求。

可以考虑用 filter “包裹一层”,如处理时间范围检索,Elasticsearch 能缓存部分结果。但,要说明的是更换时间窗口,换不同时间段检索,原有缓存不起作用。

关于 filter 的缓存效果,官方文档如是说:

“Frequently used filters will be cached automatically by Elasticsearch, to speed up performance.”

即:“频繁的使用过滤器会有自动缓存的“效果”,以提高性能。”

举例如下,“/m”的本质使检索不是具体到某秒的精确值,而是扩展到分钟。

GET kibana_sample_data_flights/_search
{
  "profile": true, 
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "timestamp": {
            "gte": "now-1h/m",
            "lte": "now/m"
          }
        }
      }
    }
  }
}

加“profile;true”后,看到的检索结果如下。

Elasticsearch 8.X 检索实战调优锦囊 001

官方文档解释的不够准确,这里结合 profile:true的结果,解释一下。

  • 起始时间:now-1h/m 为当前时间戳减去1分钟所在分钟的 00 秒的时刻;

  • 结束时间:now为当前时间戳所在分钟的 59秒的时刻。

更为确切的说,时间跨度为 2 分钟了。

Elasticsearch 8.X 检索实战调优锦囊 001

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html#_search_rounded_dates

检索锦囊 2:文件系统缓存预热

如果 Elasticsearch 节点重启,文件系统缓存通常是空的。

操作系统需要一些时间才能将索引的热数据加载到内存中,以便快速检索。

我们可以通过如下的设置来告知操作系统哪些文件应立即加载到内存中。

PUT /my-index-000001
{
  "settings": {
    "index.store.preload": ["nvd", "dvd"]
  }
}

支持的文件扩展名及释义如下所示。

扩展名 英文释义 详细释义
.nvd Norms data 查询时使用的各种归一化因子数据
.dvd doc values Per-Document Values 用于聚合、排序的正排索引文件
.tim terms dictionaries 单词词典
.doc Frequencies 倒排列表,包含:文档列表及词频
.dim points Point values

注意:index.store.preload 设置为“*”通常没有意义,因为所有文件加载到内存中通常没有用。

而更好的选择可能是将其设置为 ["nvd", "dvd", "tim", "doc", "dim"],也就是包含 Norms data、docvalues、单词字典、倒排索引列表等,这些是搜索和聚合中最重要的部分。

https://lucene.apache.org/core/8_0_0/core/org/apache/lucene/codecs/lucene80/package-summary.html

https://www.shenyanchao.cn/blog/2018/12/04/lucene-index-files/

检索锦囊 3:使用预过滤分片执行检索

大背景是:对于时序数据,可以使用 ilm 索引生命周期管理,ilm 索引生命周期管理的前置条件是冷热集群架构。也就是:我们有 rollover 滚动索引机制,可以设置索引在热节点、温节点、冷节点的生存时长。

进一步说,索引不是普通的索引,索引有了时间戳的后缀。这样的好处是:当我们需要检索数据的时候,是可以通过别名等方式物理缩小索引范围区间的。

举个例子:如下图所示,weibo_2527 实际指的是上面的“20190225,20190226,20190227”三个索引,如果只检索这三天的数据,相比于全量数据,weibo_2527别名意味着极大的降低了检索数据样本空间。

Elasticsearch 8.X 检索实战调优锦囊 001

但,索引层面还足够大,看上面截图我们知道,每个索引下面又有 N 多分片。能否继续优化,下沉到分片层面进行快速锁定分片执行高效检索呢?

这就用到了 7.4+ 版本才有的新特性:prefilter shard。使用 prefilter shard,Elasticsearch 能够根据我们的请求确定需要查询的分片。

预处理分片的本质如张超老师所讲:“对于 Date 类型的 Range 查询,在对分片执行搜索之前,先检查一下分片是否包括被查询的数据范围,如果查询的范围与分片持有的数据没有交集,就跳过该分片。”本质一句话:有助于避免查询到达不必要的分片。

默认情况下,此预过滤分片阶段在以下情况下执行:

  • 条件一:该请求针对超过 128 个分片。

  • 条件二:请求针对一个或多个只读索引。

  • 条件三:基于创建过索引的字段进行排序。

这点,参考张超老师验证且给出的结论——“pre-filter 最主要的作用不是降低查询延迟,而是 pre-filter 阶段可以不占用 search theadpool(检索线程池),相比于不加这个参数,会减少了检索线程池的占用情况。“

具体使用方式如下所示。

相当于在原来检索的基础上加了:pre_filter_shard_size参数。

POST kibana_sample_data_flights_20220727/_search?pre_filter_shard_size=1000
{
  "query": {
    "range": {
      "timestamp": {
        "gte": "2022-07-01",
        "lte":"2022-07-31"
      }
    }
  }
}

https://easyice.cn/archives/350

检索锦囊 4:合并只读分片

我们发现,除了借助 rollover (ilm 索引生命周期管理)将冷数据索引标记为只读之外,我们还可以强制合并(force merge)一个或多个索引的分片。与磁盘碎片整理类似,此操作在不涉及缓存时可极大地提高了查询性能。经过只读分片的合并,最大响应时间由 30 秒降到了2 秒。

POST /.ds-my-data-stream-2099.03.07-000001/_forcemerge?max_num_segments=1&pretty

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html#forcemerge-api-time-based-index-ex

检索锦囊 5:新建索引时配置排序方式

在 Elasticsearch 中创建新索引时,可以配置指定每个 Shard 中的 Segments 的排序方式。

默认情况下,Lucene 不应用任何排序。index.sort.* 设置定义了应该使用哪些字段来对每个段内的文档进行排序。

举例:如下索引的定义中(篇幅原因,省略了 Mapping),指定了段内基于 timestamp 字段进降序排序。

PUT kibana_sample_data_flights_20220727
{
  "settings": {
    "index": {
      "sort.field": "timestamp",
      "sort.order": "desc",
      "number_of_shards":10,
      "number_of_replicas":0
    }
  },
  "mappings": {
    "properties": {
        ....
        }
      }
   }
 }

同时,有些业务场景,用户不真正关心跟踪命中的总数,并且只希望查询的Top N 个结果。这时候可以基于“提前终止查询”来快速获取检索结果。那么如何做到提前终止查询呢?

我们都知道:Elasticsearch 默认会在 query 阶段查询每个文档,基于给定条件排序后,然后在 fetch 阶段取满足排序条件的结果数据并返回给客户端。

这就意味着分段数越多,排序自然也会越慢,查询的时间越久。

提前终止查询的前置条件是:写入的时候,已经基于字段排序了。假设我们最终期望返回 Top 10 数据,每个分段内各自取 Top 10 然后再整体排序得到 Top 10,不就可以了吗?

打个不恰当的类比,世界杯需要决出前 10 名,那么:亚洲取前10,欧洲取前10,非洲取前10,美洲取前10,整体排序不就是世界足球 Top10了吗?

Elasticsearch 8.X 检索实战调优锦囊 001

原理明白了,问题就转化为:如何提前终止呢?

实际上并没有特殊参数控制,因为我们前置设置了:"sort.field": "timestamp", Elasticsearch 会根据 size 大小每个分段取 Top 10 数据后自动终止。

`"track_total_hits": false`的目的是不显示文档总数,这也能降低检索时间,提高检索效率。

执行操作如下所示。

POST _reindex
{
  "source": {
    "index": "kibana_sample_data_flights"
  },
  "dest": {
    "index": "kibana_sample_data_flights_20220727"
  }
}

POST kibana_sample_data_flights_20220727/_search
{
  "size": 10,
  "sort": [
    {
      "timestamp": "desc"
    }
  ],
  "track_total_hits": false
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-index-sorting.html#early-terminate

6、小结

  • 在查询中使用近似日期(now/m)而非精准日期格式,以利用节点查询缓存。

  • 时序数据场景,可以将冷数据显示设置为只读来强制执行预过滤分片机制。

  • 必要时对索引执行强制合并(force merge),确保“零碎”的分片合并为一个大分段,以提高检索效率。

  • 关闭超过一年+的索引(具体结合业务需求,如果还在用就不能关),以减少打开的分片数量,避免将资源浪费到无用的数据上。

  • 借助索引生命周期管理 ILM 管理时序数据,实现索引数据的 rollover(滚动),设置只读、强制合并及索引关闭任务,而不是手动执行这种操作。

在“每月存储大约 新增 500 万+数据,每天后端接收 2万次查询请求”的实战业务场景下,如上的优化效果卓著。看对比效果图:

检索对比 平均响应时间(秒) 最长响应时间(秒) 最短响应时间(秒)
优化前 4.619 29.863 0.365
优化后 0.059 1.806 0.010

如上文章翻译自:https://medium.com/teads-engineering/practical-elasticsearch-performance-tuning-on-aws-8c08066e598c

我做了细节展开解读。

你的业务开发或运维中如何做的检索优化呢?欢迎留言讨论交流。

推荐阅读

  1. 如何从0到1打磨一门 Elasticsearch 线上直播课?

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

  3. 如何系统的学习 Elasticsearch ?

  4. Elasticsearch 检索性能优化实战指南

  5. Elasticsearch大文件检索性能提升20倍实践(干货)

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

Elasticsearch 8.X 检索实战调优锦囊 001

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

到了这里,关于Elasticsearch 8.X 检索实战调优锦囊 001的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Langchain 与 Elasticsearch:创新数据检索的融合实战

    在信息爆炸的时代,有效地检索和处理数据变得至关重要。Langchain 和 Elasticsearch 的结合,为我们提供了一个强大的工具,以更智能的方式进行数据检索和分析。 作为一名拥有多年 Elasticsearch 实战经验的技术博主,我将在本文中详细介绍这两种技术的整合应用。 Langchain是一个

    2024年01月19日
    浏览(43)
  • 【elasticsearch实战】知识库文件系统检索工具FSCrawler

    最近有一个需求需要建设一个知识库文档检索系统,这些知识库物料附件的文档居多,有较多文档格式如:PDF, Open Office, MS Office等,需要将这些格式的文件转化成文本格式,写入elasticsearch 的全文检索索引,方便搜索。 我这里介绍一种工具不考虑文件原来格式,但能方便将转

    2024年02月22日
    浏览(47)
  • Elasticsearch实战之处理邮件附件进行进行内容全文检索

    目录 一、系统环境和软件要求 二、软件说明 三、定义文本抽取管道(pipeline) 四、建立索引设置文档结构映射 五、插入文档 六、查询文档 需求是将本地邮件内容以及PDF,EXCEL,WORD等附件内容进行处理,保存到ES数据库,实现邮件内容及附件内容的全文检索。 一、系统环境和

    2024年02月13日
    浏览(64)
  • 【业务功能篇90】微服务-springcloud-检索服务-ElasticSearch实战运用-DSL语句

      商品检索页面我们放在search服务中处理,首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖 然后我们拷贝模板文件到template目录下,然后不要忘记添加Thymeleaf的名称空间 需要把相关的静态资源文件拷贝到Nginx服务中。目录结构是:/mydata/nginx/html/static/search/ 我们

    2024年02月10日
    浏览(57)
  • Elasticsearch 全文检索 分词检索-Elasticsearch文章四

    https://www.elastic.co/guide/en/enterprise-search/current/start.html https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-match-query.html Full text Query中,我们只需要把如下的那么多点分为3大类,你的体系能力会大大提升 很多api都可以查得到,我们只要大概知道有支持哪些功能 Elasticsearch 执行

    2024年02月14日
    浏览(53)
  • 全文检索-Elasticsearch-进阶检索

    本文记录谷粒商城高级篇的 Elasticsearch 进阶检索部分,续上之前记录的 Elasticsearch入门篇。 ES 支持两种基本方式检索 : 一个是通过使用 REST request URI 发送搜索参数(uri + 检索参数) 另一个是通过使用 REST request body 来发送它们(uri + 请求体) 请求体中写查询条件,语法: 示例

    2024年02月03日
    浏览(89)
  • Elasticsearch 8.X 向量检索和普通检索能否实现组合检索?如何实现?

    向量组合条件查询,报 [vector] malformed query, expected [END_OBJECT] but found [FIELD_NAME] 错误, 向量查询是不支持复合条件查询吗? ——问题来自:死磕 Elasticsearch 知识星球 https://t.zsxq.com/18skX0ZS6 类似问题在社群里被问到 2 次以上了! 向量搜索热度不减,所以我们非常有必要将向量搜

    2024年04月11日
    浏览(47)
  • 服务器-Kubernetes (K8S)单机部署实战 -- 001

         本篇博文是 centos 7 系统安装 kubernetes 单机 master 节点操作。 一: 查看 服务器 配置信息       1. 执行命令查看服务器cpu信息。安装 kubernetes 服务,cpu核心数必须大于2,内存大于2G。       2.  修改服务器设置信息,避免安装出现问题。         a.  临时关闭swap,防止

    2024年02月19日
    浏览(58)
  • 使用 Elasticsearch 和 LlamaIndex 进行高级文本检索:句子窗口检索

    2023 年是检索增强生成 (RAG) 的一年,人们探索了许多用例,并使用该技术开发了数百种产品。 从 Q/A 聊天机器人到基于上下文的代理,RAG 的使用一直是 LLM 申请快速增长的主要因素。 支持不断发展的社区以及 Langchain 和 LlamaIndex 等强大框架的可用性,使开发人员可以更轻松地

    2024年01月18日
    浏览(42)
  • Elasticsearch性能调优

    centos系统默认的是1024个文件句柄。如果文件句柄用完了,这就意味着操作系统会拒绝连接,意味着数据可能丢失,在ElasticSearch大量请求的情况下,1024个文件句柄数量是不够的,可以改成655360。 内存交换到磁盘对服务器性能来说是致命的。 内核参数vm.swappiness控制换出运行时

    2023年04月09日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包