PostgreSQL的全文搜索

问题描述:

我在这我想使用的PG全文搜索功能来搜索文件名的数据库。我正在一个文件名表上运行搜索查询,问题是排名函数没有按照我希望的那样对结果进行排名。为了讨论的方便,我们假设该架构是这样的:PostgreSQL的全文搜索

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'的精确匹配作为第二个结果,我猜这是由于第一个结果包含更大实际搜索令牌的百分比。

在大多数情况下(如果不是全部)的最重要的标志出现在查询中的第一个标记,所以我的问题是,有没有办法让在查询中表征的加权?

有没有办法让在查询中表征的加权?

是的,有。见the documentation;搜索“体重”。

分配权重是否是正确的选择是另一回事。在我看来,你真的想在索引创建和搜索中排除输入中的一些数据到to_tsvector,所以你不要在索引中包含那些垃圾。

+0

据我了解,文档,你可以分配权重中的tsvector以语意,但我无法找到有关的查询符号分配权重东西。无关的数据不在tsvectors中,它在查询中提供。 – Blubber 2013-05-12 09:08:10