千家信息网

Elasticsearch搜索调优权威指南 (2/3)

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本文首发于 vivo互联网技术 微信公众号英文原文:https://qbox.io/blog/elasticsearch-search-tuning-part-2作者:Adam Vanderbush译
千家信息网最后更新 2026年11月03日Elasticsearch搜索调优权威指南 (2/3)

本文首发于 vivo互联网技术 微信公众号
英文原文:https://qbox.io/blog/elasticsearch-search-tuning-part-2
作者:Adam Vanderbush
译者:杨振涛

目录

  1. 预索引数据
  2. 映射
  3. 避免使用脚本
  4. 强制合并只读索引

Elasticsearch搜索调优权威指南,是QBOX在其博客上发布的系列文章之一,本文是该系列的第二篇,主要介绍了索引预处理、mapping建立、避免脚本的使用、索引段合并等搜索性能相关的调优方法。

本文是Elasticsearch搜索调优系列文章3篇中的第2篇,第1篇参考这里(点击)。本系列教程旨在更进一步讨论针对Elasticsearch 5.0及以上版本的搜索调优技术、策略及建议。

1.预索引数据

为了优化数据的索引方式,应当在查询中预置一些模式。比如,如果所有文档都有一个叫 price 的价格字段,并且大部分查询在一个固定范围列表上执行 range 聚合,那么就可以通过预索引范围到索引中并使用一个 terms 聚合,来加速该聚合。

比如有如下文档:

curl -XPUT 'ES_HOST:ES_PORT/index/type/1?pretty' -H 'Content-Type: application/json' -d '{ "designation": "bowl", "price": 13}'

以及如下搜索请求:

curl -XGET 'ES_HOST:ES_PORT/index/_search?pretty' -H 'Content-Type: application/json' -d '{ "aggs": {   "price_ranges": {     "range": {       "field": "price",       "ranges": [         { "to": 10 },         { "from": 10, "to": 100 },         { "from": 100 }       ]     }   } }}'

然后就可以在索引阶段增加一个 price_range 字段,该字段应该映射为一个关键字:

curl -XPUT 'ES_HOST:ES_PORT/index?pretty' -H 'Content-Type: application/json' -d '{ "mappings": {   "type": {     "properties": {       "price_range": {         "type": "keyword"       }     }   } }}'curl -XPUT 'ES_HOST:ES_PORT/index/type/1?pretty' -H 'Content-Type: application/json' -d '{ "designation": "bowl", "price": 13, "price_range": "10-100"}'

接下来搜索请求就能聚合这个新的字段,而不是在 price 字段上执行一个范围聚合。

curl -XGET 'ES_HOST:ES_PORT/index/_search?pretty' -H 'Content-Type: application/json' -d '{ "aggs": {   "price_ranges": {     "terms": {       "field": "price_range"     }   } }}'

2.映射

事实上,一些数值型的数据,并不意味着总是要被映射为一个数值型字段。典型的,那些存储为诸如 ISBN 之类的标识符,或者任何标识另一个数据库中记录的数字的字段,可能映射为关键字比映射为一个 integer 或 long 类型更好。

关键字类型用于索引结构化内容,比如 email 地址、主机名称、状态码、邮政编码或标签。

典型地用于过滤(比如查找所有已发布的博客文章)、排序以及聚合。关键字字段只可通过其精确值搜索得到。

如果需要索引全文内容比如 email 内容或产品描述,可能就要使用一个文本字段。

下面是一个关键字字段映射的示例:

curl -XPUT 'ES_HOST:ES_PORT/my_index?pretty' -H 'Content-Type: application/json' -d '{ "mappings": {   "my_type": {     "properties": {       "tags": {         "type":  "keyword"       }     }   } }}'

从 2.x 版本导入的索引是不支持关键字的;相反,它们会试图把 keyword 类型降级为 string 类型。这支持合并新的映射和旧的映射。长期存在的索引,必须在升级到6.x 版本前重建,但是映射降级提供了按自己的计划实施重建的机会。

