【问题标题】:Diversified results on Elasticsearch searchElasticsearch 搜索的多样化结果
【发布时间】:2016-03-17 04:46:13
【问题描述】:

我使用流行度完成了一个复杂的查询,以改进使用 Elasticsearch 的社交媒体文档的结果。 查询运行良好,排名靠前的结果始终以查询为中心并包含有趣的元素。

但是它有一个问题,对于某些查询,第一个结果都来自同一个用户

如果在更高级别的文档中检索到同一用户,我想降分文档。通过这种方式,我希望结果更加多样化。

请注意,我不希望它们被删除,因为在某些情况下,查找同一用户的更多文档可能仍然很有趣,但我希望它们处于较低的位置。

任何人都可以提出一种使它工作的方法吗?


根据某些 cmets 的建议,我更新了我的查询(简化版):

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:一些文件可能很有趣,因为他们谈论多样性,但我不知道如何申请:

【问题讨论】:

  • 你能显示你的实际查询和你目前得到的一些结果吗?另外,描述您的用户的字段类型是什么(即字符串或数字)?
  • @Val 我在 elasticSearch 2.1 上使用函数分数查询。 user.id 是一个字符串。
  • 您介意分享您的实际查询吗?
  • @Val 根据您的建议,我添加了它的简化版本。
  • 谢谢。我将建议对用户使用function_scoredecay,但仅在您的用户ID 是数字的情况下,它不是。

标签: elasticsearch lucene search-engine elasticsearch-aggregation


【解决方案1】:

您可以将采样器与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?选择的值(200 和 10)有什么影响?
  • 是的,在这个例子中有 200 和 10 可能有点奇怪。 Sampler 仅过滤每个分片上得分最高的 200 个命中(附加限制是我们只考虑每个唯一 user.id 的得分最高的文档)。在这 200 个文档样本中,我们使用 top_hits 返回前 10 个文档。在您的用例中,这些数字可能应该更改为相同的值。其他用例可能需要大样本,然后是较小的结果,例如200 个样本和前 10 个重要术语聚合。
  • 如果我听不懂的话。该解决方案意味着您只能看到每个用户一次,对吗?因此,如果同一用户只有 10 个重要结果,此解决方案将永远不会显示其他 9 个结果。我错过了什么?
  • 我没有看到 "field" 记录为 sampler 聚合的属性。这是在旧版本的 Elasticsearch 中,还是您的意思是使用 diversified_sampler,它确实具有 "field" 属性?
  • 是的,这看起来很旧的语法。在某些时候,我们将sampler agg 中的多元化支持拆分为diversified_sampler agg
猜你喜欢
  • 2020-05-03
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多