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

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

author image

Текстовые данные обычных индексов неизменяемы, что означает, что для обновления данных нам необходимо выполнить полную переиндексацию. Во многих случаях переиндексация может занимать длительное время. Для этого используется 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