我是否可以通过编程方式配置PostgreSQL以消除全文搜索中的停用词?

tom*_*omd 35 postgresql full-text-search

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

文件表明,我可以通过创建一个空的禁用词词典做到这一点$SHAREDIR/tsearch_data/english.stop(例如),但这将部署复杂化; 我希望能够使用SQL配置PostgreSQL的停止字处理.这可能吗?如果是这样,您能提供示例SQL语句吗?

cat*_*ave 49

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

(1)您可以在不使用停用词文件的情况下创建自定义词典,例如:

CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
    Template = snowball
    , Language = english
);
Run Code Online (Sandbox Code Playgroud)

注意,在上面我遗漏了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;
Run Code Online (Sandbox Code Playgroud)

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

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

您可以'english'在上面的SQL中指定使用普通配置.

请注意,在此示例中,使用标准配置将导致通知,因为只有停用词.


但请记住以下内容:

  • 如果使用索引,则每个配置需要两个 - 一个.(参见这些文档:tsearch表触发器).
  • 根据上面的步骤#2,仔细检查要使用此映射的解析器标记(请参阅解析器).