根据字段值相对于其他匹配文档的字段值调整Elasticsearch _score

Luk*_*ins 5 popularity ranking elasticsearch

我们正在将搜索系统从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" }
    ],
}
Run Code Online (Sandbox Code Playgroud)

popularity_score字段包含最近6周内包含此商品的订单总数。一些项目将永远不会订购,而一些项目将达到30,000个(随着我们继续发展业务,可能还会更多)。这是相当大的范围。

我们遇到的问题是,文档(产品)在文本方面可能非常匹配,但并不十分流行。然后,我们还有另一个与查询不完全相关的产品,它与查询匹配,但是由于它非常受欢迎,因此它跳到了榜单上。我们正在寻找的是一种popularity_score相对于popularity_score其他匹配结果可以采用并获得某种形式的规范化的东西,而不仅仅是按原样进行(log1p有时似乎不够用)。有人有任何建议或想法吗?

谢谢!