《深入理解ElasticSearch》——3.3 使用编解码器

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

本节书摘来自华章计算机《深入理解ElasticSearch》一书中的第3章,第3.3节,作者:[美] 拉斐尔·酷奇(Rafa Ku) 马雷克·罗戈任斯基(Marek Rogoziński)更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 使用编解码器

Lucene 4.0的另一个显著变化是允许用户改变索引文件编码方式。在此之前,只能通过修改Lucene内核代码来实现。而Lucene 4.0出现以后,这个不再是难题,它提供了灵活的索引方式,允许用户改变倒排索引的写入方式。
3.3.1 简单使用范例
读者也许会有疑问,这个功能真的有用吗?这个问题问得很好,为什么用户需要改变Lucene索引写入格式?理由之一是性能。某些字段需要特殊处理,如主键字段。相较于包含多个重复值的标准数值类型或文本类型而言,主键字段中的数值并不重复,只要借助一些技术,主键值就能被快速搜索到。用户还可以使用SimpleTextCodec来调试代码,以便了解到底是什么格式的数据写入了Lucene索引之中(请注意,编解码器是Lucene提供的功能,ElasticSearch并没有相应的接口)。

3.3.2 工作原理解释
假设posts索引有下面这个映射(该映射保存在posts.json文件中):


8e96202b0a764b9702e45341c04069d8a485cfe1

编解码器需要逐字段配置。为了配置某个字段使用特定的编解码器,需要在字段配置文件中添加一个postings_format属性,并将具体的编解码器所对应的属性值赋给它,例如pulsing。因此,我们需要对前面的映射文件进行修改(该映射保存在post_codec.json文件中),代码如下所示:

6247e91a51622ccb3287b7e0a2c73911625f412e

现在,执行下面的命令:

4b1f57a526d89dac8f3a74832d53d15a74a9d18b

检查该命令的执行结果,看看编解码器配置是否在ElasticSearch中生效,如下所示:

059394dc7f255fb89cd51955a8ec353adca4c43d


<a href=https://yqfile.alicdn.com/d04435cc7592bd4863c9f2c0fdc53c1832b3e2c7.png" >

正如我们所见,id字段的编解码器类型已经变成我们所期望的那样了。
因为编解码器在Lucene4.0以后才出现,所以ElasticSearch0.90之前的版本并不支持相关功能。
3.3.3 可用的倒排表格式
我们可以使用下面这些倒排表格式。
  • default:当没有显式配置时,倒排表使用该格式。该格式提供了存储字段(stored field)和词项向量压缩功能。如果想了解更多关于索引压缩的知识。
  • pulsing:该编解码器将高基(high cardinality)字段中的倒排表编码为词项数组,这会减少Lucene在搜索文档时的查找操作。使用该编解码器,可以提高在高基字段中的搜索速度。
  • direct:该编解码器在读索引阶段将词项载入词典,且词项在内存中为未压缩状态。该编解码器能提升常用字段的查询性能,但也需要谨慎使用,由于词项和倒排表数组都需要存储在内存中,从而导致它非常消耗内存。
    因为词项保存在byte数组中,所以每个索引段最多可以使用2.1GB的内存来存储这些词项。
  • memory:顾名思义,该编解码器将所有数据写入磁盘,而在读取时则使用FST(Finite State Transducers)结构直接将词项和倒排表载入内存。如果想了解更多FST相关信息。因为使用该编解码器时,数据都在内存中,因而它能加速常见词项的查询。
  • bloom_default:是default编解码器的一种扩展,即在default编解码器处理基础上又加入了bloom filter的处理,且bloom filter相关数据会写入磁盘中。当读入索引时,bloom filter相关数据会被读入内存,用于快速判断某个特定值是否存在。该编解码器在处理主键之类的高基字段时非常有用。
  • bloom_pulsing:它是pulsing编解码器的扩展,在pulsing编解码器处理基础上又加入了bloom filter的处理。

3.3.4 配置编解码器
默认配置中提供的倒排索引格式已足以应付大多数应用了,但偶尔还是需要定制倒排索引格式以满足具体的需求。这种情况下,ElasticSearch允许用户更改索引映射中的codec部分来配置编解码器。例如,我们想配置default编解码器,并且将其命名为custom_default,便可以通过定义下面这个映射来实现(该范例存储在posts_codec_custom.jsonfile文件中):


a18fad586b34d92c04f67cfbce38292dde338515

如你所见,我们已经更改了default编解码器的min_block_size和max_block_size参数值,并且将新配置的编解码器命名为custom_default。在这之后,我们对索引的name字段使用该倒排索引格式。

