我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?

Posted

技术标签:

【中文标题】我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?【英文标题】:Can I configure PostgreSQL programmatically to not eliminate stop words in full-text search? 【发布时间】:2010-12-02 15:27:52 【问题描述】:

我正在对一个项目使用 PostgreSQL 全文搜索,其中传统的停用词('a'、'the'、'if' 等)应该被索引和搜索,这不是默认行为。例如,我可能希望我的用户找到查询“to be or not to be”的结果。

documentation 表示我可以通过在$SHAREDIR/tsearch_data/english.stop(例如)中创建一个空的停用词字典来实现这一点,但这会使部署复杂化;我希望能够使用 SQL 配置 PostgreSQL 的停用词处理。这可能吗?如果可以,能否提供一个示例 SQL 语句?

【问题讨论】:

【参考方案1】:

不,停用词只能通过该文件进行配置。您可以拥有一个修改文件的服务器端功能,但这需要 postgres 服务用户可以写入文件,这可能是您不想要的。

【讨论】:

好的,谢谢。明确一点 - 不可能告诉 PostgreSQL 不使用 any 停用词文件?【参考方案2】:

根据您对上一个答案的评论,您可以轻松地在使用无停用词所有停用词之间切换。 您可以通过自定义搜索配置来实现这一点:

(1) 可以不使用停用词文件创建自定义词典,例如:

CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
    Template = snowball
    , Language = english
);

注意,在上面我省略了 StopWords 参数。

(2) 然后创建一个新的配置来使用你的新字典:

CREATE TEXT SEARCH CONFIGURATION public.english_nostop ( COPY = pg_catalog.english );
ALTER TEXT SEARCH CONFIGURATION public.english_nostop
   ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop;

(3) 然后,在搜索时指定要使用的配置(或者您可以每次更改default_text_search_config 选项),例如:

SELECT
    title
FROM
    articles
WHERE
    to_tsvector('english_nostop', COALESCE(title,'') || ' ' || COALESCE(body,''))
    @@ to_tsquery('english_nostop', 'how & to');

您可以在上述 SQL 中仅指定 'english' 以使用普通配置。

注意,在本例中,使用标准配置会导致通知,因为只有停用词。


但请记住以下几点:

如果您使用索引,则需要两个 - 每个配置一个。 (请参阅这些文档:tsearch tables 和 triggers)。 按照上面的第 2 步,仔细检查您希望使用此映射的解析器令牌(请参阅 Parsers)。

【讨论】:

谢谢,catchdave - 这就是我想要的。

以上是关于我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以以编程方式设置 logback 配置?

以编程方式配置 Spring Boot 应用程序

以编程方式配置 iPad IP 地址

如何以编程方式配置 WCF 已知类型?

Android:是不是可以以编程方式删除系统管理的通知?

以编程方式添加配置文件和证书