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

时间:2009-09-30 12:48:21

标签: postgresql full-text-search

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

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

2 个答案:

答案 0 :(得分:45)

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

(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 tablestriggers)。
  • 根据上面的步骤#2,仔细检查您要使用此映射的解析器令牌(请参阅Parsers)。

答案 1 :(得分:3)

不,停用词只能通过该文件配置。您可以使用服务器端功能来修改文件,但这需要写入文件:由postgres服务用户执行,您可能不需要。