我正在使用PostgreSQL全文搜索一个项目,其中传统的停止词('a','the','if'等)应该被索引和搜索,这不是默认行为。例如,我可能希望我的用户找到查询的结果“是或不是”。
documentation表示我可以通过在$SHAREDIR/tsearch_data/english.stop
中创建一个空的停用词词典来实现这一点(例如),但这会使部署复杂化;我希望能够使用SQL配置PostgreSQL的停止字处理。这可能吗?如果是这样,你能提供一个示例SQL语句吗?
答案 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'
以使用普通配置。
注意 ,在此示例中,使用标准配置会产生通知,因为只有停用词。
但请注意以下几点:
答案 1 :(得分:3)
不,停用词只能通过该文件配置。您可以使用服务器端功能来修改文件,但这需要写入文件:由postgres服务用户执行,您可能不需要。