如果任何列在PostgreSQL全文搜索中没有数据,则to_tsvector为空

时间:2016-04-04 02:19:59

标签: postgresql search null full-text-search tsvector

我正在尝试实现Postgre SQL全文搜索,但是如果使用to_tsvector设置的任何列都为空,我遇到的问题是整个文档返回空。

我的表格如下所示:

id |   title   |   description   |
1  |   skis    |     my skis     |
2  |   bike    |                 | 

我正在创建文档:

SELECT title, description,
setweight(to_tsvector(title), 'A'::"char") ||
setweight(to_tsvector(description), 'C'::"char")     
AS document
FROM inventory

我期望看到的结果是:

title |  description  |  document  |
skis  |    my skis    |'ski':1A,3C |
bike  |               | 'bike':1A  | 

但我实际得到的是:

title |  description  |  document  |
skis  |    my skis    |'ski':1A,3C |
bike  |               |            |

这似乎是一个错误。在描述中添加任何单个字母或数字或任何内容都可以使文档正确显示,但单个列中的空值会导致整个文档为空。为什么要求描述才能搜索标题和描述?我误解了什么吗?

2 个答案:

答案 0 :(得分:3)

这似乎是SQL的标准行为。

作为一种解决方法,您可以在查询中使用COALESCE函数:

SELECT title, description,
setweight(to_tsvector(title), 'A'::"char") ||
setweight(to_tsvector(coalesce(description, '')), 'C'::"char")     
AS document
FROM inventory;

答案 1 :(得分:0)

事实证明,具体的NULL值会导致此问题。我能够通过将搜索索引中包含的所有列设置为NOT NULL和DEFAULT""来绕过它。如果有人解释为什么它的运作方式如此,我很想知道。