Статьи

Solr 4.0: GET в реальном времени

Следующая функциональность, которую я решил рассмотреть в предстоящем Solr 4.0, — это так называемое «получение в реальном времени». Это позволяет просматривать данные, даже если они еще не были добавлены в индекс, то есть перед отправкой  операции фиксации в Solr. Посмотрим, как это работает.

Немного теории

Обновление данных в Lucene и Solr имеет один недостаток — когда вы отправляете обновления индекса, их нельзя увидеть, пока не будет выполнена  операция фиксации . Проблема в том, что фиксация  является дорогостоящей с точки зрения производительности, а интенсивная фиксация может вызвать проблемы с производительностью. Поэтому, когда вам нужно, чтобы ваши данные были видны сразу после внесения изменений, вас могут заставить выбирать — либо производительность, либо быстрые обновления. Чтобы решить эту проблему, Lucene и Solr работают над тем, чтобы включить  поиск в режиме реального времени (NRT). В Lucene у нас есть такая возможность, в Solr 4.0 мы также сможем использовать это, и не только это.

конфигурация

Для использования  функции Realtime Get нам необходимо настроить следующие функции Solr:

Журнал транзакций

Первое, что нужно настроить — это запись журнала транзакций. Для этого вам необходимо добавить следующее в вашу  конфигурацию updateHandler :

<updateLog>
  <str name="dir">${solr.data.dir:}</str>
</updateLog>

 

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

Обработчик получения в реальном времени

Второе, что нужно сделать, чтобы увидеть Realtime Get  in action, — это соответствующая конфигурация обработчика (или добавление компонента к уже определенному обработчику). Для этого добавьте в свой  файл solrconfig.xml следующее :

<requestHandler name="/get" class="solr.RealTimeGetHandler">
  <lst name="defaults">
    <str name="omitHeader">true</str>
  </lst>
</requestHandler>

В приведенной выше записи нет ничего необычного — просто добавьте новый обработчик запросов, реализующий  класс solr.RealTimeGetHandler , который позволяет проверять журнал транзакций.

действие

Чтобы проверить, как   работает Realtime Get, я решил сделать простой тест. Первое, что я сделал, — это индексирование одного файла (из тех, которые доступны в   каталоге exampledocs ) с помощью следующей команды bash:

curl 'http://localhost:8983/solr/update' -d @hd.xml -H 'Content-type:application/xml'

Конечно, я не отправлял  операцию фиксации после индексации. Как и следовало ожидать, следующий запрос:

http://localhost:8983/solr/select?q=*:*

 

не вернул результаты поиска. Итак, давайте проверим, сможет ли обработчик, зарегистрированный как  / get  , получить нам некоторые результаты. Для этого я отправляю следующий запрос:

http://localhost:8983/solr/get?id=SP2514N

 

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

<?xml version="1.0" encoding="UTF-8"?>
<response>
<doc name="doc">
  <str name="id">SP2514N</str>
  <str name="name">Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133</str>
  <str name="manu">Samsung Electronics Co. Ltd.</str>
  <str name="manu_id_s">samsung</str>
  <arr name="cat">
    <str>electronics</str>
    <str>hard drive</str>
  </arr>
  <arr name="features">
    <str>7200RPM, 8MB cache, IDE Ultra ATA-133</str>
    <str>NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor</str>
  </arr>
  <float name="price">92.0</float>
  <int name="popularity">6</int>
  <bool name="inStock">true</bool>
  <date name="manufacturedate_dt">2006-02-13T15:26:37Z</date>
  <str name="store">35.0752,-97.032</str></doc>
</response>

 

Итак, Солр вернул результат, который не был добавлен в индекс — приятно!

Возможности использования

Вы, наверное, заметили, что для получения документа с помощью  обработчика / get мне нужно было предоставить его уникальный идентификатор (или список идентификаторов). Это правда, Realtime Get  не поддерживает поиск, потому что он не был создан для поддержки полного поиска. Эта функция может показывать нам обновления документов, идентификаторы которых известны (например, идентификаторы в индексе) — например, путем добавления компонента, используемого в solr.RealTimeGetHandler, в любой из определенных вами обработчиков. И хорошая новость — вам не нужно беспокоиться о производительности обновления — solr.RealTimeGet  работает очень быстро. Так что, если одна из ваших проблем часто обновляется, вы можете смотреть в будущее с улыбкой:)

Последние несколько слов

Функциональность Realtime Get  открывает новые возможности, когда дело доходит до Solr, а также на пути к SolrCloud. С помощью журнала транзакций можно реализовать автоматическое восстановление узла кластера или обновления экземпляра NRT. Как видите, Solr 4.0 — это не только поиск, но и хранение данных и сближение Solr с решениями NoSQL.

Источник: http://solr.pl/en/2012/01/09/solr-4-0-realtime-get-2/