PostgreSQL:如何让to_tsvector不对指定词汇执行词素归约
解决PostgreSQL to_tsvector特定词汇跳过词素归约的问题
当然可以实现这个需求,核心思路是把需要保留原词的特定词汇和其他文本分开处理,再合并结果。下面提供两种实用方案:
方案一:按词汇类型选择词典处理
通过CASE语句判断目标词汇,对特定词汇使用simple词典(仅分词,不做词素归约),其余文本继续用russian词典处理:
SELECT c.id, tsvector_agg( -- 处理姓氏,正常用俄语词典 to_tsvector('russian', coalesce(cv.data ->> 'surname', '')) || -- 处理名字:如果是指定词汇则用simple词典,否则用俄语词典 CASE WHEN cv.data ->> 'name' = 'Илья' THEN to_tsvector('simple', cv.data ->> 'name') ELSE to_tsvector('russian', cv.data ->> 'name') END ) as v FROM client c GROUP BY c.id;
注:如果有多个需要保留的词汇,把判断条件改成WHEN cv.data ->> 'name' IN ('Илья', 'Анна', 'Петр')即可。
方案二:手动构造tsvector保留原词
直接将特定词汇以原始形式添加到tsvector中,避免经过任何词典的词素归约,同时保留其他文本的正常处理:
SELECT c.id, tsvector_agg( -- 处理除特定名字外的文本 to_tsvector('russian', coalesce(cv.data ->> 'surname', '') || ' ' || CASE WHEN cv.data ->> 'name' = 'Илья' THEN '' ELSE coalesce(cv.data ->> 'name', '') END) || -- 追加特定词汇的原始形式 CASE WHEN cv.data ->> 'name' = 'Илья' THEN tsvector('"Илья"') -- 引号可保留原始大小写 ELSE ''::tsvector END ) as v FROM client c GROUP BY c.id;
这种方式更灵活,如果你需要严格保留词汇的原始大小写,用带双引号的tsvector('"Илья"')形式即可。
内容的提问来源于stack exchange,提问作者NeverSleeps
相关产品推荐
相关产品推荐

