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

时间:2014-05-03 20:57:51

标签: elasticsearch ranking popularity

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

谢谢!

0 个答案:

没有答案