在不执行 setGroupBy 的情况下删除 sphinx 中的重复记录?

Remove duplicated records in sphinx without doing setGroupBy?

嘿,我是 sphinx 搜索的新手。

在我的查询中,我检索了 course_ids。所有课程都属于一个theme_id,但有些课程可以属于多个主题,所以有些课程是重复的。

我对我的查询设置了限制,以显示 1-20 的结果,然后是 21-40...所以 20 x 20。 但有时在这 20 个结果中有重复的结果,例如,如果从 21 到 40 有 3 个重复的结果,我想删除它们,然后用接下来的 3 个结果填充 3 个空白区域,所以查询 returns而不是 21-43。然后44-64...

我尝试了 setGroupBy(),它成功了,但我不希望课程按 course_id 排序,而是使用 setSortMode(),所以 course_ids 再次重复。

如何删除重复的记录并保持排序?

如有任何帮助,我们将不胜感激。谢谢

看起来您正在寻找的正是 REMOVE_REPEATS() 所做的。不确定它在编程语言客户端中是否可用。您可能需要改用 SphinxQL,无论如何建议使用它,因为客户端已经过时并且缺少很多功能。

这是一个例子:

没有REMOVE_REPEATS():

MySQL [(none)]> select * from testrt;
+------+------+
| id   | gid  |
+------+------+
|    1 |   10 |
|    2 |   10 |
|    3 |   20 |
|    4 |   30 |
|    5 |   30 |
+------+------+
5 rows in set (0.04 sec)

使用 REMOVE_REPEATS() 由 gid:

MySQL [(none)]> select remove_repeats((select * from testrt), gid, 0,10);
+------+------+
| id   | gid  |
+------+------+
|    1 |   10 |
|    3 |   20 |
|    4 |   30 |
+------+------+
3 rows in set (0.06 sec)

setGroupBy 有第三个选项参数,用于指定 final 排序顺序。

因此可以分组(例如)course_ids,但仍然按重量(或其他)进行最终排序,而不是默认的“@group desc”。

$client->setSortOrder( SPH_SORT_RELEVANCE );
$client->setGroupBy( 'course_id', SPH_GROUPBY_ATTR,  "@weight desc" );

仍然使用 setSortOrder,它决定保留课程中的哪些行。即首先显示排名最高的一个,它模仿权重的整体排序。