配置同义词词典

更新时间:

本文为您介绍如何在pgsearch插件中进行同义词词典的管理和使用。

同义词在搜索领域的存在十分必要。同义词检索和向量检索互补,可以大幅提升检索召回率。

  • 增强搜索的准确性。当用户输入某个关键词时,可能与输入词相关的结果使用了一个与之不同的关键词或短语。同义词允许搜索引擎识别这些情况,返回更准确的匹配结果。

  • 多语言支持。对于支持多种语言或方言的应用,同义词可以帮助缩小或消除词汇差异,例如:data和数据实际上是同义词。

  • 行业特定术语。特定行业或领域可能有其专有的术语,同义词可以帮助搜索引擎理解这些术语和通用的关键词之间的关系,返回更准确的匹配结果。

  • 提升用户体验。用户可能不知道或暂时想不起来某个特定的关键词,但通过使用同义词,可以找到他们想要的结果。

前提条件

  • 内核版本为v7.1.1.0及以上的AnalyticDB PostgreSQL 7.0实例。

  • 已经安装pgsearch插件。

    说明

    如您未安装,请提交工单联系工作人员协助安装(需要重启实例)。

管理同义词词典

创建同义词词典

使用pgsearch.synonyms_create函数创建一个新的同义词词典,使用时传入唯一的同义词词典标识符(synonyms_id)。

SELECT pgsearch.synonyms_create('<synonyms_id>');

使用示例

SELECT pgsearch.synonyms_create('warehouse');

删除同义词词典

使用pgsearch.synonyms_drop函数删除现有的同义词词典,使用时传入唯一的同义词词典标识符。

SELECT pgsearch.synonyms_drop('<synonyms_id>');

使用示例

SELECT pgsearch.synonyms_drop('warehouse');

插入与更新同义词词典

使用pgsearch.synonyms_set函数插入或更新(覆盖原有的)同义词词典。当前仅支持插入JSON格式的数据,其中键为主词,值是同义词列表。

SELECT pgsearch.synonyms_set('<synonyms_id>', '<jsonb_data>');

使用示例

-- 插入同义词
SELECT pgsearch.synonyms_set('warehouse', 
    '{"pc": ["personal computer", "laptop"], 
      "phone": ["telephone", "mobile"], 
      "apple": ["mac", "iphone"], 
      "shoes": ["socks", "boots"]}'
);

-- 更新同义词词典,“apples”覆盖原来的"mac", "iphone"
SELECT pgsearch.synonyms_set('warehouse', 
    '{"apple": ["apples"]}'
);

查询同义词词典

  • 使用pgsearch.synonyms_show函数查询所有同义词词典。

    SELECT * FROM pgsearch.synonyms_show();
  • 使用synonyms_list函数查询某个特定同义词词典的详细信息,使用时传入唯一的同义词词典标识符。如果需要查询特定词的同义词,传入词典参数。

    --查询特定同义词词典的详细信息
    SELECT * FROM pgsearch.synonyms_list('<synonyms_id>') ORDER BY word;
    
    --查询特定词的同义词
    SELECT * FROM pgsearch.synonyms_list('<synonyms_id>', '<word>')

使用同义词词典

  • 使用函数pgsearch.synonym_terms检索同义词词典。在检索完成后,会检索出包含valuevalue同义词的结果。

    pgsearch.synonym_terms(synonym_id => '<synonym_id>', field => '<field>', VALUE => '<value>')

    参数说明

    • synonym_id:要检索的唯一的同义词词典标识符。

    • field:要检索的列。

    • value:要检索的词。

    使用示例

    假设同义词词典warehouse中,shoes的同义词为ARRAY["socks", "boots"]。以下示例中,将在description列检索包含shoessocksboots的结果。

    SELECT * FROM mock_items WHERE description @@ pgsearch.config(
        query => pgsearch.synonym_terms(synonym_id => 'warehouse', field => 'description', VALUE => 'shoes')
    )
  • 可以在高级查询,例如布尔检索、集合检索等检索中使用pgsearch.synonym_terms()作为查询对象。

    使用示例一

    检索description列包含“book”、“shoes”或“shoes”任一同义词,且不包含“speaker”的结果。

    SELECT * FROM mock_items ORDER BY description @@ pgsearch.config(
        query => pgsearch.boolean(
            should => ARRAY[
                pgsearch.term('description:book'),
                pgsearch.synonym_terms(synonym_id => 'warehouse', field => 'description', VALUE => 'shoes')
            ],
            must_not => ARRAY[
                pgsearch.term(field => 'description', VALUE => 'speaker')
            ]
        )
    ) ;

    使用示例二

    检索description列包含“book”、“shoes”或“shoes”任一同义词的文档。

    SELECT * FROM mock_items WHERE description @@ pgsearch.config(
        query =>  pgsearch.term_set(
            terms => ARRAY[
                pgsearch.synonym_terms(synonym_id => 'warehouse', field => 'description', VALUE => 'shoes'),
                pgsearch.term(field => 'description', VALUE => 'book')
            ]
        )
    )