Функция списка исключений 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