3.避免使用脚本

一般来说要尽量避免使用脚本;如果必须要使用,优先选择 Painless 和表达式引擎。

Painless 是一门简单安全的脚本语言,专门为在 Elasticsearch 中使用而设计,是 Elasticsearch 的默认脚本语言,可安全地用于内联和存储脚本。关于 Painless 语法和语言特性的更详细描述,请参考 Painless 语言规范。

请参考 " Painless Scripting in Elasticsearch " 更深入地了解 Painless 脚本语言指南。

  • Lucene 表达式语言

Lucene 表达式会把一个 javascript 表达式编译为字节码,设计用于高性能自定义评级和排序函数,并支持 inline 和默认的存储脚本。

  • 性能

表达式相对于自定义 Lucene 代码而言,有着更好的性能表现;其性能相对其他脚本引擎有更低的单文档成本:表达式更加"领先"。

这就允许非常快的执行,尤其是比自己写的本地脚本快很多。

  • 语法

表达式支持一个 ja**vascript** 语法子集:一个单独的表达式。参见表达式模块的文档,了解支持的操作符和函数。

表达式脚本中可访问的变量有:

  • 文档字段,比如doc['myfield'].value

  • 字段所支持的变量和方法,比如doc['myfield'].empty

  • 传递到脚本里的参数,比如mymodifier

  • 当前文档得分,_score(仅在 script_score中使用时有效)

表达式脚本可以用于script_score、script_fields、排序脚本以及数值型聚合脚本,只要简单地设置参数到表达式中即可。

4.强制合并只读索引

只读索引在合并为单一的段后将会非常受益。典型的情况是基于时间的索引:只有当前时间窗的索引会成为新文档,同时旧索引成为只读。

强制合并 API 支持通过 API 强制合并一个或更多的索引。合并与每个分片中 Lucene索引的段数量有关。强制合并操作支持通过合并来减少段数量。

该调用在合并完成之前将会处于阻塞状态。如果 http 连接断掉,请求将在后台继续,在前一个强制合并完成之前,所有新请求将会阻塞。

curl _XPOST 'ES_HOST:ES_POST/twitter/_forcemerge?pretty'

强制合并 API 接受下列请求参数:

  • max_num_segments - 待合并的段数量。要完全合并索引,可设置为 1 。默认会简单检查一个合并是否需要执行,如果是,就会执行。

  • only_expunge_deletes -合并流程是否仅仅擦除包含删除的段。在 Lucene 中,一个文档并不会从一个段直接删除,只是标记为删除。在一个段合并的过程中,一个新的段可能会被创建,这个新的段并不包含那些删除。这个标记参数支持只合并有删除的段,且默认为false。注意,这并不会重写阈值 index.merge.policy.expunge_deletes_allowed。

  • flush - 强制合并后是否执行 flush,默认为 true。
索引 脚本 字段 表达式 支持 文档 强制 搜索 关键 关键字 语言 数据 参数 性能 类型 典型 内容 数值 数量 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 深圳九邦互联网科技有限公司 华服互联网科技怎么样 广州百单互联网科技有限公司 疫情对互联网科技公司影响 宜安科技 互联网金融 互联网养老 桔豆科技 左右互联网络科技 中国科技互联网公司收入 互联网对科技的发展 重庆互联网医院沙龙医盟信息科技 搜狐科技互联网 国大互联网教育科技有限公司薪资 互联网领先科技宣传片 半导体是互联网高科技吗 云鲸互联网络科技有限公司 互联网金融运营模式中的金融科技 西安左小互联网科技有限公司 数字互联网科技有限公司 网互联网络科技 互联网与未来科技 世界互联网领先科技成果 科技互联网公司logo 融贸通互联网科技 新华互联网科技2019 南通创西澳互联网科技有限公司 中天科技中国工业互联网 互联网科技平台产品运营 广西科技产业互联网是什么 北京军民互联网科技公司
0