to_tsvector 如果任何列在 PostgreSQL 全文搜索中没有数据则为空
to_tsvector is empty if any column has no data in PostgreSQL Full Text Search
我正在尝试实现 Postgre SQL 全文搜索,但我 运行 遇到了一个问题,如果使用 to_tsvector 设置的任何列是空.
我有一个 table 如下所示:
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 | | |
这似乎是一个错误。在描述中添加任何单个字母或数字或任何内容都可以使文档正确显示,但单个列中的空值会导致整个文档为空。为什么需要描述才能根据标题和描述进行搜索?我是不是误会了什么?
原来是NULL值导致了这个问题。我能够通过将搜索索引中包含的所有列设置为 NOT NULL 和 DEFAULT "" 来解决这个问题。如果有人能解释为什么它会这样运作,我很想知道。
这似乎是SQL的标准行为。
作为解决方法,您可以在查询中使用函数 COALESCE:
SELECT title, description,
setweight(to_tsvector(title), 'A'::"char") ||
setweight(to_tsvector(coalesce(description, '')), 'C'::"char")
AS document
FROM inventory;
我正在尝试实现 Postgre SQL 全文搜索,但我 运行 遇到了一个问题,如果使用 to_tsvector 设置的任何列是空.
我有一个 table 如下所示:
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 | | |
这似乎是一个错误。在描述中添加任何单个字母或数字或任何内容都可以使文档正确显示,但单个列中的空值会导致整个文档为空。为什么需要描述才能根据标题和描述进行搜索?我是不是误会了什么?
原来是NULL值导致了这个问题。我能够通过将搜索索引中包含的所有列设置为 NOT NULL 和 DEFAULT "" 来解决这个问题。如果有人能解释为什么它会这样运作,我很想知道。
这似乎是SQL的标准行为。
作为解决方法,您可以在查询中使用函数 COALESCE:
SELECT title, description,
setweight(to_tsvector(title), 'A'::"char") ||
setweight(to_tsvector(coalesce(description, '')), 'C'::"char")
AS document
FROM inventory;