# Preserving the order of search result set from Manticore Search

在Manticore查询和最终返回给用户的结果之间可能存在额外的处理。由于大多数情况下需要根据相关性评分进行排序，因此必须确保不丢失这种排序。



使用Manticore Search配合数据库的典型工作流程如下：
- 执行Manticore查询
- 从结果集中获取文档ID列表
- 使用文档ID执行数据库查询以获取最终输出结果


可以通过使用**IN**(ids)谓词在单个查询中从数据库获取对应的记录。


```sql
mysql> SELECT * FROM mytable WHERE id IN(20,10,3,4,6)
```


此类查询非常快速，但结果集可能不是我们预期的顺序。由于没有设置排序，数据库引擎会简单地在查找表时立即将记录添加到结果集中。这意味着我们需要在查询中显式添加排序，以保留从Manticore查询中获得的相同顺序。

在MySQL中，我们可以使用**FIELD()**函数按我们想要的方式对结果集进行排序：


```sql
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结果的顺序。简化后的代码可能如下所示：


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