Разбавить поиск по пользователям

WITH RankedMessages AS (
    SELECT 
	n.id,
        n.id_u,
        n.time,
        n.title_prev,
        ROW_NUMBER() OVER (PARTITION BY n.id_u ORDER BY n.time DESC) AS rn
    FROM 
        indexnews n
	WHERE n.approve = 1
)
SELECT 
        id,
        id_u,
        time,
        title_prev
FROM 
    RankedMessages
ORDER BY 
    rn, time DESC, id_u

В mysql, вытаскиваем по 1 последней записи от каждого пользователя, как все уникальные публикации по 1 на одного пользователя достали. Выстраиваем таким образом, чтобы сперва было чередование.

  • Не должно получиться так, что 2 и более новости подряд были от одного пользователя
  • Допускается по 2 и более подряд, когда у других пользователей больше нет публикаций. Чем ближе конец, тем чаще будут чередоваться новости от одних и тех же пользователей.

Попробовал выполнить тоже самое с мантикоре, ничего не вышло. Попытался с нейросетью, множество вариантов. Ничего не выходит…

Может кто подскажет какой лучше вариант реализации подобного?

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

Попробовал выполнить тоже самое с мантикоре, ничего не вышло

А как пробовали? Кастомный ранкер использовали?

WITH RankedMessages AS (
    SELECT 
        n.id,
        n.id_u,
        n.time,
        n.title_prev,
        ROW_NUMBER() OVER (PARTITION BY n.id_u ORDER BY n.time DESC) AS rn
    FROM 
        news n
)
SELECT 
        id,
        id_u,
        time,
        title_prev
FROM 
    RankedMessages
ORDER BY 
    rn, time DESC

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

Как такое возможно выполнить на мантикоре?

SELECT * FROM indexnews WHERE MATCH('@title_prev \"{$title}\"/0.4')

Тут просто достаем схожие записи, индекс indexnews изначально был сформирован с сортировкой по времени от большего к меньшему.

Быть может стоит попробовать сделать такой запрос для формирования индекса. Правильно это будет или стоит делать это в запросе к индексу?
Как в таком случаи верно построит запрос к индексу?

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

Сперва, данная логика применима к публикациям за последние 3 месяца, когда записей не осталось, достаем глубже на 3 месяца.

(myenv) root@desktop:~# sudo -u manticore indexer --all --rotate
Manticore 7.4.6 b2ff82920@25022808 (columnar 4.1.1 25f4706@25022806) (secondary 4.1.1 25f4706@25022806) (knn 4.1.1 25f4706@25022806)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2024, Manticore Software LTD (https://manticoresearch.com)

using config file '/etc/manticoresearch/manticore.conf'...
indexing table 'indexnews'...
ERROR: table 'indexnews': sql_query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ROW_NUMBER() OVER (PARTITION BY n.id_u ORDER BY n.time DESC) AS rn              ' at line 1 (DSN=mysql://User:***@localhost:3306/Baza).
total 0 docs, 0 bytes
total 0.010 sec, 0 bytes/sec, 0.00 docs/sec
total 0 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 0 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg

Попытался перенести туже логику с mysql, в запрос для формирования индекса. Увы, не выходит.

Возможно сгенерировать индекс следующим образом.

Сортировка по time от большего к меньшему, если следующая запись содержит тот же id_user, разбавить, взять запись ранее добавленную от другого пользователя? А уже после нее вставить тут которая шла с тем же id_user.

Так все записи перебрать и выстроить их должным образом…

только если вы напишите свою функцию ранжирования Extensions > UDFs and Plugins > UDF | Manticore Search Manual и будете использовать ее в sub-select Searching > Sub-selects | Manticore Search Manual

Немного спутал. Не вариант делать это при формирования индекса, при выборке релевантного контента. Все будет также, в плане будут моменты когда несколько публикаций от одного пользователя подряд.

Про функции. Не совсем понял, возможно написать свою функцию и из php обращаться к ней для работы с индексом?

Через sql запрос manticore?