多语言分词配方与限制
面向英文、中文(结巴 Jieba)、日文(Lindera)的完整生产级分词配置方案及已知使用限制。
本页提供可直接用于生产环境的英文、中文和日文全文 BM25 检索分词配置配方,并列出在实际运维中需要注意的关键限制事项。
配方一:带词干提取与停用词过滤的英文检索(wiki_tocken)
将 Unicode 词边界切分、NLTK 停用词过滤、Porter2 词干提取与内置维基百科词表(wiki_tocken)结合使用:
配方二:带自动触发器的英文自定义语料库模型
源自上游 pg_tokenizer 示例文档,该工作流直接基于 documents 表构建特定领域的英文词表,并通过触发器自动同步更新词频向量:
配方三:中文全文检索(jieba + 自定义模型)
处理中文文本时,推荐将 jieba 预分词器(mode = "search",enable_hmm = true)与基于业务表训练的自定义语料词表模型结合使用(以下示例采用钱钟书《围城》选段作为测试语料):
配方四:日文全文检索(lindera IPADIC)
处理日文文本时,可创建基于 Lindera IPADIC 的形态学分词模型,并配置叠字符规范化、NFKC 规范化、日文停用词性(Stop-tags)过滤以及片假名词干提取(以下示例采用夏目漱石《吾輩は猫である》选段作为测试语料):
运维注意事项与已知限制
- 对象名称命名规范:所有分词器、文本分析器、模型、停用词典和同义词典的名称只能包含字母、数字和下划线(
[A-Za-z0-9_]),且不能以数字开头。 - 事务回滚与会话级内存对象缓存:每个 PostgreSQL 后端连接都会在进程内存(
DashMap)中缓存tokenizer、text_analyzer、model、stopwords和synonym对象。由于该内存对象池未挂载到 PostgreSQL 事务回滚回调机制上,当事务执行ROLLBACK时,磁盘上的tokenizer_catalog元数据表会回滚,但当前连接的内存缓存中仍会残留刚才创建的对象。在ROLLBACK之后,请显式调用对应的drop_*函数(或重新建立数据库连接)以清理内存缓存: - 只读从库上的模型预加载:
add_preload_model会将预加载模型列表写入主节点本地的$PGDATA/pg_tokenizer目录。由于 PostgreSQL 关系表以外的文件系统文件不会通过 WAL 日志复制到从库,如果你在只读从库上也需要预加载模型,请在从库上独立执行一次add_preload_model。 - 内置大语言模型分词器的内存开销:
llmlingua2(~200 MB)、gemma2b(~100 MB)和lindera等模型会占用较多内存。在生产环境中,请务必使用add_preload_model让模型在 postmaster 主进程中仅加载一次,避免在每个连接中重复占用内存;或者优先选用仅占用几兆字节内存的自定义语料模型(create_custom_model)。