2016-10-11 70 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。此外,它可以提供一個非常好的解決方案。