保留来自 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