PostgreSQL 16 / PolarDB-PG 16全文检索在使用to_tsvector搜索中文字符时返回无结果

后端开发 2026-07-12

我在为一个中文电商平台的PolarDB-PG 16数据库实现全文检索。我的商品表包含中文商品描述,但 to_tsquery 总是返回空结果。

下面是我的测试示例:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    description TEXT,
    search_vector TSVECTOR
);

-- Insert sample data
INSERT INTO products (name, description) VALUES
('苹果手机', '这是一款最新款的苹果智能手机,支持5G网络'),
('华为笔记本', '高性能华为笔记本电脑,适合商务办公使用');

-- Create index
CREATE INDEX idx_search_vector ON products USING GIN(search_vector);

-- Update tsvector column
UPDATE products SET search_vector = to_tsvector(description);

当我进行搜索时:

SELECT * FROM products
WHERE search_vector @@ to_tsquery('苹果');

得到的结果是空的,尽管该词确实存在于描述中。

 id | name | description | search_vector 
----+------+-------------+---------------
(0 rows)

问题: 在PostgreSQL中实现中文全文检索的推荐方式是什么?

解决方案

免责声明:我对中文一窍不通。

这里的问题在于,全文检索的设计目标是在较长的文本中寻找完整的单词。对于使用字母的语言来说,词通常由若干字母组成,并且通过空格或标点符号来分隔。

你的文本中没有空格,因此PostgreSQL的全文检索(对中文没有专门的支持)会把你的文本当作一个词来处理。

你可以通过函数 ts_debug() 看出这一点:

SELECT * FROM ts_debug('simple', '这是一款最新款的苹果智能手机,支持5G网络');

-[ RECORD 1 ]+-------------------------------
alias        | word
description  | Word, all letters
token        | 这是一款最新款的苹果智能手机
dictionaries | {simple}
dictionary   | simple
lexemes      | {这是一款最新款的苹果智能手机}
-[ RECORD 2 ]+-------------------------------
alias        | blank
description  | Space symbols
token        | ,
dictionaries | {}
dictionary   | 
lexemes      | 
-[ RECORD 3 ]+-------------------------------
alias        | numword
description  | Word, letters and digits
token        | 支持5G网络
dictionaries | {simple}
dictionary   | simple
lexemes      | {支持5g网络}

我在这里使用了“simple”文本检索配置,但使用任何其他文本检索配置,结果都会一样。

你会看到全文检索解析器把你的字符串当作由逗号分隔的两个词。

(如果该逗号是否被识别为标点字符,取决于数据库的 lc_ctype 设置 — 如果 lc_ctype"C",解析器将把整个字符串视为一个词。)

你似乎需要的是子串检索。下面的查询会返回你想要看到的结果:

SELECT id, name, description FROM products WHERE description LIKE '%苹果%';

-[ RECORD 1 ]-----------------------------------------
id          | 1
name        | 苹果手机
description | 这是一款最新款的苹果智能手机,支持5G网络

如果你需要这类查询的良好性能,能起作用的只有三元组(trigram)索引:

CREATE EXTENSION IF NOT EXISTS pg_trgm SCHEMA public;

CREATE INDEX products_pattern_idx ON products USING gin (description gin_trgm_ops);
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章