Я пытаюсь вычислить ts_rank
для полнотекстового соответствия, где некоторые термины в запросе могут не совпадать с ts_vector
, с которым сопоставляется. Я хотел бы, чтобы ранг был выше в матче, где больше слов совпадают. Кажется довольно просто?
Поскольку не все термины должны совпадать, мне нужно |
операндов, чтобы дать запрос, такой как to_tsquery('one|two|three')
(если бы это было &
, все должны были бы совпадать).
Проблема в том, что значение ранга кажется одинаковым независимо от того, сколько слов совпадают. Другими словами, это увеличение, а не умножение предложений.
select ts_rank('one two three'::tsvector, to_tsquery('one'));
дает 0.0607927
.
select ts_rank('one two three'::tsvector, to_tsquery('one|two|three|four'));
дает ожидаемое нижнее значение 0.0455945
, потому что 'four' не является вектором.
Но select ts_rank('one two three'::tsvector, to_tsquery('one|two'));
дает 0.0607927
и аналогично
select ts_rank('one two three'::tsvector, to_tsquery('one|two|three'));
т 0.0607927
Я бы хотел, чтобы результат ts_rank
был выше, если больше терминов совпадают.
возможно?
Чтобы противостоять одному возможному ответу: я не могу вычислить все возможные подпоследовательности поискового запроса как пересечения, а затем объединить их все в запросе, потому что я собираюсь работать с большими запросами. Я уверен, что есть много аргументов против этого в любом случае!
Редактировать: Мне известно о ts_rank_cd
, но это не решает вышеуказанную проблему.