我使用流行度完成了一个复杂的查询,以使用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" }};
PS:一些可能有趣的文件,因为他们谈论多样性,但我不知道如何申请:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-sampler-aggregation.html?q=sampler
https://lucene.apache.org/core/5_1_0/misc/org/apache/lucene/search/DiversifiedTopDocsCollector.html
MarkH.. 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页?有多少?)等.
您可以将采样器与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页?有多少?)等.