PostgreSQL中plainto_tsquery英文配置词干提取异常问题咨询
PostgreSQL全文检索:english配置plainto_tsquery词干不匹配导致无结果的原因解析
核心问题根源
你遇到的无匹配结果问题,本质是生成ts_vector字段时使用的文本配置,和查询时plainto_tsquery用的配置不一致:
- 如果你的
ts_vector字段是用simple配置生成的(或未指定配置默认用simple),字段里存储的是simple词干器处理后的词;而english配置的plainto_tsquery生成的是english词干器处理后的结果,两者词干规则不同,自然无法匹配。 - 比如你提到的
create,english词干器会处理为creat,simple词干器处理schedule得到schedul,如果ts_vector里的词是原始未处理或其他配置生成的,就会出现匹配失败。
关于词干的疑问:creat是create的正确英文词干吗?
是的。PostgreSQL的english文本配置使用Snowball英文词干器,按照英文词干提取规则,create、created、creating这类词的统一词干就是creat,这是符合标准规则的结果。
解决方法
确认ts_vector的生成配置
检查生成ts_vector字段的SQL语句,比如是否是:-- 用simple配置生成 UPDATE demo SET ts_vector = to_tsvector('simple', content); -- 还是用english配置生成 UPDATE demo SET ts_vector = to_tsvector('english', content);必须保证查询和生成用完全相同的文本配置。
统一配置并重新生成ts_vector
如果希望使用english配置的全文检索,先更新ts_vector字段:UPDATE demo SET ts_vector = to_tsvector('english', content_column);之后再用english配置的查询语句:
SELECT * FROM demo WHERE ts_vector @@ plainto_tsquery('english', 'create');检查字典配置的有效性
你更新字典后无变化,大概率是因为生成ts_vector时并未使用该字典对应的文本配置。需要确认你的english配置是否关联了更新后的字典,或者直接在生成和查询时指定配置:-- 指定english配置生成ts_vector UPDATE demo SET ts_vector = to_tsvector('english', content_column); -- 指定english配置查询 SELECT * FROM demo WHERE ts_vector @@ plainto_tsquery('english', 'create');
内容的提问来源于stack exchange,提问作者Immanuel
相关产品推荐
相关产品推荐

