2016-10-11 69 views
1

最后文件我是有点新的ES,我不知道如何做到以下几点:总结了在elasticsearch

我运行一个查询,将只包含一些“应当”的参数搜索。

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

但是对于聚合,我只想要它,例如,聚集在前1000个文件(我希望然后评分和排序)。

这个想法是,我想要特定条款的aggs,但如果找不到足够的,然后填写 - 但限于一个特定的最大数量进行汇总。从文档看,size似乎是它返回的文档数量,而不是用于aggs的大小(我不需要命中,只返回了aggs)。

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

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

把它填满?

'填满'表示我为指定的一个指定'应该'字段有100个文档。然后,我仍然需要其他900个文档才能汇总所需的1k结果大小(因此要填充所需的数字)。因此,我没有使用过滤器,而是在文档中看到了“合并查询”,我认为使用“应该”参数就足够了。

+0

可以阐明“填满”的意思吗?也许通过包含一个你期望的json例子? – Phil

+0

@Phil编辑的问题 – Tjorriemorrie

+0

这可能有帮助。限制的过滤器 - http://stackoverflow.com/a/29127328/689625 – jay

回答

0

解决方案:

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

为了聚集了部分文档,使用采样聚合。这将返回文档的一个子集。它需要一个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。此外,它可以提供一个非常好的解决方案。