У меня есть база данных имен файлов, в которой я пытаюсь выполнить поиск с помощью полнотекстового поиска PG. Я запускаю поисковый запрос в таблице имен файлов, проблема в том, что функции ранжирования не ранжируют результаты так, как мне хотелось бы. В качестве аргумента предположим, что схема выглядит так:
create table files (
id serial primary key,
filename text,
filename_ft tsvector
);
Запрос, который я запускаю, выглядит примерно так:
select filename, ts_rank(filename_ft, query)
from files, to_tsquery('simple', 'a|b|c') as query
where query @@ name_ft
order by rank desc limit 5;
Это вернет 5 результатов с наивысшим рангом. Однако эти поисковые запросы поступают из другого процесса, и в большинстве случаев запросы содержат некоторый «мусор». Например, может быть выполнен запрос «a xxxx», где xxxxx — это просто набор других терминов. В большинстве случаев это по-прежнему возвращает правильные результаты, потому что суффикса просто нет в базе данных.
Однако иногда запрос содержит некоторую постороннюю информацию, которая портит функцию ранжирования. Например, запрос «abc» вернет имя файла, содержащее токены «bc», в качестве первого результата и точное совпадение с «a» в качестве второго результата, я предполагаю, что это связано с тем фактом, что первый результат содержит больший процент фактических токенов поиска.
В большинстве случаев (если не во всех) самый важный токен отображается первым токеном в запросе, поэтому мой вопрос: есть ли способ придать токенам в запросе вес?