PostgreSQL全文搜索前缀匹配异常:结果不符预期求解
PostgreSQL全文搜索前缀匹配异常原因解析
核心逻辑:词干提取的决定性作用
PostgreSQL全文搜索的匹配是基于词干提取后结果的,而非原词汇本身——指定的词典(此处为english)会将词汇还原为词根形式,所有查询匹配都围绕这个词根展开。
先验证animals的词干结果:
select to_tsvector('english', 'animals'); -- 输出结果: 'anim':1
可见english词典将animals词干化为anim。
为什么部分查询能匹配
返回true的三个查询:
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'anim:*'); -- true select to_tsvector('english', 'animals') @@ to_tsquery('english', 'animal:*'); -- true select to_tsvector('english', 'animals') @@ to_tsquery('english', 'animals:*'); -- true
anim:*:直接匹配词干anim的前缀,自然命中。animal:*和animals:*:to_tsquery会先对查询词做词干提取,animal和animals都会被还原为anim,最终查询等价于anim:*,因此能匹配。
为什么anima:*返回false
对于select to_tsvector('english', 'animals') @@ to_tsquery('english', 'anima:*'):
to_tsquery首先对anima做词干提取,english词典中anima的词干是**anima**(而非anim)。- 前缀查询
anima:*要求匹配词干以anima开头的结果,但animals的词干是anim,长度更短且前缀不匹配,因此返回false。
前三个查询返回false的补充说明
a:*、an:*、ani:*返回false的原因:
a和an是english词典中的停用词,会被to_tsquery过滤,最终查询为空,无法匹配任何结果。ani作为查询词时,english词典无法将其还原为有效词干,且其词干结果(ani)与animals的词干anim前缀不匹配,因此返回false。
内容的提问来源于stack exchange,提问作者Green
相关产品推荐
相关产品推荐

