⚠️ 此页面为自动翻译,翻译可能不完美。

Preserving the order of search result set from Manticore Search

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

安装Manticore Search

安装Manticore Search