绊脚石乃是进身之阶。

elasticsearch搜索评分调整

Elasticsearch | 作者 FYYPL | 发布于2021年10月06日 | 阅读数:1547

搜索关键词:“计算机”
文档 一的标题:“计算机”
文档二得标题:“计算机与计算机的组成”
现在搜索结果是第二个在前,我想让第一个在前,怎么办?
就是文档标题直接是搜索的关键词的话,将其放在前面,后面再考虑出现的次数。
已邀请:

caster_QL

赞同来自: FYYPL

存个子字段为keyword类型,然后用function_score进行term过滤满足你的需求么?
POST /caster3/_search
{
"query": {
"function_score": {
"query": {
"match": {
"text": "计算机"
}
},
"boost": "1",
"functions": [
{
"filter": {
"term": {
"text.keyword": "计算机"
}
},
"weight": 2
}
]
}
}
}

这样查询结果如下:
{
"_index" : "caster3",
"_type" : "_doc",
"_id" : "dTG3WHwBSCW7lcY4Wmjr",
"_score" : 2.8553414,
"_source" : {
"text" : "计算机"
}
},
{
"_index" : "caster3",
"_type" : "_doc",
"_id" : "gjG3WHwBSCW7lcY4S2dH",
"_score" : 1.2958856,
"_source" : {
"text" : "计算机与计算机的组成"
}
}
另外我这面 7.x 版本,查询计算机分数要比计算机与计算机的组成要高:
{
"_index" : "caster3",
"_type" : "_doc",
"_id" : "dTG3WHwBSCW7lcY4Wmjr",
"_score" : 1.4276707,
"_source" : {
"text" : "计算机"
}
},
{
"_index" : "caster3",
"_type" : "_doc",
"_id" : "gjG3WHwBSCW7lcY4S2dH",
"_score" : 1.2958856,
"_source" : {
"text" : "计算机与计算机的组成"
}
}

FFFrp

赞同来自:

词频在这种场景下确实有点影响,1楼的话如果文档一是”计算机与“搜计算机就不生效了,之前我们的做法是修改lucene的打分公式,忽略词频对打分的影响

FYYPL

赞同来自:

目前调整了下,才发现搜索时的norms设置为了false,改为true,这样就会考虑字段长度对相关性的影响,是false时不考虑。但还是有一些例外情况,如果两个文档字段长度相差不大,一个是“计算机”,一个是“计算机组成”,但不在同一个分片上,打分时那些参数如总文档数,包含搜索词的文档数都是在每个分片上计算的,不是所有分片合起来总的来算,这样就有可能使“计算机组成”排在前面,我的想法是调整里面的参数b(默认是0.75),改为0.8、0.85等等之类,放大字段长度的影响,但找了很久,目前来看,好像改不了?

要回复问题请先登录注册