Postgres Generated Column未更新异常问题求助
PostgreSQL生成列(Generated Column)部分为空的原因分析
核心原因是英语分词的停用词过滤机制导致的。你的生成列使用了to_tsvector('english', coalesce("value", '')),而PostgreSQL的english文本搜索配置会自动过滤掉英语中的停用词——这类词汇是语义上无实际意义的常用词(比如a、some、the等),处理后不会生成任何tsvector条目,最终表现为空值。
对应你的数据逐一验证:
- id=1的
value='A':属于英语停用词,to_tsvector('english', 'A')返回空tsvector - id=2的
'B'、id=3的'C':不属于停用词,正常生成对应向量 - id=4的
'some':是英语停用词,处理后为空 - id=5的
'thing':不属于停用词,正常生成向量
关于其他奇怪现象的解释
- 删除重建列结果相同:生成列的计算逻辑由表达式固定,无论何时创建,只要
value是停用词,计算结果就为空,和列的创建时机无关。 - 更新value再改回后向量变空:当你将
value改为非停用词时,函数会生成有效向量;改回停用词原值后,函数再次过滤该词,向量自然变回空。
解决方案(按需选择)
如果需要保留这类停用词的向量,可以:
- 使用无停用词的
simple词典:将生成列表达式改为to_tsvector('simple', coalesce("value", '')),该词典会对所有词汇进行索引,不会过滤任何内容 - 自定义文本搜索配置,移除不需要的停用词
内容的提问来源于stack exchange,提问作者user2659205
相关产品推荐
相关产品推荐

