相关性算分算法
TF-IDF => BM25
TF: Term Frequency, 词频, Term 的出现次数➗文档总字数
TF 反应该词在当前语境下(本文档)的重要程度, 词频越高, 越重要.
IDF: Inverse Document Frequency, 逆文档频率, log(doc 总数➗出现该 Term 的 doc 数)
一个词在总文档中出现的少, 说明它的含义明确, IDF 值就越大. 也就是说, 一个词越明确, 该词的 IDF 越大. 所以 IDF 可以当成权重值使用.
TF-IDF即每个 Term 的 TF * IDF 的加和, TF-IDF 越大, 相关性越高.
BM25 的优势: 当 TF 很大时, BM25 趋于平缓.
Bool 查询
选项 | 贡献算分 |
---|---|
must | 必选, 参与算分 |
should | 存在一个, 参与算分 |
must_not | 排除, 不算分 |
filter | 过滤, 不算分 |
bool 查询可以嵌套, 内层多个条件的影响力跟外层一个条件的影响力相当.
boost
用来动态调整影响因子:
- boost < 0, 负影响
- 0 < boost < 1, 拉低权重
- boost > 1, 提升权重
多 Shards 算分不一致问题
默认情况下, 各个分片上的算分是独立计算的, 这就导致算分不一致问题.
解决方法:
- 等数据量大了, 就差别不大了;
- 设置分片数为 1;
- 指定参数
dfs_query_then_fetch
, 要求词频从全索引计算
DFS: Distributed Frequency Search.
前两个方法看起来都不算是方法. 第三个虽然解决问题, 但为什么不是默认参数呢.
主要考虑是打分一般都并不需要这么精准, 相对于准确一致的算分, 执行效率会更重要, 因为 dfs_query_then_fetch
会产生额外的网络开销.