ElasticSearch Score

相关性算分算法

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 会产生额外的网络开销.

https://www.elastic.co/cn/blog/practical-bm25-part-1-how-shards-affect-relevance-scoring-in-elasticsearch

你可能感兴趣的:(ElasticSearch Score)