Elasticsearch中的加权随机抽样

时间:2015-12-07 07:54:10

标签: elasticsearch random-sample weighted

我需要从ElasticSearch索引中获取一个随机样本,即发出一个查询,从具有加权概率Wj/ΣWi的给定索引中检索某些文档(其中Wj是行{{1}的权重1}}和j是此查询中所有文档的权重之和。)

目前,我有以下查询:

Wj/ΣWi

随机返回所选类别中的5个项目。 每个项目都有一个字段GET products/_search?pretty=true {"size":5, "query": { "function_score": { "query": { "bool":{ "must": { "term": {"category_id": "5df3ab90-6e93-0133-7197-04383561729e"} } } }, "functions": [{"random_score":{}}] } }, "sort": [{"_score":{"order":"desc"}}] } 。所以,我可能不得不使用

weight

here所述。

我有以下问题:

  • 这样做的正确方法是什么?
  • 我是否需要启用Dynamic Scripting
  • 如何计算查询的总和?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:4)

如果它对任何人都有帮助,这就是我最近实施加权改组的方式。

在这个例子中,我们洗牌公司。每家公司都有一个0到100之间的“company_score”。通过这种简单的加权洗牌,得分为100的公司在第一页出现的可能性是得分为20的公司的5倍。

json_body = {
    "sort": ["_score"],
    "query": {
        "function_score": {
            "query": main_query,  # put your main query here
            "functions": [
                {
                    "random_score": {},
                },
                {
                    "field_value_factor": {
                        "field": "company_score",
                        "modifier": "none",
                        "missing": 0,
                    }
                }
            ],
            # How to combine the result of the two functions 'random_score' and 'field_value_factor'.
            # This way, on average the combined _score of a company having score 100 will be 5 times as much
            # as the combined _score of a company having score 20, and thus will be 5 times more likely
            # to appear on first page.
            "score_mode": "multiply",
            # How to combine the result of function_score with the original _score from the query.
            # We overwrite it as our combined _score (random x company_score) is all we need.
            "boost_mode": "replace",
        }
    }
}

答案 1 :(得分:0)

我知道这个问题已经过时了,但回答任何未来的搜索者。

comment before yours in the GitHub thread似乎有答案。如果您的每个文档都有相对权重,那么您可以为每个文档选择一个随机分数,并将其乘以权重以创建新的加权随机分数。这有额外的好处,不需要权重总和。

e.g。如果两个文档的权重为12,那么您希望第二个文档的选择可能性是第一个。为每个文档提供01之间的随机分数(您已使用"random_score")。将随机分数乘以权重,您将获得第一个文档,其得分在01之间,第二个文档的得分在02之间,所以两倍的可能性被选中!