本文主要对Elasticsearch中查询相关的知识做一个简单的总结,内容主要包括查询的评分机制,查询改写,过滤器,以及对常见的查询做一个简单的分类
1. 评分机制
在Lucense中默认使用TF/IDF算法对文档进行评分,该算法已经在前文做了简单的介绍,这里主要总结下什么样的因素可能得到高分
1. 越罕见的词被匹配上,得分越高。
2. 文档字段越短(包含更少的词项),文档的得分越高
3. 权重越高(可以是索引期或是查询期赋予的权重),得分越高
Elasticsearch 提供的评分算法比较丰富(默认为BM25),可以通过similarity进行配置,可配置的项目包括:
1. BM25
2. Classic(基于TF/IDF)
3. DFR/DFI
4. IB
5. ….
关于每个算法的介绍以及可配置参数可以参见:https://www.elastic.co/guide/en/elasticsearch/reference/5.2/index-modules-similarity.html
另外需要注意的是除了使用similarity进行评分的控制之外,还可以通过function_score,constant_score,rescore 等多种机制对评分进行更加精确的控制。
2. 查询改写
在进行==前缀查询==或是==通配符查询==时,实际上会转化为对多个关键词的查询,处于性能优化的考虑,Lucene会把这种查询转化为一组开销较小的查询方式,采取的主要手段便是“查询改写(rewrite)”
查询改写使用的主要策略为通过使用常量得分查询(constant score query)来代替常规查询来减少查询时性能的开销,对于可能匹配term较多的查询时,性能提升尤为明显。
在查询改写的过程中可以根据需要自定义改写的方式,可支持的配置如下
- scoring_boolean:该选项将每个生成的词项转化为布尔查询中的一个或从句(Boolean should clause)。这种改写方法需要针对每个文档都计算得分。因此,这种方法比较耗费CPU,而且有些查询生成了太多的词项,以至于超出了布尔查询默认的1024个从句的限制。默认的布尔查询限制可以通过设置Elasticsearch.yml文件的index.query.bool.max_clause_count属性来修改。改写后的布尔查询的从句数越多,查询性能越低