пятница, 20 августа 2010 г.

Sphinx RT (real-time) индексы

spinx

Sphinx 1.10 поддерживает индексы реального времени (Reat-time или RT). Это самая важная функция в новой версии этого отличного полнотекстового поисковика. Индексы реального времени позволяют синхронно добавлять документы для поиска в индекс. Это позволяет избежать задержки появления новых документов в результатах поиска. Пробуем RT индексы на практике.



Обзор


Как уже было сказано, RT индексы позволяют добавлять документы в поисковый индекс на лету (не только добавлять, но и обновлять/удалять). RT индексы поддерживают не все дополнительные возможности (сейчас нет поддержки MVA атрибутов, префиксов, процесс оптимизации индекса еще не реализован), но большинство уже доступно. “Живые” индексы находятся в активной разработке, поэтому все недостающие функции будут доступны в скором времени.


Использование RT индексов


Объявление RT индекса выглядит следующим образом:



index rt_test
{
type = rt
path = /usr/local/sphinx/data/rt_test
rt_field = title
rt_field = content
}

Мы объявили RT индекс с двумя полями для индексации. Каждый RT индекс содержит целочисленную колонку ID документа (ее не нужно объявлять).


После перезагрузки демона поиска “searchd” на 9306 порту (по умолчанию) будет доступен сервер RT индексов. Работа с RT индексами пока реализована только на основе протокола MySQL. Для управления индексами доступны следующие команды:



  • INSERT INTO rt_test(id, title, content) VALUES ( 1, ‘hello’, ‘world’)

  • REPLACE INTO rt_test(id, title, content) VALUES ( 1, ‘hello’, ‘world’)

  • DELETE FROM rt_test WHERE id = id


Также поддерживается множественная вставка, что предпочтительнее для вставки большого количества данных.



mysql -h 127.0.0.1 -P 9306
mysql> INSERT INTO rt_test ( id, title, content )
VALUES ( 2, 'second', 'world' ), ( 3, 'third', 'earth' );
Query OK, 2 rows affected (0.01 sec)

mysql> REPLACE INTO rt_test ( id, title, content ) VALUES ( 1, 'new text', 'for first row' );
Query OK, 1 row affected (0.01 sec)

mysql> DELETE FROM rt_test WHERE id=2;
Query OK, 0 rows affected (0.00 sec)

На клиентской стороне поиск ни чем не отличается от обычного индекса, поэтому там все стандартно.


Внутренности и особенности RT индексов в Sphinx’e


RT индексы внутри состоят из фрагментов. Один фрагмент хранится в оперативной памяти, который хранит последние обновления. Когда размер фрагмента в RAM превышает лимит, он сбрасывается на диск, а оперативная память очищается. Большое количество дисковых фрагментов может привести к высокой фрагментации и снижению производительности поиска (пока дефрагментация не поддерживается), поэтому параметр rt_mem_limit а настройках лучше ставить побольше.


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


В данный момент мы используем Sphinx 1.10 в продуктивной среде на одном крупном проекте. Работает очень стабильно. Планируем постепенно мигрировать на RT индексы.



Google Bookmarks Digg I.ua Ru-marks Ruspace Zakladok.net Reddit delicious Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru rucity.com



Related posts:

  1. Дельта индекс в Sphinx
  2. Полнотекстовый поиск в MongoDB используя Sphinx
  3. Sphinxsearch — объединение индексов (index merging)

Комментариев нет:

Отправить комментарий