Postgresql 全文搜索非常短的文档(文件名)

标签 postgresql full-text-search ranking

我有一个文件名数据库,我正在尝试使用 PG 的全文搜索工具在其中进行搜索。我在文件名表上运行搜索查询,问题是排名函数没有按照我希望的那样对结果进行排名。为了便于讨论,我们假设架构如下所示:

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 只是一堆其他术语。在大多数情况下,这仍然会返回正确的结果,因为后缀根本不在数据库中。

但是,有时查询包含一些无关信息,这些信息会影响排名功能。例如,对“a b c”的查询将返回一个包含标记“b c”的文件名作为第一个结果,而对“a”的完全匹配作为第二个结果,我猜这是因为第一个结果包含一个更大的实际搜索 token 的百分比。

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

最佳答案

is there a way to give the tokens in the query a weight?

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

分配权重是否是正确的选择是另一回事。在我看来,您确实想在索引创建和搜索过程中从 to_tsvector 的输入中排除一些数据,因此您只是不在索引中包含这些垃圾。

关于Postgresql 全文搜索非常短的文档(文件名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16504710/

相关文章:

sql - 在进行分析查询时如何避免 DISTINCT 成为拐杖?

postgresql - PgBouncer 会重用 postgresql session 序列缓存吗?

javascript - pipe() 数据到 Json 文件或到 PostgreSQL

postgresql - 使用 PostgreSQL 9.3 插入 GEOMETRY 值

c# - 全文搜索 - 有没有办法获取导致查询行的列名

mysql - 在非常小的列上进行全文搜索

r - 基于变量中前 N 个最频繁值的子集数据框

mysql - MATCH() 子句中列的顺序重要吗?

redis - 使用 Redis Sorted Sets 实现 Dense Rank

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?