Между запросом к Manticore и окончательным результатом, отображаемым пользователю, может происходить дополнительная обработка. Поскольку в большинстве случаев результаты нужно сортировать по оценке релевантности, важно не потерять эту сортировку.
Обычный рабочий процесс с использованием Manticore Search вместе с базой данных выглядит так:
- выполнить запрос к Manticore
- из набора результатов получить список идентификаторов документов
- выполнить запрос к базе данных, используя идентификаторы документов, чтобы получить окончательный результат для вывода
Получение соответствующих записей из базы данных можно выполнить одним запросом, используя предикат IN(ids).
mysql> SELECT * FROM mytable WHERE id IN(20,10,3,4,6)
Этот тип запроса очень быстрый, но набор результатов может быть не в том порядке, который мы ожидаем. Поскольку порядок не задан, движок базы данных просто добавит записи в набор результатов, как только найдет их при поиске в таблице. Это означает, что нам нужно добавить явную сортировку в запрос, чтобы сохранить тот же порядок, который мы получили из запроса Manticore.
В MySQL отсортировать набор в нужном порядке можно с помощью ORDER BY 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->query($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 вернул результаты.
