我正在使用Postgresql全文搜索一个项目,其中传统的停用词(‘a’,’the’,’if’等)应该被索引和搜索,这不是默认行为。例如,我可能希望我的用户查找“是或否”查询的结果。
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)。