资讯专栏INFORMATION COLUMN

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

wenzi / 948人阅读

摘要:本系列教程旨在更进一步讨论针对及以上版本的搜索调优技术策略及建议。强制合并只读索引只读索引在合并为单一的段后将会非常受益。强制合并操作支持通过合并来减少段数量。该调用在合并完成之前将会处于阻塞状态。

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

目录

预索引数据

映射

避免使用脚本

强制合并只读索引

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 代码而言有着更好的性能表现;其性能相对其他脚本引擎有更低的单文档成本:表达式更加“领先”。

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

语法

表达式支持一个 javascript 语法子集:一个多带带的表达式。参见表达式模块的文档,了解支持的操作符和函数。

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

文档字段,比如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/_forcemer
ge?pretty"

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

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

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

flush - 强制合并后是否执行 flush,默认为 true

更多内容敬请关注 vivo 互联网技术 微信公众号

 

注:转载文章请先与微信号:labs2020 联系。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/34522.html

相关文章

  • Elasticsearch搜索调优权威指南 (1/3

    摘要:设置过大的堆内存,换来的是更长的时间这种过多的停顿非常危险,因为可能导致集群误认为该节点网络异常而失联。尽可能使用本地存储,避免使用像或之类的远程或网络文件系统,也要注意像这样的虚拟化存储。 本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/qwkZKLb_ghmlwrqMkqlb7Q 英文原文:https://qbox.io/blog...

    hedge_hog 评论0 收藏0
  • Elasticsearch,为了搜索

    摘要:为了方便调试,可以修改文件,加入以下两行安装中文分词插件原装分词器会简单地拆分每个汉字,没有根据词库来分词,这样的后果就是搜索结果很可能不是你想要的。原文链接参考资料权威指南为你的站点插上的翅膀安裝中文分詞中的简介使用实现博客站内搜索 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、...

    mindwind 评论0 收藏0
  • Elasticsearch,为了搜索

    摘要:为了方便调试,可以修改文件,加入以下两行安装中文分词插件原装分词器会简单地拆分每个汉字,没有根据词库来分词,这样的后果就是搜索结果很可能不是你想要的。原文链接参考资料权威指南为你的站点插上的翅膀安裝中文分詞中的简介使用实现博客站内搜索 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、...

    lijy91 评论0 收藏0
  • 渣渣为什么要看 ElasticSearch 源码?

    摘要:当时自己在本地测试搭建集群后,给分配了另外一个任务就是去了解中的自带分词英文分词中文分词的相同与差异以及自己建立分词需要注意的点。还有就是官网的文档了,非常非常详细,还有,版本的是有中文的官方文档,可以凑合着看。 前提 人工智能、大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需,大型企业早已淹没在系统生成的浩瀚数据流当中。大数据技术业已集中在如何存储和处理这...

    Cciradih 评论0 收藏0
  • 渣渣为什么要看 ElasticSearch 源码?

    摘要:当时自己在本地测试搭建集群后,给分配了另外一个任务就是去了解中的自带分词英文分词中文分词的相同与差异以及自己建立分词需要注意的点。还有就是官网的文档了,非常非常详细,还有,版本的是有中文的官方文档,可以凑合着看。 前提 人工智能、大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需,大型企业早已淹没在系统生成的浩瀚数据流当中。大数据技术业已集中在如何存储和处理这...

    rockswang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<