我使用流行度完成了一个复杂的查询,以使用Elasticsearch改善社交媒体文档的结果。 查询工作得非常好,最重要的结果始终集中在查询和有趣的元素上。
但是它存在问题,对于某些查询,第一个结果全部来自同一个用户。
如果在较高的文档上检索到相同的用户,我想缩减文档。这样我希望结果更加多样化。
请注意,我不希望删除它们,因为在某些情况下,查找同一用户的更多文档可能仍然很有趣,但我希望它们处于较低位置。
有人可以建议一种让它运作的方法吗?
正如一些评论中所建议的,我更新了我的查询(简化版):
query = {"function_score": {
"functions": [
{"gauss": {"createdAt":
{"origin": "now", "scale": "30d", "offset": "7d", "decay" :0.9 }
}},
{"gauss": {"shares.last.twitter_retweets_log":
{"origin": 4.52, "scale": 2.61, "decay" : 0.9}
}},
],
"query": {"bool":{"must":[
{"exists":{"field": "images"}},
{"multi_match":{"query": "foo boo", fields:["text", "link.title"]}}
]}},
"score_mode": "multiply"
}};
P.S:一些可能有趣的文件,因为他们谈论多样性,但我不确定如何申请:
答案 0 :(得分:7)
您可以将采样器与top_hits
聚合耦合以获得多样化的结果。
{
"query": {
"match": {
"query": "iphone"
}
},
"size":0,
"aggs": {
"sample": {
"sampler": {
"shard_size": 200,
"field" : "user.id"
},
"aggs": {
"diversifiedMatches": {
"top_hits": {
"size":10
}
}
}
}
}
}
有一些警告,例如:
1)重复数据删除是每个分片而非全局
2)多样化领域的选择必须是单值领域
3)不支持分页
4)不支持对除分数
以外的任何内容进行排序解决上述问题很困难,内部需要昂贵/复杂的协调,还需要客户提供更多关于何时何地可以重新引入“重复”结果的指导(第2页?第3页?有多少?)等