gpt4 book ai didi

elasticsearch - ElasticSearch-使用脚本提高得分

转载 作者:行者123 更新时间:2023-12-03 00:48:26 24 4
gpt4 key购买 nike

我们为ElasticSearch实例提供了一个特定的用例:我们存储的文档包含专有名称,出生日期,地址,ID号以及其他相关信息。

我们使用一个名称匹配插件,该插件将覆盖ES的默认评分,并根据名称的匹配程度在0和1之间分配一个相关性得分。

如果其他字段匹配,我们需要做的就是将该分数提高一定数量。我已经开始阅读ES脚本来实现此目的。我需要查询脚本部分的帮助。现在,我们的查询如下所示:

{  
"size":100,
"query":{
"bool":{
"should":[
{"match":{"Name":"John Smith"}}
]
}
},
"rescore":{
"window_size":100,
"query":{
"rescore_query":{
"function_score":{
"doc_score":{
"fields":{
"Name":{"query_value":"John Smith"},
"DOB":{
"function":{
"function_score":{
"script_score":{
"script":{
"lang":"painless",
"params":{
"query_value":"01-01-1999"
},
"inline":"if **<HERE'S WHERE I NEED ASSISTANCE>**"
}
}
}
}
}
}
}
}
},
"query_weight":0.0,
"rescore_query_weight":1.0
}
}
Name字段始终是查询中所必需的,并且是得分的基础,该得分将在默认 _score字段中返回;为了便于演示,我们只添加一个额外的字段 DOB,如果匹配,应将分数提高0.1。我相信我正在寻找类似于 if(query_value == doc['DOB'].value add 0.1 to _score)的东西,或者类似于这些东西的东西。

那么,要实现此目的,应在 inline行中输入正确的语法是什么?或者,如果查询需要其他语法修订,请提出建议。

编辑#1-重要的是要突出显示我们的 DOB字段是 text字段,而不是 date字段。

最佳答案

假设每个其他字段均具有静态权重,则无需使用脚本即可完成此操作(尽管您可能需要使用script_score进行更复杂的加权)。要解决直接添加到文档原始分数的问题,您的评分查询将需要是一个功能分数查询,该查询应:

  • 在查询中为函数分数的主要shouldquery子句中的其他字段进行查询(即-仅会为与至少一个其他字段匹配的文档生成分数)
  • 在每个附加字段中使用一个函数,filter设置为选择具有该字段某些值的文档,并使用weight指定分数应增加多少(或根据需要使用其他评分函数)

  • 映射(作为模板)

    作为示例,添加一个 StateDOB字段(确保多个其他字段正确地影响得分)

    PUT _template/employee_template
    {
    "index_patterns": ["employee"],
    "settings": {
    "number_of_shards": 1
    },
    "mappings": {
    "_doc": {
    "properties": {
    "Name": {
    "type": "text"
    },
    "State": {
    "type": "keyword"
    },
    "DOB": {
    "type": "date"
    }
    }
    }
    }
    }

    样本数据

    POST /employee/_doc/_bulk
    {"index":{}}
    {"Name": "John Smith", "State": "NY", "DOB": "1970-01-01"}
    {"index":{}}
    {"Name": "John C. Reilly", "State": "CA", "DOB": "1965-05-24"}
    {"index":{}}
    {"Name": "Will Ferrell", "State": "FL", "DOB": "1967-07-16"}

    询问

    编辑:更新了查询,以将原始查询包括在新功能评分中,以尝试补偿自定义评分插件。

    有关以下查询的一些注意事项:
  • 此处设置rescorers score_mode: max实际上是一个replace,因为新计算的功能分数应仅大于或等于原始分数
  • query_weightrescore_query_weight都设置为1,以便在score_mode: max比较
  • 期间以相等的比例进行比较
  • function_score查询中:
  • score_mode: sumfunctions的所有分数加在一起
  • boost_mode: sumfunctions的总和加到query的分数中

  • POST /employee/_search
    {
    "size": 100,
    "query": {
    "bool": {
    "should": [
    {
    "match": {
    "Name": "John"
    }
    },
    {
    "match": {
    "Name": "Will"
    }
    }
    ]
    }
    },
    "rescore": {
    "window_size": 100,
    "query": {
    "rescore_query": {
    "function_score": {
    "query": {
    "bool": {
    "should": [
    {
    "match": {
    "Name": "John"
    }
    },
    {
    "match": {
    "Name": "Will"
    }
    }
    ],
    "filter": {
    "bool": {
    "should": [
    {
    "term": {
    "State": "CA"
    }
    },
    {
    "range": {
    "DOB": {
    "lte": "1968-01-01"
    }
    }
    }
    ]
    }
    }
    }
    },
    "functions": [
    {
    "filter": {
    "term": {
    "State": "CA"
    }
    },
    "weight": 0.1
    },
    {
    "filter": {
    "range": {
    "DOB": {
    "lte": "1968-01-01"
    }
    }
    },
    "weight": 0.3
    }
    ],
    "score_mode": "sum",
    "boost_mode": "sum"
    }
    },
    "score_mode": "max",
    "query_weight": 1,
    "rescore_query_weight": 1
    }
    }
    }

    关于elasticsearch - ElasticSearch-使用脚本提高得分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56972286/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com