我需要从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所述。
我有以下问题:
非常感谢你的帮助!
答案 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。如果两个文档的权重为1
和2
,那么您希望第二个文档的选择可能性是第一个。为每个文档提供0
和1
之间的随机分数(您已使用"random_score"
)。将随机分数乘以权重,您将获得第一个文档,其得分在0
和1
之间,第二个文档的得分在0
和2
之间,所以两倍的可能性被选中!