Как я могу получить текстовый поиск postgresql, чтобы использовать порядок поисковых терминов в ранге - PullRequest
1 голос
/ 25 февраля 2011

Следующий текстовый поиск PostgreSQL

select 
    ID, DISPLAY_NAME, 
    ts_rank_cd(to_tsvector('english', display_name), query) as RANK
from 
    my_table, 
    to_tsquery('english', 'John:*&Bernard:*') as query
where 
    to_tsvector('english', display_name) @@ query
    order by RANK DESC

производит

ID    DISPLAY_NAME         RANK   
=====================================
82683 "BERNARD JOHN SMBZh" 0.05
63815 "BERNARD JOHN []zkP" 0.05
68204 "BERNARD JOHN uPmYB" 0.05
29666 "John Bernard iECx"  0.05
44256 "John Bernard DpIff" 0.05
52601 "BERNARD JOHN ivRTX" 0.05
80250 "BERNARD JOHN b'nVp" 0.0430677

, но мне бы очень хотелось, чтобы записи "John Bernard *" имели более высокий ранг, потому чтов «документе» появляются в том же порядке, что и запрос.Возможно ли это?

Например, такой результат:

ID    DISPLAY_NAME         RANK   
=====================================
29666 "John Bernard iECx"  0.10
44256 "John Bernard DpIff" 0.10
82683 "BERNARD JOHN SMBZh" 0.05
63815 "BERNARD JOHN []zkP" 0.05
68204 "BERNARD JOHN uPmYB" 0.05
52601 "BERNARD JOHN ivRTX" 0.05
80250 "BERNARD JOHN b'nVp" 0.0430677

Cheers Craig

1 Ответ

0 голосов
/ 28 февраля 2011

Я думаю, вам придется рассмотреть решение, включающее другой механизм ранжирования наряду с tsearch, так как не обрабатывает фразы .

Как насчет чего-то вроде:

create table my_table(id serial primary key, display_name text);
insert into my_table(display_name) values ('John Bernard iECx'), 
                                          ('John Bernard DpIff'), 
                                          ('BERNARD JOHN SMBZh'), 
                                          ('BERNARD JOHN b''nVp');
select
    ID, DISPLAY_NAME,
    ts_rank_cd(to_tsvector('english', display_name), query)
      *case when display_name~*'.*john bernard.*' then 2 else 1 end as RANK
from
    my_table,
    to_tsquery('english', 'John:*&Bernard:*') as query
where
    to_tsvector('english', display_name) @@ query
    order by RANK DESC;

производство:

 id |    display_name    |       rank
----+--------------------+-------------------
  1 | John Bernard iECx  | 0.200000002980232
  2 | John Bernard DpIff | 0.200000002980232
  3 | BERNARD JOHN SMBZh | 0.100000001490116
  4 | BERNARD JOHN b'nVp | 0.100000001490116
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...