聚合elasticsearch中的最后文档

时间:2016-10-11 02:38:11

标签: elasticsearch elasticsearch-dsl

我对ES有点新意,我不知道如何做到以下几点:

我使用查询运行搜索,该查询只包含一些“应该”参数。

然后还有一些聚合,例如百分位,期限等等。

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

我的想法是,我希望aggs用于特定术语,但如果找不到足够的,则将其填满 - 但仅限于要聚合的特定最大数量。从文档中可以看出pipeline是它返回的文档数量,而不是用于aggs的大小(我不需要点击,只返回aggs)。

那我该如何解决这个问题呢?是否有嵌套/后续查询?我必须{{1}},例如得到1k文档的搜索,然后攻击那个?

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

填写?

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

1 个答案:

答案 0 :(得分:0)

解决方案:

        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。此外,它可以提升一个非常好的解决方案。