powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ранжирование результатов поиска по точному вхождению строки
4 сообщений из 4, страница 1 из 1
Ранжирование результатов поиска по точному вхождению строки
    #39599401
PavelTut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!

Настроил поиск по трём столбцам таблицы: заголовок, свойства товара и описание.
Обновляется триггером:
BEGIN
NEW.fts=setweight( coalesce( to_tsvector('ru', NEW.name),''),'A') || ' ' ||
setweight( coalesce( to_tsvector('ru', NEW.property_text),''),'B') || ' ' ||
setweight( coalesce( to_tsvector('ru', NEW.description),''),'D');
RETURN NEW;
END;


Произвожу поиск так:
SELECT "product".name, ts_rank_cd(fts, to_tsquery('русские&сказки:abd'), 0) AS rank
FROM "product"
WHERE (to_tsquery('русские&сказки:abd') @@ fts)
ORDER BY "rank" DESC
LIMIT 10


Получаю:
name | rank
-------------------------------------------------------------------------------------------------------------------
Сундук со сказками. Русские сказки (подарочный комплект из 15 аудиокниг) | 2.17219
Чудесные русские сказки | 2.08084
Богатырские русские сказки | 2.08084
Русские сказки | 2.03032
Терем-теремок. Русские сказки | 2.02839
Счастливые сказки. Книга русских народных сказок и сказок русских писателей | 2.01136
Топтыгины сказки. Книга русских народных сказок и сказок русских писателей | 2.01136
Самые лучшие русские сказки | 1.97143
Русские сказки - 1 | 1.79299
Чудо чудное, диво дивное. Русские сказки (зеленая) | 1.74123
(10 rows)


Если искать как to_tsquery('русские&сказки:a') (только по заголовкам) вывод сильно не меняется:
name | rank
-------------------------------------------------------------------------------------------------------------------
Сундук со сказками. Русские сказки (подарочный комплект из 15 аудиокниг) | 2.00791
Счастливые сказки. Книга русских народных сказок и сказок русских писателей | 2
Топтыгины сказки. Книга русских народных сказок и сказок русских писателей | 2
Терем-теремок. Русские сказки | 1.57143
Богатырские русские сказки | 1.57143
Чудесные русские сказки | 1.57143
Русские сказки | 1.57143
Самые лучшие русские сказки | 1.57143
CD-ROM. Поиграем в сказку! Русские народные сказки | 1.5303
Сказки Пушкина. Русские сказки. Былины и загадки. Зарубежные сказки | 1.51136
(10 rows)


Всё норм, в первых 3-х строках два раза используется слово "сказка" и они (строки) имеют ранг 2.

Задача: выводить в первую очередь товары с точным вхождением "Русские сказки". Таких товаров штук 5 есть, но в первой десятке только один товар.
Пробовал играться с правилами ранжирования из мана:
0 (по умолчанию): длина документа не учитывается
1: ранг документа делится на 1 + логарифм длины документа
2: ранг документа делится на его длину
4: ранг документа делится на среднее гармоническое расстояние между блоками (это реализовано только в ts_rank_cd)
8: ранг документа делится на число уникальных слов в документе
16: ранг документа делится на 1 + логарифм числа уникальных слов в документе
32: ранг делится своё же значение + 1


Но без понятия механизма бесполезно.

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

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

Но вдруг можно ограничиться одним запросом?
...
Рейтинг: 0 / 0
Ранжирование результатов поиска по точному вхождению строки
    #39599443
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavelTut,

зачем отдельный запрос ? лайком задаете префикс ордербая.
а можете регесп-реплейсом по длине промежности. например.

и вообще если попользовать ts_parse , то всё в ваших руках.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with product (name) as 
(
SELECT distinct u[1] FROM (
select string_to_array(unnest (string_to_array(
$$Сундук со сказками. Русские сказки (подарочный комплект из 15 аудиокниг) | 2.17219
Чудесные русские сказки | 2.08084
Богатырские русские сказки | 2.08084
Русские сказки | 2.03032
Терем-теремок. Русские сказки | 2.02839
Счастливые сказки. Книга русских народных сказок и сказок русских писателей | 2.01136
Топтыгины сказки. Книга русских народных сказок и сказок русских писателей | 2.01136
Самые лучшие русские сказки | 1.97143
Русские сказки - 1 | 1.79299
Чудо чудное, диво дивное. Русские сказки (зеленая) | 1.74123
Сундук со сказками. Русские сказки (подарочный комплект из 15 аудиокниг) | 2.00791
Счастливые сказки. Книга русских народных сказок и сказок русских писателей | 2
Топтыгины сказки. Книга русских народных сказок и сказок русских писателей | 2
Терем-теремок. Русские сказки | 1.57143
Богатырские русские сказки | 1.57143
Чудесные русские сказки | 1.57143
Русские сказки | 1.57143
Самые лучшие русские сказки | 1.57143
CD-ROM. Поиграем в сказку! Русские народные сказки | 1.5303
Сказки Пушкина. Русские сказки. Былины и загадки. Зарубежные сказки | 1.51136$$
, E'\n')),'|') )u (u)
)

SELECT "product".name, ts_rank_cd(to_tsvector(name), to_tsquery('русские<1>сказки:abd'), 0) AS rank
FROM "product"
WHERE (to_tsquery('русские<1>сказки:abd') @@ to_tsvector(name)) OR (to_tsquery('русские&сказки:abd') @@ to_tsvector(name))
ORDER BY 
	(to_tsquery('русские<1>сказки:abd') @@ to_tsvector(name)) DESC , (to_tsquery('русские&сказки:abd') @@ to_tsvector(name))  DESC 
LIMIT 10

...
Рейтинг: 0 / 0
Ранжирование результатов поиска по точному вхождению строки
    #39599460
PavelTut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Навели на нужную мысль. Просто добавил LIKE с точным вхождением названия и отсортировал второй раз.


SELECT "product".name,
(product.name ILIKE 'русские сказки') AS rank_name,
ts_rank_cd(fts, to_tsquery('русские&сказки:abd'), 0) AS rank_all
FROM "product"
WHERE (to_tsquery('русские&сказки:abd') @@ fts)
ORDER BY "rank_name" DESC, "rank_all" DESC
LIMIT 10


Ищем как обычно, а если 'русские сказки' встречаются точно, то rank_name выдаёт true и, соответственно, выводится впереди.
...
Рейтинг: 0 / 0
Ранжирование результатов поиска по точному вхождению строки
    #39599461
PavelTut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точнее не навели, а ответили на вопрос )
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ранжирование результатов поиска по точному вхождению строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]