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