配置停用词词典

更新时间:

pgsearch内置了中文CN_SIMPLE和英文EN_SIMPLE的停用词词典。本文介绍如何配置和使用停用词词典。

版本限制

内核版本为7.2.0.1及以上的AnalyticDB for PostgreSQL7.0版实例。

说明

如何查看内核版本,请参见查看内核小版本。如您的实例不满足上述版本要求,建议您升级内核小版本

更新词典

停用词的词典存储于pgsearch.stopword_dict表中。更新该表的数据,可以实现停用词的添加、变更或删除。jieba分词器的默认词典为default。您也可以添加多个停用词词典。添加停用词时,必须指定词典。如果指定了default以外的词典且该词典不存在,将新增词典并在新增的词典中添加停用词;如果该词典已存在,则直接在该词典中添加停用词。如果您在更新或删除停用词时未指定词典,则将在所有词典中检索并更新或删除指定的停用词。

  • 向默认词典中插入、更新或删除停用词。

    -- 插入停用词“的”需要指定默认词典“default”
    INSERT INTO pgsearch.stopword_dict(dict,word) VALUES('default','的')
    
    -- 删除默认词典的停用词“的”
    DELETE FROM pgsearch.stopword_dict WHERE dict = 'default' AND word='的';
    
    -- 更新默认词典的停用词“的”
    UPDATE pgsearch.stopword_dict SET word = '一个' WHERE dict = 'default' AND word = '的';
  • 向指定词典user_stop_cn中插入、更新或删除停用词。

    -- 插入停用词“的”
    INSERT INTO pgsearch.stopword_dict(dict, word) VALUES('user_stop_cn', '的');
    
    -- 删除停用词“的”
    DELETE FROM pgsearch.stopword_dict WHERE dict = 'user_stop_cn' AND word='的';
    
    -- 更新停用词为 “是”
    UPDATE pgsearch.stopword_dict SET word = '一个' WHERE dict = 'user_stop_cn' and word = '的';
说明

词典名称列dict和停用词列word为表的联合主键。因此无法向同一个词典中插入重复的停用词。

加载词典

更新词典后,需要调用SELECT pgsearch.reload_stopword_dict()将词典重载到内存中。以下示例中的user_stop_cn为词典名称。

SELECT pgsearch.reload_stopword_dict('user_stop_cn');

将词典加载到内存后,还需要按顺序完成以下两个步骤,方能使停用词词典对现有数据生效。

  1. 已有的数据库会话连接需要断开并重新连接。

  2. 更新词典不会影响已写入到表中的数据。如果希望词典对已有数据生效必须重建索引。

使用词典创建索引

在创建BM25索引时,可以通过stopword参数为jieba分词器指定停用词词典。

CALL pgsearch.create_bm25(
    index_name => '<index_name>',
    table_name => '<table_name>',
    text_fields => pgsearch.field('<column_name>', tokenizer=>pgsearch.tokenizer('jieba', SEARCH=>false, dict=>'<dict_name>', stopword=>'<stopword_dict_name>'))
);

查看停用词过滤效果

查看指定停用词词典的分词效果。

SELECT pgsearch.tokenizer(pgsearch.tokenizer('jieba', stopword=>'user_stop_cn'), '同一个世界');