话不多说,直接上公式 公式说明:
score(q,d)是文档 d 和查询 q 之间的相关度queryNorm(q)是查询正则化因子 %coord(q,d)是coordination factor %对在查询字符串q中的每个单词t在文档d中的权重求和词频,单词t在文档d中的词频t的idft.getBoost()是一个权重的提升权重%norm(t,d) 是filed-length norm %其中socre tf idf 是我们已经讲过的。 queryNorm、coord、boost和norm 是没讲过的。
Query normalization 因子是一个想要正则化查询,这样让我们可以比较不同查询之间的相关度(但其实效果并不好). 这个因子在访问的开始被计算,而实际的计算依赖于查询,一个典型的实现是 sumOfSquaredWeights 是把所有单词的IDF加起来然后开根号
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这些词的时候。我们不关系有多少近义词的呈现,因为它代表相近的意思。
在查询的时候我们可能想提高某个filed的权重, 下边有三点建议:
将boost和filed-length norm一起用若要修改index-time boost, 则不需重新索引所有的文档。而query-time boost, 则不需要,可以在任何时候都修改如果一个filed在index-time boost有好几个值,会极大的提高这个filed的权重 Query-time boosting is a much simpler, cleaner, more flexible option.