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

Preserving the order of search result set from Manticore Search

Между запросом Manticore и окончательным результатом, отображаемым пользователю, может происходить дополнительная обработка. Как и в большинстве случаев, когда интересует сортировка по релевантности, важно не потерять эту сортировку.

Типичный рабочий процесс с использованием Manticore Search вместе с базой данных выглядит следующим образом:

  • выполнить запрос Manticore
  • из набора результатов получить список идентификаторов документов
  • выполнить запрос к базе данных, используя идентификаторы документов, чтобы получить окончательный результат для вывода

Получить соответствующие записи из базы данных можно одним запросом, используя предикат IN(ids).

mysql> SELECT * FROM mytable WHERE id IN(20,10,3,4,6)

Такой тип запроса очень быстрый, но набор результатов может быть не в том порядке, который мы ожидаем. Поскольку порядок не задан, движок базы данных просто добавляет записи в набор результатов сразу же, как только находит их при поиске в таблице. Это означает, что нам необходимо добавить явную сортировку в запрос, чтобы сохранить тот же порядок, который мы получили из запроса Manticore.

В MySQL мы можем использовать функцию FIELD(), чтобы отсортировать набор так, как нам нужно:

mysql> SELECT * FROM mytable WHERE id IN(20,10,3,4,6) ORDER BY FIELD(id,20,10,3,4,6).

Подобные методы существуют в других базах данных. В PostgreSQL это можно сделать несколькими способами, например, используя ORDER BY CASE, WITH ORDINALITY (9.4+) или array_position() (9.6+).

В качестве альтернативы, сохранение порядка из результата Manticore также может быть реализовано в коде приложения. Упрощённый пример кода может выглядеть так:

$ids = [];
foreach($ms_conn($manticore_query as $row)
{
   $ids[] = $row['id'];
}
$tmpdocs = [];
foreach($db_conn->query($database_query) as $row)
{
   $tmpdocs[$row['id']] = $row
}
$final_result = [];
foreach($ids as $id)
{
   $final_result[] = $tmpdocs[$id];
}

В заключение, если вы получаете данные из репозитория, используя идентификаторы из запроса Manticore, убедитесь, что не потеряете порядок, предоставленный набором результатов запроса Manticore.

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

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