2014-01-06 3 views
3

При поиске решения, которое позволяет мне запускать некоторые действия при каждом вводе данных, я нашел API-интерфейс перколятора из elasticsearch. Я прочитал немало страниц, пока не узнал, что все запросы, использующие API перколятора, используют GET.Возможно ли вернуть ответ от перколятора при вставке документа?

Возможно ли, что для использования в случае использования документов и необходимости знать, какие из них соответствуют запросу, мне нужно будет выполнить два запроса? На моих страницах мне кажется, что мне нужно будет сначала вставить документ, а затем спросить индекс перколятора с тем же документом, если он будет соответствовать. Или есть параметр запроса или аналогичный, чтобы elasticsearch включал ответ перколятора в ответ, который я получаю от вставки?

+0

Если вы имеете в виду перколяцию при индексировании, это возможно с 0.90, но удаляется с новым перколятором в master (1.0). Причиной удаления является то, что это большая часть, которая препятствовала распределению перколятора в 0.90, так как вам нужны как запросы, так и документы в одном и том же узле, чтобы они были работоспособными. Имеет смысл? – javanna

+0

Да, я имел в виду перколяцию при индексировании. Было бы неплохо, если бы это сработало. Я не знаю достаточно о внутренности elasticsearch, чтобы посмотреть, как обрабатываются индексы, и почему хорошо, что перколятор находится где-то еще в качестве документов. Я только начинаю использовать elasticsearch, и я создаю концентратор журналов с поддержкой уведомлений. Значение, основанное на согласованных входящих событиях/журналах, я могу инициировать обратные вызовы, чтобы вызвать некоторые вещи. У меня такое ощущение, что делать 2 запроса на каждое событие может быть слишком много, и мне нужен другой сототон. –

ответ

7

Учитывая ваш вопрос, я считаю, что вы смотрите на elasticsearch 1.0, на данный момент доступный в Beta2. Эта деталь важна, поскольку перколятор был переписан в 1.0 и выглядит совершенно по сравнению с тем, который доступен в 0.90.

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

Что нужно многим людям - это дополнительный шаг по индексированию документа, поэтому приятно иметь возможность выполнять перколяцию и индексирование в одном запросе, чтобы вы могли индексировать документ и возвращать запросы, которые он соответствует. Это было возможно в 0,90 с использованием так называемого перколята при индексировании. Это единственная функция, которая была удалена с помощью перезаписи 1.0, чтобы иметь возможность лучше распределять зарегистрированные запросы и масштабировать их.

Фактически, с 0.90 запросы хранятся в зарезервированном индексе, который называется _percolator, который всегда имеет 1 осколок и auto_expand_replica установлен на true. Это означает, что каждый узел будет содержать все запросы, так как один осколок будет автоматически реплицироваться на все узлы. Основная причина этого заключается в том, что, когда вы хотите индексировать документ и перколить в одно и то же время, чтобы сделать это перфомантом, вам нужно убедиться, что два осколка, которые вам нужно ударить (запросы и данные), являются на том же узле. Если все запросы находятся на всех узлах, это гарантируется, таким образом, перколяция, тогда как индексирование возможно и будет достаточно быстрым. Но есть большое ограничение, поэтому перколятор был переписан: существует ограничение на количество запросов, которые вы можете зарегистрировать, так как они попадут в один осколок.

С 1.0 вы можете регистрировать запросы по любому индексу, и они будут зарегистрированы под зарезервированным типом .percolator. Затем вы можете масштабировать с запросами, так как они находятся в нормальном индексе, и вы можете определить количество осколков. Недостаток заключается в том, что у вас нет целой копии запросов на каждом узле, тем самым просачиваясь, а индексация невозможна.Что вы можете сделать, хотя, что эквивалентно, но состоит из двух запросов является:

  1. индексировать документ
  2. percolate the existing document по идентификатору, без необходимости отправить весь документ еще раз

Шаг 2 может быть выполняется сразу после возврата операции индекса, так как она выполняет внутреннюю операцию get by id, которая работает в режиме реального времени, поэтому нет необходимости ждать или обновлять индекс.

+0

Спасибо за объяснение. Перкала по индексу кажется тогда лучшей идеей. Это удваивает количество запросов к базе данных. Но это покажет мне время, чтобы придумать лучший подход. –

+0

Итак, теперь ES на 1.3.2 - в чем вердикт? Если это теперь поддерживаемая функция? Немного смущен. Кажется, он говорит: «Это никогда не будет возможно, но вы можете просто перенести идентификатор документа» и «Да, эта функция идет», - ища ясность, чтобы быть уверенным. –

0

Я считаю, что это было невозможно.

От the documentation ..

_percolator который содержит хранилище зарегистрированных запросов просто другой индекс в ES.

Поскольку percolator является еще одним индексом, можно было бы необходимо ударить ES с другим запросом, направленным на _percolator в качестве индекса.

+0

Я не понимаю, почему это невозможно. Индекс перколятора связан с индексом, когда он адресуется как /my-index/.percolator. Поэтому я не понимаю, почему elasticsearch не должен использовать индекс перколятора во время хранения в индексе, с которым связан перколятор. –

+0

Ну, я думаю, это по дизайну. Ссылка [здесь] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search.html). То, что вы говорите о возможности иметь многоиндексный запрос, справедливо для всех индексов, кроме API «Объяснение» и «Перколяция». –

+0

Вы оба правы, так как я думаю, вы говорите о двух разных версиях elasticsearch. 0.90, текущая стабильная версия, имеет определенный индекс (_percolator) для запросов. 1.0, доступный в beta2, может регистрировать запросы по любому индексу, и для этого используется тип .percolator. – javanna

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