Алгоритм чередований

Мне нравиться скорость текстового поиска у мантикоре.
Но не удается разобраться.

К примеру в результате запроса, выдает релевантный контент, проблема в том, что за частую записи идут с определенного канала подряд.

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

ROW_NUMBER() OVER (PARTITION BY ch_idORDER BYtime) AS rn

Так понимаю, что это не работает… А группировать не выход…

Есть ли возможность в запросе, сделать так, чтобы записи с одного канала не шли подряд, а разбавлялись релевантными новостями с других каналов?

Можно разное. Не очень понятно, что вам нужно, т.к. непонятно что за каналы, схема таблицы, запросы, данные, почему вдруг всё идёт из одного канала. Но можете поиграться с сортировкой

mysql> drop table if exists t; create table t(a int, f text); insert into t values(1, 'a', 1); select * from t where match('a') order by a asc, weight() desc;
--------------
drop table if exists t
--------------

Query OK, 0 rows affected (0.002 sec)

--------------
create table t(a int, f text)
--------------

Query OK, 0 rows affected (0.001 sec)

--------------
insert into t values(1, 'a', 1)
--------------

Query OK, 1 row affected (0.001 sec)

--------------
select * from t where match('a') order by a asc, weight() desc
--------------

+------+------+------+
| id   | f    | a    |
+------+------+------+
|    1 | a    |    1 |
+------+------+------+
1 row in set (0.000 sec)
--- 1 out of 1 results in 111us ---

и с кастомным ранкером (expr) - Searching > Sorting and ranking | Manticore Search Manual

Если сделаете минимальный пример, который демонстрирует проблему, начиная с create table, то помочь вам будет проще.

В данный момент движок работает в режиме “Legacy mode”.
Он парсит 2 таблицы из mysql. К сожалению нет возможности создавать таблицы.
Можно изменить, но тогда на время тестов сайт перестанет работать.

Постараюсь так описать.

Результат запроса будет таким, сейчас не применяем условие для выборки. Берем все записи в талицы.

id user title
1 1 Кошка
2 1 Кошка
3 2 Кошка
4 2 Кошка
5 3 Кошка
6 3 Кошка
7 3 Кошка

Задача в том, чтобы перемешать результат.
В данный момент от 1 пользователя идут по 2 записи подряд.
Как сделать, чтобы было чередование по пользователю, исключить 2 и более записи подряд если еще есть чем разбавить…

id user title
1 1 Кошка
3 2 Кошка
5 3 Кошка
2 1 Кошка
4 2 Кошка
6 3 Кошка
7 3 Кошка

Сейчас получилось, что сперва берем по 1 записи от каждого пользователя. Как только всех пользователей перебрали, идем на второй круг и так далее.
Если нечем разбавить в конце, тогда допускаем 2 и более записи от одного пользователя.

К примеру в Mysql есть такая возможность.
Приведу пример моего запроса, он огромный(рабочий), я его сделаю проще но не факт что он будет рабочим.

SELECT * FROM (
	SELECT 
		ch.id, ch.title, n.id_f, n.title,  
		-- Генерируем порядковый номер для каждой новости внутри её канала
		ROW_NUMBER() OVER (PARTITION BY n.channel ORDER BY n.time DESC) as row_num					
	FROM channels_news n
	LEFT JOIN channels ch ON ch.id = n.channel						
) as t
	-- Сначала выводим первые новости всех каналов, затем вторые и т.д.
	ORDER BY row_num ASC, tm DESC LIMIT 50

Если есть такая возможно - здорово.

Второй вопрос. Предположим научились соблюдать чередование.

Возможно ли делать через UNION по 3 запроса.
В одном запросе, 3 запроса, каждый со своими условиями выборки.
И точно также выполнить чередование.

Одно условие на все 3 запроса - вхождение по вероятности(по title).
Далее локально
1 - запрос, берем 10 записей с наибольшим количеством просмотров
2 - запрос, берем 10 записей с наибольшим количество лайков
3 - запрос, берем 10 записей, самые свежие записи по time

Если в 1 запросе строчка есть, не включаем во 2 и 3 запрос и тд.
На выходе получаем 30 записей и исключаем 2 и более записи подряд от одного пользователя