我有一个文件名数据库,我正在尝试使用PGs全文搜索工具进行搜索。我在文件名表上运行搜索查询,问题是排名函数没有像我希望的那样对结果进行排名。为了论证,我们假设模式如下:
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'的精确匹配作为第二个结果,我猜这是因为第一个结果包含更大的结果实际搜索令牌的百分比。
在大多数情况下(如果不是全部),最重要的令牌显示为查询中的第一个令牌,所以我的问题是,有没有办法让查询中的令牌具有权重?
答案 0 :(得分:1)
有没有办法给查询中的标记一个权重?
是的,有。见the documentation;搜索"体重"。
分配权重是否是正确的选择是另一回事。听起来我觉得你真的想在索引创建和搜索中将输入中的一些数据排除到to_tsvector
,所以你不要在索引中包含那些垃圾。