5

我正在尝试实现 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  |               |            |

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

4

2 回答 2

6

这似乎是 SQL 的标准行为。

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

SELECT title, description,
setweight(to_tsvector(title), 'A'::"char") ||
setweight(to_tsvector(coalesce(description, '')), 'C'::"char")     
AS document
FROM inventory;
于 2016-04-05T15:20:03.473 回答
0

事实证明,正是 NULL 值导致了这个问题。我可以通过将搜索索引中包含的所有列设置为 NOT NULL 和 DEFAULT "" 来解决它。如果有人解释它为什么会这样运作,我很想知道。

于 2016-04-04T05:24:39.117 回答