本节书摘来自华章计算机《深入理解ElasticSearch》一书中的第3章,第3.1节,作者:[美] 拉斐尔·酷奇(Rafa Ku) 马雷克·罗戈任斯基(Marek Rogoziński)更多章节内容可以访问云栖社区“华章计算机”公众号查看。
第3章 底层索引控制
在上一章,我们了解了Apache Lucene如何为文档评分,什么是查询重写,如何利用ElasticSearch 0.90中的新特性,即二次评分来影响搜索返回文档的得分。同时我们也讨论了如何使用单个HTTP请求发送多个查询或准实时读取请求,以及如何对数据进行基于多值字段或嵌套文档的排序。除此之外,还介绍了如何使用数据更新 API以及如何通过使用过滤器优化查询。最后,我们介绍了如何通过使用过滤器和作用域来缩减或增加用于切面计算的文档数量。本章涵盖以下内容:
- 如何使用不同的评分公式及其特性。
- 如何使用不同的倒排表格式及其特性。
- 如何处理准实时搜索、实时读取,以及搜索器重新打开之后发生的动作。
- 深入理解多语言数据处理。
- 配置搜索事务日志以满足应用需求,并查看它对部署的影响。
- 段合并、各种索引合并策略和合并调度方式。
3.1 改变Apache Lucene的评分方式
自2012年Apache Lucene 4.0发布以后,用户便可以改变默认的基于TF/IDF的评分算法了,这是因为Lucene的API做了一些改变,使得用户能轻松地修改和扩展该评分公式。然而,这并不是Lucene在改变文档评分计算方面仅有的改进。Lucene 4.0提供了更多的相似度模型,从而允许我们采用不同的评分公式。本节中,我们将深入了解Lucene 4.0带来了哪些变化以及如何整合这些特性至ElasticSearch中。
3.1.1 可用的相似度模型
前面已经说过,Apache Lucene 4.0之前,除了最原始和默认的相似度模型以外,TF/IDF模型也是可用的。详细内容请参见2.1节。
而现在,又新增了以下三种相似度模型可供使用:
Okapi BM25模型:这是一种基于概率模型的相似度模型,可用于估算文档与给定查询匹配的概率。为了在ElasticSearch中使用它,你需要使用该模型的名字,BM25。一般来说,Okapi BM25模型在短文本文档上的效果最好,因为这种场景中重复词项对文档的总体得分损害较大。
随机偏离(Divergence from randomness)模型:这是一种基于同名概率模型的相似度模型。为了在ElasticSearch中使用它,你需要使用该模型的名字,DFR。一般来说,随机偏离模型在类似自然语言的文本上效果较好。
基于信息的(Information based)模型:这是最后一个新引入的相似度模型,与随机偏离模型类似。为了在ElasticSearch中使用它,你需要使用该模型的名字,IB。同样,IB模型也在类似自然语言的文本上拥有较好的效果。
前面提到的相似度模型所涉及的数学知识已经远远超出本书的讨论范围。如果想深入了解这些模型以及拓展相关知识,请参考http:// en.wikipedia.org/wiki/Okapi_BM25(Okapi BM25模型),以及http://terrier.org/docs/v3.5/dfr_description.html(随机偏离模型)。
3.1.2 为每字段配置相似度模型
自ElasticSearch 0.90以后,用户可以在映射中为每字段设置不同的相似度模型。例如,假设我们有下面这个映射,用于索引博客的回帖(该映射存储在posts_no_similarity.json文件中):
我们希望的是,在name字段和contents字段中使用BM25相似度模型。为了实现这个目的,我们需要扩展当前的字段定义,即添加similarity字段,并将该字段的值设置为相应的相似度模型的名字。修改后的映射(该映射存储在posts_similarity.json文件中)如下所示:
以上更改就足够了,并不需要额外的信息。经过前面的处理,Apache Lucene将在搜索期在name字段和contents字段上使用BM25相似度模型来计算文档得分。
对于随机偏离模型和基于信息的相似度模型,我们需要配置一些额外属性,用于控制这些相似度模型的行为。相关知识后面会详细讲述。