首页 文章

聚合elasticsearch中的最后文档

提问于
浏览
1

我对ES有点新,我不知道如何做以下事情:

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

然后还有一些汇总,例如百分位数,术语暂停等

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

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

那么我该怎么做呢?是否有嵌套/后续查询?我必须 pipeline ,例如得到1k文档的搜索,然后攻击?

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

Fill it up?

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

1 回答

  • 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 . 这允许文档与最相关的文档'filled up'匹配或紧密匹配(并且与最新的相等)进行排序 . 这些字段大多是 not_analyzed . 此外,它可以提升,为问题提供一个非常好的解决方案 .

相关问题