В сфинксе (sphinx-search) существует очень хорошее решение для оптимизации процесса индексации.
Суть решения рассмотрена в статье Дельта индекс в Sphinx. Дельта индексы существенно снижают ресурсоемкость постоянной переиндексации, позволяя делать ее чаще и иметь более актуальные данные в результатах поиска.
Использование дельта индексов тем не менее требует периодичного обновления основного индекса, чтобы обновить изменившиеся и выбросить удаленные сущности. Да и сам по себе дельта индекс растет со временем, требуя все больше ресурсов для переиндексации (что делает его неэффективным).
Самое простое решение этой задачи – полная переиндексация в непиковые часы (или дни). Это не самый оптимальный подход, т.к. полная переиндексация может занимать часы, а иногда и дни. Существует другое решение для обновления основного индекса, которое может сэкономить множество ресурсов – объединение индексов (index merging).
У индексатора сфинкса есть возможность объединять два индекса в один. Во многих случаях это намного эффективнее, чем полная переиндексация. В этом случае не нагружается сам источник данных (СУБД – выборки для индексации обычно тяжелые, т.к. содержат огромные объемы данных).
В схеме индексации “основной + дельта индекс” у Вас есть два индекса, один из которых малый, постоянно обновляемый (дельта), а второй – основной, содержащий все данные (но не включая самые последние – доступные из дельта индекса). В этом случае намного предпочтительнее использовать объединение индексов (чем полную переиндексацию), т.к. размер дельта индекса обычно составляет доли процента от размера основного индекса, и их объединение выполняется эффективно.
Индексатор имеет опцию объединения идексов:
indexer --merge DSTINDEX SRCINDEX [--rotate]
Например:
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 – это максимальная дата обновления документа на момент последнего объединения (или создания) основного индекса. Т.е. в него не войдут документы, обновлявшиеся после этой даты. Естественно, все обновленные документы должны входить в дельта индекс.
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…