PostgreSQL 16 / PolarDB-PG 16全文检索在使用to_tsvector搜索中文字符时返回无结果
我在为一个中文电商平台的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。