【问题标题】:Postgresql full text search on really short documents (filename)对非常短的文档(文件名)进行 Postgresql 全文搜索
【发布时间】:2013-05-12 06:13:17
【问题描述】:

我有一个文件名数据库,我正在尝试使用 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”的查询,其中 xxxx 只是一堆其他术语。在大多数情况下,这仍然会返回正确的结果,因为后缀根本不在数据库中。

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

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

【问题讨论】:

    标签: postgresql full-text-search ranking


    【解决方案1】:

    有没有办法给查询中的标记赋予权重?

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

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

    【讨论】:

    • 据我了解,您可以在 tsvector 中为词位分配权重,但我找不到任何有关为查询标记分配权重的信息。无关数据不在 tsvector 中,而是在查询中提供。
    猜你喜欢
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多