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

3.3 使用编解码器

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

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

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

现在,执行下面的命令:

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

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文件中):

如你所见,我们已经更改了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文件中):

https://yqfile.alicdn.com/643e63a77e8c5f42fe4bba349e61c4691aa70e2d.png" >

时间: 2024-10-07 13:17:13

《深入理解ElasticSearch》——3.3 使用编解码器的相关文章

《深入理解ElasticSearch》——导读

前 言 Preface 欢迎来到ElasticSearch的世界.通过阅读本书,我们将带你接触与ElasticSearch紧密相关的各种话题.本书会从介绍Apache Lucene及ElasticSearch的基本概念开始.即使读者熟悉这些知识,简略的介绍也是很有必要的,掌握背景知识对于全面理解集群构建.索引文档.搜索这些操作背后到底发生了什么至关重要. 之后,读者将学习Lucene的评分过程是如何工作的,如何影响评分,以及如何让ElasticSearch选择不同的评分算法.本书也将介绍什么是查

《深入理解Elasticsearch(原书第2版)》一导读

前 言 欢迎来到Elasticsearch的世界并阅读本书第2版.通过阅读本书,我们将带领你接触与Elasticsearch紧密相关的各种话题.请注意,本书不是为初学者写的.笔者将本书作为<Elasticsearch Server, Second Edition>的续作和姊妹篇.相对于<Elasticsearch Server>,本书涵盖了很多新知识,不过你偶尔也可以在本书中发现一些引自<Elasticsearch Server>的内容. 本书将探讨与Elasticse

《深入理解Elasticsearch(原书第2版)》一第1章Elasticsearch简介1.1 Apache Lucene简介

第1章 Elasticsearch简介 我们希望读者通过阅读本书来获取和拓展关于Elasticsearch的基本知识.假设读者已经知道如何使用Elasticsearch进行单次或批量索引创建,如何发送请求检索感兴趣的文档,如何使用过滤器缩减检索返回文档的数量,以及使用切面/聚合(faceting/aggregation)机制来计算数据的一些统计量.不过,在接触Elasticsearch提供的各种令人激动的功能之前,希望读者能对Apache Lucene有一个快速的了解,因为Elasticsear

《深入理解ElasticSearch》——第1章1.1 Apache Lucene简介

第1章 ElasticSearch简介我们希望读者通过阅读本书能获取和拓展关于ElasticSearch的基本知识,并假设读者已经知道如何使用ElasticSearch进行单次或批量索引创建,如何发送请求检索感兴趣的文档,如何使用过滤器缩减检索返回文档的数量,以及使用切面/聚合(faceting/aggregation)机制来计算数据的一些统计量.不过,在接触ElasticSearch提供的各种令人激动的功能之前,仍然希望读者能对Apache Lucene有一个快速了解,因为ElasticSea

《深入理解ElasticSearch》——2.9 小结

2.9 小结 在本章中,我们了解了Apache Lucene是如何工作的,查询改写是什么,如何使用二次评分影响文档的评分.接下来,了解了如何在一个HTTP请求中发送多个查询和实时读取请求,以及如何对包含多值字段和嵌套文档的数据进行排序.另外,还介绍了数据更新 API和使用过滤器来优化查询的方法.最后,学习了如何使用过滤器和作用域来缩减或扩大切面计算返回的文档集.下一章中,我们将学习如何选择不同的评分公式,以及在索引期选择不同的倒排索引格式(postings format),了解多语言数据处理和事

《深入理解Elasticsearch(原书第2版)》——第1章 Elasticsearch简介 1.1 Apache Lucene简介

第1章 Elasticsearch简介 我们希望读者通过阅读本书来获取和拓展关于Elasticsearch的基本知识.假设读者已经知道如何使用Elasticsearch进行单次或批量索引创建,如何发送请求检索感兴趣的文档,如何使用过滤器缩减检索返回文档的数量,以及使用切面/聚合(faceting/aggregation)机制来计算数据的一些统计量.不过,在接触Elasticsearch提供的各种令人激动的功能之前,希望读者能对Apache Lucene有一个快速的了解,因为Elasticsear

【技术分享】《深入理解Elasticsearch》读书笔记

题记 由于之前已经梳理过Elasticsearch基础概念且在项目中实战过Elasticsearch的增删改查.聚类.排序等相关操作,对Elasticsearch算是有了一定的认知.但是,仍然对于一些底层的原理认知模糊,特买来<深入理解Elasticsearch>过了一遍,第一章到第四章偏应用,跟着敲一遍代码基本就能理解原理,第五章到第九章偏理论.现将书中一些细节知识点结合官网文档梳理如下. 第五章 分布式索引架构 如何选择合适的分片和副本数? 目的:规划索引及配置,适应应用的变化. 正确认知

《深入理解Elasticsearch(原书第2版)》——第2章 查询DSL进阶 2.1 Apache Lucene默认评分公式解释

第2章 查询DSL进阶 在上一章,我们了解了什么是Apache Lucene,它的整体架构,以及文本分析过程是如何完成的.之后,我们还介绍了Lucene的查询语言及其用法.除此之外,我们也讨论了Elasticsearch,讨论了它的架构,以及一些核心概念.在本章,我们将深入研究Elasticsearch的查询DSL(Domain Specific Language).在了解那些高级查询之前,我们将先了解Lucene评分公式的工作原理.到本章结束,将涵盖以下内容: Lucene默认评分公式是如何工

《深入理解Elasticsearch(原书第2版)》一第2章查询DSL进阶2.1 Apache Lucene默认评分公式解释

第2章 查询DSL进阶 在上一章,我们了解了什么是Apache Lucene,它的整体架构,以及文本分析过程是如何完成的.之后,我们还介绍了Lucene的查询语言及其用法.除此之外,我们也讨论了Elasticsearch,讨论了它的架构,以及一些核心概念.在本章,我们将深入研究Elasticsearch的查询DSL(Domain Specific Language).在了解那些高级查询之前,我们将先了解Lucene评分公式的工作原理.到本章结束,将涵盖以下内容: Lucene默认评分公式是如何工