对于我的项目,我需要找出哪些搜索结果被认为是“好的”匹配。目前,分数因查询的不同而变化很大,因此需要以某种方式对其进行规范化。规范化分数将允许选择高于给定阈值的结果。我为Lucene找到了几个解决方案:
我该如何继续将同样的技术应用到ElasticSearch中呢?或者,也许已经有一个解决方案可以与ES一起工作来实现分数标准化?
lpwwtiir1#
就我所搜索的,没有办法从弹性中得到一个标准化的分数。你必须通过两个查询来破解它。(优选地具有尺寸1,但其余所有属性都相同),它将为您获取max_score。然后,您可以拍摄实际的查询,并使用functional_score来规范化得分。将您在params中作为引导查询的一部分获得的max_score传递给function_score,并使用它来规范化每个分数。请参阅:本文摘录
max_score
functional_score
function_score
brccelvz2#
现在有点晚了。我们需要对我们的一个用例的ES分数进行标准化。所以,我们写了一个插件来覆盖ES Rescorer特性。支持最小值-最大值和z得分。Github:https://github.com/bkatwal/elasticsearch-score-normalizer用法:最小-最大
{ "query": { ... some query }, "from" : 0, "size" : 50, "rescore" : { "score_normalizer" : { "normalizer_type" : "min_max", "min_score" : 1, "max_score" : 10 } } }
使用z得分:
"query": { ... some query }, "from" : 0, "size" : 50, "rescore" : { "score_normalizer" : { "normalizer_type" : "z_score", "min_score" : 1, "factor" : 0.6, "factor_mode" : "increase_by_percent" } } }
有关完整文档,请查看Github存储库。
2条答案
按热度按时间lpwwtiir1#
就我所搜索的,没有办法从弹性中得到一个标准化的分数。你必须通过两个查询来破解它。(优选地具有尺寸1,但其余所有属性都相同),它将为您获取
max_score
。然后,您可以拍摄实际的查询,并使用functional_score
来规范化得分。将您在params中作为引导查询的一部分获得的max_score
传递给function_score
,并使用它来规范化每个分数。请参阅:本文摘录brccelvz2#
现在有点晚了。我们需要对我们的一个用例的ES分数进行标准化。所以,我们写了一个插件来覆盖ES Rescorer特性。
支持最小值-最大值和z得分。
Github:https://github.com/bkatwal/elasticsearch-score-normalizer
用法:最小-最大
使用z得分:
有关完整文档,请查看Github存储库。