15

我使用流行度完成了一个复杂的查询,以改进使用 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:一些文件可能很有趣,因为他们谈论多样性,但我不确定如何申请:

4

1 回答 1

9

您可以将采样器与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 页?多少?)等。

于 2015-12-15T08:56:17.447 回答