Django如何在PostgreSQL中实现日文(多字节字符串)全文搜索
PostgreSQL实现日文全文搜索解决方案
核心原理
PostgreSQL默认的全文搜索分词逻辑针对有空格分隔的拉丁语系设计,无法直接适配无空格切词的日文等多字节语言,不需要额外接入Elasticsearch,仅通过PostgreSQL原生扩展即可实现日文FTS能力。
实施步骤
1. 安装日文分词扩展
推荐使用pg_bigm扩展,采用双字(bi-gram)分词机制,对日文平假名、片假名、汉字兼容度高,适配绝大多数日文搜索场景:
- 先在PostgreSQL所在服务器安装对应版本的pg_bigm插件:例如Ubuntu可通过
apt install postgresql-<你的PG主版本号>-pg-bigm安装,CentOS可通过对应yum源安装 - 进入业务数据库执行SQL启用扩展:
CREATE EXTENSION IF NOT EXISTS pg_bigm;
2. 创建日文专属搜索配置
执行SQL自定义适配日文的文本搜索配置:
-- 复制基础配置模板 CREATE TEXT SEARCH CONFIGURATION jp_bigm (COPY = pg_catalog.simple); -- 绑定bigm分词映射规则 ALTER TEXT SEARCH CONFIGURATION jp_bigm ALTER MAPPING FOR hword, hword_part, word WITH pg_catalog.bigm;
3. 适配现有Django代码
不需要调整原有模型结构,仅需在更新搜索向量、执行搜索查询时指定刚才创建的jp_bigm配置即可:
# 更新搜索列数据,指定日文分词配置 Post.objects.update(search=SearchVector('title', config='jp_bigm')) # 日文搜索查询示例 from django.contrib.postgres.search import SearchQuery search_keyword = "検索したいキーワード" query = SearchQuery(search_keyword, config='jp_bigm') # 命中所有标题含有关键词的内容 result_list = Post.objects.filter(search=query)
可选优化
- 对分词准确率有更高要求的场景,可替换为
pg_jieba扩展,支持更精准的日文/中文词汇级分词,配置逻辑和上述流程一致,仅需替换对应分词映射规则即可 - 多字段搜索场景可组合多字段生成搜索向量:
SearchVector('title', 'content', 'description', config='jp_bigm')
内容的提问来源于stack exchange,提问作者Jvn
相关产品推荐
相关产品推荐

