2016-12-09 8 views
0

При выполнении операции поиска в elasticsearch я хочу, чтобы метаданные отфильтровывались и возвращали только «_source» в ответе. Я в состоянии достичь того же через "поиск" следующим образом:Использование filter_path с помощью helpers.scan в клиенте elastisearch

out1 = es.search (индекс = 'index.com', filter_path = [ 'hits.hits._id', ' hits.hits._source '])

Но когда я сделать то же самое с помощью метода сканирования она просто возвращает пустой список:

OUT2 = helpers.scan (а, запрос, индекс =' индекс .com ', doc_type =' 2016-07-27 ', filter_path = [' hits.hits._source '])

Проблема может быть связана с тем, что я обрабатываю отклик метода «scan» или с тем, как я передаю значение filter_path. Чтобы проверить выход, я разобрал out2 в список.

ответ

1

Помощник scan не позволяет передавать дополнительные параметры в API scroll, поэтому ваш filter_path не относится к нему. Однако он применяется к первоначальному вызову API search, который используется для инициирования цикла scan/scroll. Это означает, что scroll_id удаляется из ответа, приводящего к сбою всей операции.

В вашем случае даже проходя параметр filter_path к scroll API вызовов может вызвать помощник потерпеть неудачу, потому что это будет обнажать scroll_id, которая необходима для этой операции для работы, а также потому, что помощник опирается на структуру ответа.

Моей рекомендацией было бы использовать source filtering, если вам нужно ограничить размер ответа или использовать параметр меньшего размера size, чем по умолчанию 1000.

Надеется, что это помогает, Хонзе

0

Вы могли бы передать filter_path=['_scroll_id', '_shards', 'hits.hits._source'] помощнику сканирования, чтобы заставить его работать. Очевидно, что он оставляет некоторые метаданные в ответе, но он удаляет как можно больше, позволяя работать scroll. _shards требуется, потому что он используется внутренним помощником сканирования.