我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?
Posted
技术标签:
【中文标题】我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?【英文标题】:Can I configure PostgreSQL programmatically to not eliminate stop words in full-text search? 【发布时间】:2010-12-02 15:27:52 【问题描述】:我正在对一个项目使用 PostgreSQL 全文搜索,其中传统的停用词('a'、'the'、'if' 等)应该被索引和搜索,这不是默认行为。例如,我可能希望我的用户找到查询“to be or not to be”的结果。
documentation 表示我可以通过在$SHAREDIR/tsearch_data/english.stop
(例如)中创建一个空的停用词字典来实现这一点,但这会使部署复杂化;我希望能够使用 SQL 配置 PostgreSQL 的停用词处理。这可能吗?如果可以,能否提供一个示例 SQL 语句?
【问题讨论】:
【参考方案1】:不,停用词只能通过该文件进行配置。您可以拥有一个修改文件的服务器端功能,但这需要 postgres 服务用户可以写入文件,这可能是您不想要的。
【讨论】:
好的,谢谢。明确一点 - 不可能告诉 PostgreSQL 不使用 any 停用词文件?【参考方案2】:根据您对上一个答案的评论,您可以轻松地在使用无停用词和所有停用词之间切换。 您可以通过自定义搜索配置来实现这一点:
(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)。【讨论】:
谢谢,catchdave - 这就是我想要的。以上是关于我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?的主要内容,如果未能解决你的问题,请参考以下文章