ElasticSearch搜索匹配度得分算法

ElasticSearch使用实用评分函数(practical scoring function)的公式来计算搜索相关度,这个公式借鉴了词频/逆向文档频率(term frequency/inverse document frequency)和向量空间模型(vector space model)

规则总结:

  • 越多罕见的词项被匹配上,文档得分越高
  • 文档字段越短(文档字数较少),文档得分越高
  • 权重越高,文档得分越高

$$
\operatorname{score}(q, d)=\operatorname{coord}(q, d) \cdot q u e r y N o r m(q) \cdot \sum_{t \text { in } q}\left(t f(t \text { in } d) \cdot i d f(t)^{2} \cdot t.getBoost() \cdot \operatorname{norm}(t,d)\right.)
$$

  • score(q,d) 是文档 d 与查询 q 的相关度评分。

  • queryNorm(q)查询归一化* 因子

  • coord(q,d)协调 因子

  • $$
    \sum_{t \text { in } q}
    $$

    查询 q 中每个词 t 对于文档 d 的权重和

  • tf(t in d) 是词 t 在文档 d 中的 词频

  • idf(t) 是词 t逆向文档频率

  • t.getBoost() 是查询中使用的 boost

  • norm(t,d)字段长度归一值,与 索引时字段层 boost

1. queryNorm(q)查询归一因子:

查询归一因子queryNorm )试图将查询 归一化 , 这样就能将两个不同的查询结果相比较

1
queryNorm = 1 / √sumOfSquaredWeights
  • sumOfSquaredWeights 是查询里每个词的 IDF 的平方和。

2. coord(q,d)查询协调因子

$$
\operatorname{coord}(q, d)=\frac{\text {overlap}}{\text {max} \text {Overlap}}
$$

  • maxOverLap是Query中有效的term数
  • overlap是文档中出现的term数

协调因子coord ) 可以为那些查询词包含度高的文档提供奖励,文档里出现的查询词越多,它越有机会成为好的匹配结果

设想查询 quick brown fox ,每个词的权重都是 1.5 。如果没有协调因子,最终评分会是文档里所有词权重的总和。例如:

  • 文档里有 fox → 评分: 1.5
  • 文档里有 quick fox → 评分: 3.0
  • 文档里有 quick brown fox → 评分: 4.5

协调因子将评分与文档里匹配词的数量相乘,然后除以查询里所有词的数量,如果使用协调因子,评分会变成:

  • 文档里有 fox → 评分: 1.5 * 1 / 3 = 0.5
  • 文档里有 quick fox → 评分: 3.0 * 2 / 3 = 2.0
  • 文档里有 quick brown fox → 评分: 4.5 * 3 / 3 = 4.5

3. tf词频

词在文档中出现的频度是多少? 频度越高,权重 越高 。 5 次提到同一词的字段比只提到 1 次的更相关。词频的计算方式如下:
$$
t f(t \text { in } d)=\sqrt{\text { frequency }}
$$

  • t 在文档 d 的词频( tf )是该词在文档中出现次数的平方根。

4. idf逆向文档频率

$$
i d f(t)=1+\log \left(\frac{d o c C o u n t+1}{d o c F r e q+1}\right)
$$

  • t 的逆向文档频率( idf )是:索引中文档数量除以所有包含该词的文档数,然后求其对数

5. norm字段长度归一化

$$
norm(d)=\frac{1}{\sqrt{\text { frequency }}}
$$

  • 字段长度归一值( norm )是字段中词数平方根的倒数。