ES 单字段搜索相关度排序
2024-3-22
| 2024-9-29
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
使用 Es 搜索,发现搜索结果关键词命中数 3 的文档排在关键词命中数 20 的前面,想让 Es 搜索结果安装关键词命中数排序。
 

Es 默认相关性算法

Es 5.0 之前,默认的相关性算分采用的是 TF-IDF,而之后则默认采用 BM25
用 Es 的 explain 查询可以看到详细的算分过程:
输出:
文档分数 = boost \* idf \* tf idf = log(1 + (N - n + 0.5) / (n + 0.5)) tf = freq / (freq + k1 \* (1 - b + b \* dl / avgdl))
变量
解释
boost
权重分数,这个可以在查询语句中传入
idf
逆文档率 = log(1 + (N - n + 0.5) / (n + 0.5))<br><br>N - 总的文档数<br>n - 出现“联合”一次的文档数。
tf
词频 = freq / (freq + k1 \* (1 - b + b \* dl / avgdl)) <br><br>freq - 搜索词在该文档出现的次数<br>k1 - 控制词频影响的重要程度,默认值 1.2<br>b - 控制对大长文本字段的惩罚程度,默认值 0.75<br>dl - 该文档中检索字段的长度<br>avgdl - 检索字段的平均长度。

BM25 调参

调整方式,只能在创建索引的时候调整,无法动态调整。 创建自定义的 custom_similarity,参数 b 的值设置为 0,k1 保持默认的 1.2,当 b = 0 时,tf 公式就变成了 freq / (freq + k1),tf 分数完全忽略文本长度的影响。
但是 idf 中 的 N 和 n 取决于搜索词和数据,无法修改,只能调 tf 的整参数 b 和 k1,无法完全消除文本长度对相关性的影响。

自定义 similarity 算法

建立索引,自定义 similarity:
导入一些数据:
搜索测试:
搜索结果:
可以使用的值已经在上面的 description 里面列举出来。

参考文档

Relate Posts :
  • ES
  • BM25
  • TF
  • IDF
  • ES 数据导入之 logstashDM 数据复制
    Loading...