5

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

谢谢!

4

0 回答 0