2013-05-09 2 views
2

Что эквивалентно уменьшению карты в ElasticSearch, когда обработка слишком много для клиентской стороны? Есть ли что-то вроде «потоковой передачи», поэтому клиент может сократить объем данных до вывода, когда он приходит?Elasticsearch эквивалентен Map-Reduce

Предположим, мне нужно выполнить объединение или сложную фильтрацию на стороне клиента, тип, который может не соответствовать памяти без какой-либо схемы уменьшения карты. Я не против долго ждать ответа, но я не хочу раздавить машину (клиент и/или сервер).

Как мне это сделать?

Например, отображения:

{"book":{"properties":{ 
         "title":{"type":"string", "index":"analyzed"}, 
         "author":{"type":"string", "index":"analyzed"}, 
} 

{"character":{"properties":{ 
         "book_id":{"type":"string", "index":"not_analyzed"}, 
         "name":{"type":"string", "index":"analyzed"}, 
         "age":{"type":"integer"}, 
         "catch-phrase":{"type":"string", "index":"analyzed"}, 
} 

Скажем, я хочу, чтобы найти все книги, которые имеют по крайней мере M символов, которые имеют крылатую фразу не более чем N (где N является параметром поставляется на стороне клиента)

поэтому было бы get_books_with_short_phrases(M,N)

Я мог бы, конечно, добавить поля, такие как «фраза длина» к типу «характер», но давайте предположим, что обработка на «крылатое словечко» может быть все время меняется.

Я хотел бы течь «символы» и «книги» к клиенту, перейдите по каждому клиенту и вывода ключа значение <book>-<character,len(phrase)> затем уменьшить его до <book>-<num_of_chars_with_short_phrase>

Если я загрузить все документы в клиентская память, которая может быть катастрофой. Если клиент обрабатывает каждую книгу и сводит ее к k, v это может быть лучше.

Я не ошибаюсь?

Является ли решение, выполняющее сценарии на сервере каким-то образом, поэтому оно выполняет сокращение карты?

ответ

3

afaik Вы не можете делать потоковые передачи с помощью ES.

Как я уверен, вы знаете, что лучше всего вникать в другое мышление, в котором «соединения» не существуют. Вместо этого денормализовать и попытаться покрыть ваш usecase одним запросом ES, конечно, это не всегда работает.

В приведенном выше случае, однако, я приглашаю вас взглянуть на фильтр сценариев, который позволяет выполнять сложные вычисления (аналогичные хранимым процедурам sql), которые позволяют параметры времени запроса.

Я довольно уверен, что это должно дать вам инструменты для выполнения запроса в 1 раз на сервере, хотя я только не заглядывал глубоко в него.

http://www.elasticsearch.org/guide/reference/query-dsl/script-filter/ http://www.elasticsearch.org/guide/reference/modules/scripting/

0

Да, данные, вероятно, следует денормализованной поэтому у вас есть все в одном документе.

Тогда я бы посмотрел на scripted metrics, что позволяет использовать встроенные скрипты in-query или собственные сценарии Java для выполнения карты/уменьшения, например распределенной обработки, на самих узлах Elasticsearch, где вы возвращаете только приведенные уменьшенные значения. См. this example для примера реализации Java.

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