ElasticSearch--Lucene是怎么计算相关度的

来源:互联网 发布:php require use 编辑:程序博客网 时间:2024/04/27 01:10

话不多说,直接上公式
这里写图片描述
公式说明:

  1. score(q,d)是文档 d 和查询 q 之间的相关度
  2. queryNorm(q)是查询正则化因子 %
  3. coord(q,d)是coordination factor %
  4. 对在查询字符串q中的每个单词t在文档d中的权重求和
  5. 词频,单词t在文档d中的词频
  6. t的idf
  7. t.getBoost()是一个权重的提升权重%
  8. norm(t,d) 是filed-length norm %

其中socre tf idf 是我们已经讲过的。 queryNorm、coord、boost和norm 是没讲过的。

Query Normalization Factor

Query normalization 因子是一个想要正则化查询,这样让我们可以比较不同查询之间的相关度(但其实效果并不好).
这个因子在访问的开始被计算,而实际的计算依赖于查询,一个典型的实现是
这里写图片描述
sumOfSquaredWeights 是把所有单词的IDF加起来然后开根号

Query Coordination

coordination 因子是想要对含有高比例的访问单词一个相关度奖励。越多的访问单词出现在文档中,越意味着高的相关度。 例如我们有一个query:quick brown fox, 并且每个单词的权重是1.5。如果没有coordination 因子,相关度会仅仅是单词权重的求和。例如:
文档fox -> score:1.5
文档quick fox -> socre:3.0
文档 quick brown fox -> socre:4.5
coordination因子将score乘以匹配单词的数量再除以总共访问单词的数量。用了coodination因子后:
文档fox: socre:1.5*1/3 = 0.5
文档quick fox: score:3.0*2/3 = 2.0
文档 quick brown fox -> socre:4.5*3/3 = 4.5
可以看出来这样子导致含有所有访问单词的文档拥有更高的相关度

bool 查询默认使用coordination。但是也我们也可以关闭这个功能。
coordination是一个好东西,但是在某些高端点的场景中,我们需要关闭这个功能,例如搜索jump、leap和hop这些词的时候。我们不关系有多少近义词的呈现,因为它代表相近的意思。

Index-Time Filed-Level Boosting

在查询的时候我们可能想提高某个filed的权重,
下边有三点建议:

  1. 将boost和filed-length norm一起用
  2. 若要修改index-time boost, 则不需重新索引所有的文档。而query-time boost, 则不需要,可以在任何时候都修改
  3. 如果一个filed在index-time boost有好几个值,会极大的提高这个filed的权重
    Query-time boosting is a much simpler, cleaner, more flexible option.
1 0