本节书摘来自华章计算机《深入理解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文件中):
编解码器需要逐字段配置。为了配置某个字段使用特定的编解码器,需要在字段配置文件中添加一个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" >