我们正在将我们的搜索系统从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似乎不是有时候足够了)。有没有人有任何建议或想法?
谢谢!