在 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 查询结果集提供的顺序。