在 Manticore 查询和最终结果之间可能会有额外的处理。由于在大多数情况下,兴趣在于按相关性得分排序,因此重要的是不要丢失这种排序。
使用 Manticore Search 和数据库的典型工作流程如下:
- 执行 Manticore 查询
- 从结果集中获取文档 ID 列表
- 使用文档 ID 执行数据库查询以获取输出的最终结果
从数据库中获取相应记录可以通过使用 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 查询的 ID 从存储库中检索数据,请确保不要丢失 Manticore 查询结果集提供的顺序。