Полнотекстовый поиск Postgresql в очень коротких документах (имя файла)

У меня есть база данных имен файлов, в которой я пытаюсь выполнить поиск с помощью полнотекстового поиска 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» в качестве второго результата, я предполагаю, что это связано с тем фактом, что первый результат содержит больший процент фактических токенов поиска.

В большинстве случаев (если не во всех) самый важный токен отображается первым токеном в запросе, поэтому мой вопрос: есть ли способ придать токенам в запросе вес?


person Blubber    schedule 12.05.2013    source источник


Ответы (1)


есть ли способ дать токенам в запросе вес?

Да, есть. См. документацию; ищите "вес".

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

person Craig Ringer    schedule 12.05.2013
comment
Насколько я понимаю, в этой документации можно присваивать веса лексемам в tsvector, но я ничего не могу найти о присвоении весов токенам запроса. Посторонних данных нет в цвекторах, они поданы в запросе. - person Blubber; 12.05.2013