我们正在将我们的搜索系统从 Solr 更新为 Elasticsearch。我们已经改进了很多东西,但是我们还没有做对的是通过产品(它是一个电子商务网站)的受欢迎程度来提高文档(产品)的分数。
这就是我们目前所拥有的(去除了许多不相关的位):
{
"query": {
"function_score": {
"query": {
"multi_match" : {
"query": "renal dog food",
"fields": [ "family_name^20", "parent_categories^2", "description^0.2", "product_suffixes^8", "facet_values^5" ],
"operator": "and",
"type": "best_fields",
"tie_breaker": 0.3
}
},
"functions": [{
"script_score": {
"script": "_score * log1p(1 + doc['popularity_score'].value)"
}
}],
"score_mode": "sum"
}
},
"sort": [
{ "_score": "desc" }
],
}
该popularity_score
字段包含过去 6 周内包含此项目的订单总数。有些商品将永远不会被订购,有些商品将有 30,000 件(随着我们继续发展业务,可能还会有更多)。这是相当多的范围。
我们遇到的问题是文档(产品)在文本方面可能非常匹配,但不是很受欢迎。然后,我们有另一个不太相关的产品恰好匹配查询,但因为它非常受欢迎,所以它跳到了列表中。我们正在寻找的是允许popularity_score
相对于popularity_score
其他匹配结果采取的东西,并获得某种形式的标准化,而不是按原样采取(log1p 有时似乎不够)。有没有人有任何建议或想法?
谢谢!