2016-10-11 5 views
1

Я немного нового в ES, и я не знаю, как сделать следующее:Совокупные за последние документы в elasticsearch

Я запустить поиск с запросом, который будет содержать только несколько «должен» параметры ,

Затем также несколько агрегатов, например. процентиль, термин bucketing и т. д.

Но для агрегаций я хочу только его, например, агрегировать по первым 1000 документам (которые, надеюсь, затем будут забиты и заказаны по счету).

Идея состоит в том, что я хочу, чтобы агги для определенных терминов, но если их недостаточно, заполните его - но ограничьте определенное максимальное число для агрегирования. Из документов видно, что size - это количество возвращаемых документов, а не размер, который будет использоваться для aggs (мне не нужны хиты, только aggs).

Итак, как мне это сделать? Есть ли вложенный/следующий запрос? Должен ли я pipeline что-то, например. получить поиск 1k docs, а затем 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) 

Для того, чтобы агрегировать над подмножество документов, используйте агрегатор 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. Кроме того, он может быть повышен, что дает очень хорошее решение проблемы.

 Смежные вопросы

  • Нет связанных вопросов^_^