概要
上一篇中多次提到了按相关性评分,本篇我们就来简单了解一下相关性评分的算法,以及正排索引排序的优势。
评分算法
Elasticsearch进行全文搜索时,Boolean Model是匹配的基础,先用boolean model将匹配的文档挑选出来,然后再运用评分函数计算相关度,参与的函数如我们提到的TF/IDF、Length Norm等,再加上一些控制权重的参数设置,得到最后的评分。
Boolean Model
作为全文搜索的基础,Boolean Model的结果决定文档是否要进行下一步的评分操作,使用AND、OR、NOT这种逻辑操作符来判断查找的文档,整个过程不评分,非常快速地将匹配的文档筛选出来。
由于Elastisearch各个版本相关度评分算法有异同,我们以6.3.1版本的BM25算法为准。
TFNORM/IDF
由Boolean Model之后得到的文档,我们开始计算文档的评分,每个文档的评分取决于每个关键词在文档中的权重,权重我们会从以下几个方面考虑:
TFNORM
即词频长度(Term Frequency Norm),单个term在文档中出现的频率,并结合字段长度,出现次数越高,字段长度越低,分越高,计算公式:
tfNorm(t in d) = (freq * (k1 1)) / (freq k1 * (1 - b b * fieldLength / avgFieldLength))
词t在文档d的词频(tf):freq表示出现频率,k1、b为ES参数,fieldLength为该字段长度,avgFieldLength为平均字段长度,公式了解一下即可。
IDF
即逆向文档频率(inversed document frequency),单个term在所有文档里出现的频率是多少?出现次数越高,分越低,计算公式:
idf(t) = log(1 (docCount - docFreq 0.5) / (docFreq 0.5))
词 t 的逆向文档频率(idf):索引中文档数量与该词的文档数比率,然后求其对数
例如:"and"、"the","的"、"了"、"呢"这种词在文档里到处都是,出现的频率特别高,反倒是不常出现的词"Elastic","成都"可以帮助我们快速缩小范围找到感兴趣的文档。
结果合并
一个term经过上面两个算法计算后,会得到两个不同的值,这两个得分相乘得到一个综合性的分数,这个分数就是最终的_score
我们用explain来看一下这个综合分数的详细信息:
搜索请求:
GET /music/children/_search
{
"explain": true,
"query": {
"term": {
"name": "teeth"