PostgreSQL全文搜索中ts_vector匹配ts_query返回false而非true的问题求助
PostgreSQL全文搜索中ts_vector匹配ts_query返回false而非true的问题求助
各位大佬好!我正在学习PostgreSQL里用ts_vector和ts_query做全文搜索,处理字符串文本的时候遇到个头疼的问题:明明觉得应该匹配成功返回true,结果却得到了false。
我的执行代码和结果如下:
db_two=# select db_two-# to_tsvector( db_two(# 'I ate a lot of ice cream today.' db_two(# ) @@ to_tsquery('eat') result; result -------- f (1 row)
我刚接触PostgreSQL不久,实在搞不懂哪里出问题了,有没有大佬能帮我看看呀?
问题原因分析
大概率是文本搜索配置的问题!PostgreSQL的全文搜索会对单词做词干提取(比如把动词过去式ate转化为原形eat),但这需要依赖对应的语言配置(比如英语配置english)。如果你的数据库默认用的是simple配置,它只会做简单的分词,不会处理词形变化,那ate和eat会被当成两个完全不同的词,自然匹配不上。
解决方法
- 先检查当前默认的文本搜索配置:
show default_text_search_config;
如果结果是simple,那就是这个原因没错了。
- 方法一:查询时显式指定英语配置
修改查询语句,给to_tsvector和ts_query都加上english配置参数:
select to_tsvector('english', 'I ate a lot of ice cream today.') @@ to_tsquery('english', 'eat') as result;
执行这个语句应该就能返回t(true)了。
- 方法二:修改数据库默认配置(永久生效)
如果之后经常要处理英语文本,可以直接把数据库的默认文本搜索配置改成english:
ALTER DATABASE db_two SET default_text_search_config = 'english';
修改后需要重新连接数据库才能生效,之后再执行你原来的查询语句也能得到正确结果了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

