PostgreSQL问题咨询:浮点值及全文搜索ts_rank均返回0
我来帮你逐个搞定这两个PostgreSQL的问题:
问题1:查询中所有条目的浮点值始终返回0?
这大概率是整数除法搞的鬼!PostgreSQL里如果两个整数做除法运算,结果会自动截断小数部分,只保留整数。比如你写SELECT 3 / 4,得到的结果是0而不是0.75。
解决方法很简单,只要把其中一个操作数转换成浮点类型就行:
- 用类型转换语法:
SELECT column1::FLOAT / column2 FROM your_table; - 或者直接给数字加
.0:SELECT column1 / column2.0 FROM your_table;
这样就能得到正确的浮点结果啦。
问题2:全文搜索ts_rank始终返回0?
看你贴的查询语句,问题出在to_tsvector('microposts.content')这部分!你给microposts.content加了单引号,PostgreSQL会把它当成一个普通的字符串字面量(也就是把字符串"microposts.content"本身转成tsvector),而不是去读取microposts表中content字段的内容。这样自然匹配不到'sit'的查询,rank肯定都是0。
只要去掉单引号就行,修正后的查询应该是这样:
my_app_development=# SELECT content, ts_rank(to_tsvector(microposts.content), query) AS rank FROM microposts, to_tsquery('sit') query WHERE microposts.content @@ query ORDER BY rank DESC LIMIT 10;
如果你的内容是英文的,建议加上文本搜索配置(比如'english'),这样分词和匹配会更准确:
my_app_development=# SELECT content, ts_rank(to_tsvector('english', microposts.content), query) AS rank FROM microposts, to_tsquery('english', 'sit') query WHERE to_tsvector('english', microposts.content) @@ query ORDER BY rank DESC LIMIT 10;
另外,如果你想要更精准的排名,可以试试ts_rank_cd函数,它会考虑词的位置距离,排名结果会更贴合实际需求。
内容的提问来源于stack exchange,提问作者Lee Eather
相关产品推荐
相关产品推荐

