postgresql - 我能否以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词?

标签 postgresql full-text-search

我正在使用 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 tablestriggers)。
  • 按照上面的第 2 步(参见 Parsers)仔细检查您要使用此映射的解析器标记。

关于postgresql - 我能否以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1497895/

相关文章:

sql-server - SQL Server 跨多个表的全文查询 - 为什么这么慢?

django - Django项目中全文搜索的搜索引擎

c# - 匹配大型文本数据集——如何更快地匹配?

php - mysql 和 php FULLTEXT 搜索做得更多,但做得不多?

postgresql - 删除 "on delete cascade"约束

postgresql - 如何从 hstore 数据创建数据透视表?

json - 更新 jsonb 列

elasticsearch - Elasticsearch搜索Java API没有给出正确的结果

python-3.x - 软件包安装失败 - OsX 中的 psycopg2

postgresql - Seam 2.2GA + JBoss AS 5.1GA + Postgres 8.4