⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.

Функция kill-list в Manticore Search

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

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

Для решения этой проблемы была введена функция kill-list . Kill-list определяет список идентификаторов документов в дельта‑индексе, который сообщает движку, что эти записи следует игнорировать в предыдущих индексах.

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

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

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

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

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

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

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

  index dist
  {
     local = main
     local = delta
  }

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

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