Частичное или полное совпадение рейтинга в текстовом поиске postgresql - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь реализовать пошаговый поиск с использованием PostgreSQL. Проблема, с которой я сталкиваюсь - это ранжирование результатов. Я бы хотел, чтобы полные совпадения оценивались выше, чем частичные, и я не знаю, как это сделать. Например, в этом запросе (чтобы показать, как вещи ранжируются, когда пользователь вводит запрос):

select
    ts_rank_cd(to_tsvector('hello jonathan'), to_tsquery('jon:*')),
    ts_rank_cd(to_tsvector('hello jonathan'), to_tsquery('jonath:*')),
    ts_rank_cd(to_tsvector('hello jonathan'), to_tsquery('jonathan:*'))

или наоборот (чтобы показать, как разные документы ранжируют один и тот же запрос)

select
    ts_rank_cd(to_tsvector('hello jon'), to_tsquery('jon:*')),
    ts_rank_cd(to_tsvector('hello jonah'), to_tsquery('jon:*')),
    ts_rank_cd(to_tsvector('hello jonathan'), to_tsquery('jon:*'))

все рейтинги возвращают 0,1. Как бы я мог сделать более полные результаты рангом выше?

1 Ответ

0 голосов
/ 18 октября 2019

Я бы попытался использовать оператор из pg_trgm , чтобы разорвать связи между ts_rank_cd. Возможно, оператор "<- >>>" (введенный в v11) будет моим первым выбором:

select
    'hello jon' <->>>  'jon:*',
    'hello jonah' <->>> 'jon:*',
    'hello jonathan'<->>>'jon:*';
 ?column? |  ?column?  | ?column? 
----------+------------+----------
        0 | 0.57142854 |      0.7

Обратите внимание, что это возвращает расстояние, а не сходство, поэтому чем ниже, тем лучше.

...