You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:45:37