Как ранжировать массивы по наиболее содержательным и менее используемым операторам && postgres - PullRequest
0 голосов
/ 27 апреля 2018

Я рассчитываю ранжировать мои массивы от наивысшего совпадения к наименьшему совпадению с помощью оператора перекрытия &&, что-то вроде,

SELECT tags 
FROM users, **rank here AS rank** 
WHERE users.tags && query 
ORDER BY rank DESC;

Я тогда надеялся, что смогу объединить это как мои ts_rank результаты полнотекстового поиска, если это возможно? Я не был уверен, поможет ли мне функция rank().

Заранее спасибо.

EDIT

Ожидаемые результаты - это что-то вроде первого получения значения с плавающей точкой из полнотекстового поиска в совершенно другом столбце;

SELECT 
    content, ts_rank(to_tsvector(content), query) AS rank 
FROM 
    microposts, 
    plainto_tsquery('dc comics') query 
WHERE 
    microposts.content @@ query 
ORDER BY 
    rank DESC;

Что бы дать что-то вроде;

╔═════════════════════════════════════════════════╤═══════════╗
║ content                                         │ rank      ║
╠═════════════════════════════════════════════════╪═══════════╣
║ dc comics dc comics dc comics dc comics         │ 0.986064  ║
╟─────────────────────────────────────────────────┼───────────╢
║ dc comics dc comics dc comics                   │ 0,911679  ║
╟─────────────────────────────────────────────────┼───────────╢
║ dc comics dc comics dc comics went to the beach │ 0.603393  ║
╟─────────────────────────────────────────────────┼───────────╢
║ dc comics dc comics went to the beach\r         │ 0.340005  ║
╟─────────────────────────────────────────────────┼───────────╢
║                                                 │           ║
╟─────────────────────────────────────────────────┼───────────╢
║ went to the beach. dc comics                    │ 0.0991032 ║
╟─────────────────────────────────────────────────┼───────────╢
║ It was great. went to the beach dc comics       │ 0.0991932 ║
╚═════════════════════════════════════════════════╧═══════════╝

Затем выполняется ранжирование тегов на основе наиболее подходящего кода с таким кодом без ранжирования;

SELECT tags 
FROM users 
WHERE users.tags && ARRAY['chicken', 'cat', 'apple', 'monkey'];

И ожидал что-то вроде;

╔═══════════════════════════════╤══════╗
║ tags                          │ rank ║
╠═══════════════════════════════╪══════╣
║ {chicken, cat, apple, monkey} │ 4    ║
╟───────────────────────────────┼──────╢
║ {chicken, cat, apple}         │ 3    ║
╟───────────────────────────────┼──────╢
║ {chicken, cat}                │ 2    ║
╟───────────────────────────────┼──────╢
║ {chicken}                     │ 1    ║
╚═══════════════════════════════╧══════╝

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

Обновление Я думаю, что для этого лучше всего просто использовать @> метод содержит для строгого поиска и, возможно, ленивый поиск с использованием &&.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...