Удалить дублированные записи в sphinx, не делая setGroupBy? - PullRequest
0 голосов
/ 22 января 2020

Эй, я новичок в поиске сфинксов.

В моем запросе я получаю course_ids. Все курсы принадлежат theme_id, но некоторые из них могут принадлежать более чем одной теме, поэтому некоторые из них дублируются.

Я установил ограничения для моего запроса, чтобы отображать результаты 1-20, а затем 21- 40 ... Итак, 20 на 20. Но иногда в этих 20 результатах есть дублированные результаты, поэтому, например, если из 21 из 40 есть 3 дублированных результата, я хочу удалить их, а затем заполнить 3 пустых пространства следующими 3 результатами. поэтому запрос возвращает вместо 21-43. Затем 44-64 ...

Я попробовал setGroupBy (), и это сработало, но я не хочу, чтобы курсы сортировались по course_id, а с setSortMode (), поэтому course_ids снова дублируются.

Как удалить дублирующиеся записи и сохранить сортировку?

Буду признателен за любую помощь. Спасибо

Ответы [ 2 ]

0 голосов
/ 22 января 2020

setGroupBy имеет третий аргумент и параметр для указания порядка сортировки final .

Таким образом, можно сгруппировать (например) course_ids, но все равно выполнить окончательную сортировку по весу (или как угодно), а не по умолчанию '@group des c'.

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

По-прежнему использовать setSortOrder, который определяет, какой из строк из курса, сохраняется. Ie показывает наивысший ранг первым, что имитирует общую сортировку веса.

0 голосов
/ 22 января 2020

Похоже, что вы ищете именно то, что делает 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)
...