Главная > Теория и практика > Sphinxsearch - объединение индексов (index merging)

Sphinxsearch - объединение индексов (index merging)

sphinx search logo

В сфинксе (sphinx-search) существует очень хорошее решение для оптимизации процесса индексации.

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

Использование дельта индексов тем не менее требует периодичного обновления основного индекса, чтобы обновить изменившиеся и выбросить удаленные сущности. Да и сам по себе дельта индекс растет со временем, требуя все больше ресурсов для переиндексации (что делает его неэффективным).

Самое простое решение этой задачи - полная переиндексация в непиковые часы (или дни). Это не самый оптимальный подход, т.к. полная переиндексация может занимать часы, а иногда и дни. Существует другое решение для обновления основного индекса, которое может сэкономить множество ресурсов - объединение индексов (index merging).

Что такое index merging?

У индексатора сфинкса есть возможность объединять два индекса в один. Во многих случаях это намного эффективнее, чем полная переиндексация. В этом случае не нагружается сам источник данных (СУБД - выборки для индексации обычно тяжелые, т.к. содержат огромные объемы данных).

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

Как пользоваться?

Индексатор имеет опцию объединения идексов:

indexer --merge DSTINDEX SRCINDEX [--rotate]
  • DSTINDEX - основной индекс, который будет обновлен после операции объединения
  • SRCINDEX - индекс, содержимое которого будет объеденено с основным (сам индекс не изменится) - дельта индекс

Например:

indexer --merge main delta --rotate

Атрибуты документов малого (дельта) индекса перезапишут атрибуты основного, если во время объединения встретятся одинаковые документы.

Процесс объединения подразумевает добавление новых текстовых ключей к старым. Допустим У вас определенный документ в основном индексе находился по ключу “старый”, а в дельта индексе находится по ключу “новый”. После объединения этот документ будет доступен и по ключу “старый”, и по ключу “новый”.

Если необходимо удалять (или обновлять) старые документы, необходимо фильтры объединения:

Удаление и обновление документов в основном индексе

Если существует необходимость удалить невалидные документы из основного индекса, то необходимо воспользоваться опцией “–merge-dst-range”:

indexer --merge main delta --merge-dst-range ATTR_NAME START END

Эта опция позволяет наложить фильтр на индекс назначения, т.е. основной индекс, и убрать из него конкретные документы. Например, чтобы убрать из индекса удаленные документы, можно отфильтровать их по атрибуту “deleted”:

indexer --merge main delta --merge-dst-range deleted 0 0

В этом случае в новый индекс войдут только документы, имеющие значение атрибута deleted = 0. Внимание! атрибут “deleted” - это пользовательский атрибут, т.е. его нужно создать руками при описании индекса:

source src_news : src_basic_index
{
	sql_query = SELECT id, title, body, deleted FROM news
	sql_attr_uint = deleted
}

Обновление атрибутов документов необходимо делать синхронно с удалением самого документа. Для того, чтобы обновить атрибуты документа в индексе необходимо использовать метод “UpdateAttributes()” клиентского API.

Для обновления документов в основном индексе можно использовать тот же подход: устанавливаете атрибут “updated_on” (который, например, указывает дату обновления в unix_timestamp). При объединении индексов устанавливаете фильтр, который выбросит из основного индекса все обновленные документы, например:

indexer --merge main delta --merge-dst-range deleted 0 12345345

Тут 12345345 - это максимальная дата обновления документа на момент последнего объединения (или создания) основного индекса. Т.е. в него не войдут документы, обновлявшиеся после этой даты. Естественно, все обновленные документы должны входить в дельта индекс.

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

Статьи по теме

  1. JIEXA
    1 Декабрь 2009 в 03:23 | #1

    спасибо, очень полезно

  2. Orlanguru
    2 Декабрь 2009 в 19:02 | #2

    аТрибут

  3. 2 Декабрь 2009 в 19:06 | #3

    @Orlanguru

    Спасибо :)

  4. удвук
    10 Март 2010 в 18:34 | #4

    на счет удаления… что-то тут не так. при выполнении
    indexer –merge main delta –merge-dst-range deleted 0 0
    документ с deleted=1 не попадет из delta в main, но если он уже был в main, то он удаляться не будет.. или я ошибаюсь?

  5. 10 Март 2010 в 18:47 | #5

    @удвук
    Ошибаетесь. Фильтроваться будут документы не из какого-то индекса, а при генерации нового индекса. Т.е. любые документы имеющие deleted = 1 в индекс не войдут.

  6. удвук
    10 Март 2010 в 19:06 | #6

    странно, у меня почему-то этого не происходит. в результирующем индексе остался этот документ, но уже с delete=1. и причем находится этот документ как по старому тексту так и по новому, в обоих случаях результат поиска один и тот же айдишник документа и атрибут delete=1. :-(

    • 10 Март 2010 в 19:09 | #7

      Проверьте Вашу версию sphinx. Сливание индексов имеет ряд проблем в более старых версиях. Попробуйте обновиться до самой новой (0.9.9 сейчас)

  1. Пока что нет уведомлений.