【问题标题】:Aggregate over last documents in elasticsearch聚合弹性搜索中的最后一个文档
【发布时间】:2016-10-11 02:38:11
【问题描述】:

我对 ES 有点陌生,我不确定如何执行以下操作:

我使用仅包含几个“应该”参数的查询进行搜索。

然后还有一些聚合,例如百分位数、术语分桶等。

但对于聚合,我只想要它,例如,聚合前 1000 个文档(我希望然后按分数对其进行评分和排序)。

我的想法是我想要特定条款的 aggs,但如果找不到足够的,则将其填满 - 但仅限于要聚合的特定最大数量。从文档看来,size 是它返回的文档数量,而不是用于 aggs 的大小(我不需要命中,只返回 aggs)。

那么我该怎么做呢?是否有嵌套/后续查询?我必须pipeline 某事,例如搜索 1k 文档,然后 agg 那个?

如果文档可以首先按它被索引的时间戳进行排序,那将是理想的 - 这样用于“填充”的文档是最新的 - 但 AFAIK 是不可能的?

填满?

'fill it up' 意味着我有 100 个文档用于指定一个指定的“应该”字段。然后我仍然需要其他 900 个文档来聚合所需的 1k 结果大小(以便将其填充到所需的数量)。因此,我没有使用过滤器,而是在文档中看到了“组合查询”,我认为使用“应该”参数就足够了。

【问题讨论】:

  • 能否澄清您所说的“填满”是什么意思?也许通过包含您期望的 json 示例?
  • @Phil 编辑的问题
  • 这可能会有所帮助。有限制的过滤器 - stackoverflow.com/a/29127328/689625

标签: elasticsearch elasticsearch-dsl


【解决方案1】:

解决方案:

        sample = A('sampler', shard_size=docs_per_shard)

要聚合文档子集,请使用 Sampler 聚合器。这将返回文档的一个子集。它需要一个 shard_size 参数,即每个分片必须返回多少个文档。给出的值是所需文档大小 (100) 除以活动分片 (5)。

        terms = A('terms', field='action')
        sea = GameAction.search()
        sea.aggs.bucket('mesam', sample).bucket('aksies', terms)

有了子样本,现在可以通过管道对其进行聚合。这给出了解决方案,但让我们让它变得更好。

        sea = sea.sort('_score', {'created_at': 'desc'})

这将按分数然后按创建日期对文档进行排序,这意味着最相关的文档将被返回,并且按照最新的顺序排列。

此外:

        sea = sea.query('bool', boost=10, should=[Q('match', player=p['name'])])
        sea = sea.query('bool', boost=5, should=[Q('match', vs=vs)])
        sea = sea.query('bool', boost=2, should=[Q('match', phase=phase)])
        sea = sea.query('bool', boost=1, should=[Q('match', site='handhq')])
        sea = sea.query('bool', must=[
            ~Q('match', action='gg') &
            ~Q('match', action='sb') &
            ~Q('match', action='bb')])

这里相关的是should。这允许文档在其匹配或紧密匹配的地方“填充”最相关文档(并在相同的地方用最新的排序)。这些字段大多是not_analyzed。此外,它可以得到提升,从而很好地解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多