配置同义词词典
本文为您介绍如何在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
检索同义词词典。在检索完成后,会检索出包含value
或value
同义词的结果。pgsearch.synonym_terms(synonym_id => '<synonym_id>', field => '<field>', VALUE => '<value>')
参数说明
synonym_id
:要检索的唯一的同义词词典标识符。field
:要检索的列。value
:要检索的词。
使用示例
假设同义词词典
warehouse
中,shoes
的同义词为ARRAY["socks", "boots"]
。以下示例中,将在description
列检索包含shoes
、socks
或boots
的结果。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') ] ) )