2011-02-25 68 views
1

下面PostgreSQL的文本搜索我怎样才能得到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 

,但我真的想是的“约翰·伯纳德使用的搜索字词顺序* “记录具有较高的排名,因为”文档“中的词语以与查询相同的顺序出现。这可能吗?

例如像这样的结果:

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 

干杯 克雷格

+0

添加另一个ts_query没有通配符。然后在select中,在新查询中添加另一个to_rank_cd。对于选择性较低的查询匹配但不具有更多选择性的情况,这需要进行加入。现在,按主要等级和次要等级排序。 – 2011-02-26 20:42:43

+0

你使用的是什么版本的postgres? 'select to_tsquery('english','John:*&Bernard:*');'给出8.3 – 2011-02-28 11:21:16

+0

的语法错误好的,必须是8.4或更高 – 2011-02-28 11:58:33

回答

0

我认为你将不得不考虑涉及其他的排名机制旁边TSEARCH因为它does not handle phrases的解决方案。

如何像:

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