default编解码器属性
当使用default编解码器时,可以配置下面这些参数:

  • min_block_size:该参数确定了Lucene将词项词典(term dictionary)中的多个词项编码为块(block)时,块中的最小词项数。默认值为25。
  • max_block_size:该参数确定了Lucene将词项词典(term dictionary)中的多个词项编码为块(block)时,块中的最大词项数。默认值为48。

direct编解码器属性
当使用direct编解码器时,可以配置下面这些参数:

  • min_skip_count:该参数确定了允许写入跳表(skip list)指针的具有相同前缀的词项的最小数量。默认值为8。
  • low_freq_cutoff:编解码器使用单个数组对象来存储那些文档频率(document frequence)低于该参数值的词项的倒排链及位置信息。默认值为32。
    memory编解码器属性

当使用memory编解码器时,可以配置下面这些参数:

  • pack_fst:该参数为布尔类型,默认设置为false,用来确认保存倒排链的内存结构是否被打包为FST(Finite State Transducers)类型。而打包为FST类型能减少保存数据所需的内存量。
  • acceptable_overhead_ratio:该参数为浮点型,指定了内部结构的压缩率,默认值为0.2。当该参数值为0时,虽然没有额外的内存消耗,但是这种实现方式会导致较低的性能。当该参数值为0.5时,将会多付出50%的内存消耗,但是这种实现方式能提升性能。参数值超过1的设置也是可行的,只是会导致更多的内存开销。

pulsing编解码器属性
当使用pulsing编解码器时,除了可以设置default编解码器的那些参数,还有另外一个参数可供配置,请参考下面的描述:

  • freq_cut_off:该参数默认设置为1,是设置的一个文档频率阈值,若词项对应的文档频率小于等于该阈值,则将该词项的倒排链写入词典中。
  • 基于bloom filter的编解码器属性

如果要配置基于bloom filter的编解码器,可使用bloom_filter类型并设置下面这些属性:

  • delegate:该属性值用来确定将要被bloom filter包装(wrap)的编解码器。
  • ffp:该属性值介于0与1.0之间,用来确定期望的假阳率(false positive probability)。我们可以依据每个索引段中的文档数设置多个ffp值。例如,默认情况下,10k个文档时为0.01,1m个文档时为0.03。这种配置的含义是:当索引段中文档数大于10 000个时,ffp值使用0.01,而当文档数超过1 000 000时,ffp值使用0.03。

例如,我们想在direct编解码器上包装基于bloom filter的编解码器(范例存储在posts_bloom_custom.json文件中):


<a href=https://yqfile.alicdn.com/643e63a77e8c5f42fe4bba349e61c4691aa70e2d.png" >
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
7月前
|
存储 缓存 算法
ElasticSearch工作原理
ElasticSearch工作原理
57 0
|
8月前
|
存储 算法 数据可视化
ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash 1
ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash
53 0
|
8月前
|
消息中间件 监控 NoSQL
ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash 2
ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash
155 0
|
10月前
|
存储 JSON 运维
Elasticsearch的工作原理是什么?
Elasticsearch的工作原理是什么?
67 1
Elasticsearch的工作原理是什么?
|
JSON 数据可视化 搜索推荐
【Elasticsearch】介绍、使用、配置、中文分词器、Kibana(一)
【Elasticsearch】介绍、使用、配置、中文分词器、Kibana
151 0
【Elasticsearch】介绍、使用、配置、中文分词器、Kibana(一)
|
自然语言处理 Java Maven
【Elasticsearch】介绍、使用、配置、中文分词器、Kibana(二)
【Elasticsearch】介绍、使用、配置、中文分词器、Kibana
244 0
【Elasticsearch】介绍、使用、配置、中文分词器、Kibana(二)
|
存储 搜索推荐 安全
ElasticSearch 学习笔记(二)-----Elasticsearch的简介以及应用
接上一篇《ElasticSearch 学习笔记(一)-----Lucene的简介以及索引原理》,这一篇我们接着来学习ElasticSearch。我们将从分别介绍ElasticSearch的概念,工作原理,以及简单应用 。
217 0
ElasticSearch 学习笔记(二)-----Elasticsearch的简介以及应用
|
API 索引
【Elasticsearch】-配置分词器
Elasticsearch中的文本分析发生在以下两个时机,索引时 当文档被索引时,任何文本字段值都会被分析;搜索时 在文本字段上运行全文搜索时,会分析查询字符串。
708 0
|
存储 数据采集 JSON
Elasticsearch 的工作原理是什么?
Elasticsearch 的工作原理是什么?
158 0
|
JSON 数据格式 索引
Elasticsearch DSL
Elasticsearch 支持 JSON 格式的操作数据,它就是 DSL (Domain Specific Language),通过将查询的 DSL 看待成 AST (Abstract Syntax Tree),其中包括叶子查询子句(单一逻辑)及复合查询子句(组合逻辑)。
194 0
Elasticsearch DSL