我正在使用 PostgreSQL 全文搜索来搜索传统停用词(“a”、“the”、“if”等)应该被索引和搜索的项目,这不是默认行为。例如,我可能希望我的用户找到查询“to be or not to be”的结果。
documentation表明我可以通过在 $SHAREDIR/tsearch_data/english.stop
中创建一个空的停用词字典来实现这一点(例如),但这会使部署复杂化;我希望能够使用 SQL 配置 PostgreSQL 的停用词处理。这可能吗?如果是这样,你能提供一个示例 SQL 语句吗?
最佳答案
根据您对上一个答案的评论,您可以轻松地在使用无停用词 和所有停用词 之间切换。 您可以通过自定义搜索配置实现此目的:
(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)仔细检查您要使用此映射的解析器标记。
关于postgresql - 我能否以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1497895/