Функция списка уничтожения в Manticore Search

Плоские индексы текстовых данных неизменяемы, это означает, что для обновления данных необходимо выполнить полное переиндексирование. В многих случаях переиндексация может занять много времени. Для этого используется схема main+delta .

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

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

sql_query_killlist = \
    SELECT id FROM documents WHERE updated_ts>=@last_reindex UNION \
    SELECT id FROM documents_deleted WHERE deleted_ts>=@last_reindex

В этом примере мы включаем в список уничтожения идентификаторы документов, обновленных с момента @last_reindex, даты последнего выполнения основного индекса, а также идентификаторы удаленных документов. Таблица documents_deleted может заполняться вручную, когда запись в documents удаляется, или может быть использован триггер.

Важно помнить о списке уничтожения, что удаления выполняются на предыдущих индексах в порядке их объявления.

Если вы выполняете последовательный поиск по индексам, дельта должна идти после основного индекса.

mysql> SELECT * FROM main,delta WHERE MATCH('...');

То же самое относится, если мы используем несколько дельт (таких как delta_daily, delta_hourly), последовательность должна быть main,delta_daily,delta_hourly, а не main,delta_hourly,delta_daily.

Список уничтожения также используется в локальных распределенных индексах, и порядок определенных индексов имеет значение и в этом случае, даже если мы выполняем параллельную обработку (используя dist_threads > 0) локальных индексов:

  index dist
  {
     local = main
     local = delta
  }

Установить Manticore Search

Установить Manticore Search