PostgreSQL 使用jieba分词组件,实现FTS(Full Text Search)全文搜索,需要安装对应的Python版本。通过Python代码在PostgreSQL中进行jieba分词,这里遇到了很多坑,记录下来分享给大家。SELECT version();--PostgreSQL 18.1 on x86_64-windows, compiled by msvc-19.44.35221, 64-bit
CREATE LANGUAGE plpython3u;
错误: could not load library "E:/zNewAPPs/PostgreSQL/18/lib/plpython3.dll": The specified module could not be found. CONTEXT: SQL statement "CREATE FUNCTION plpython3_call_handler() RETURNS language_handler LANGUAGE c AS '$libdir/plpython3'" extension script file "plpython3u--1.0.sql", near line 3
但是在安装目录PostgreSQL/18/lib/,目录中是有这个plpython3.dll文件的,在安装PostgreSQL的时候就已经存在。打开cmd命令行工具,输入“Python”能显示版本号信息“Python 3.8.6”,这说明电脑之前本身就已经安装过Python了,并且配置了系统环境变量。难道是版本太旧了,最新的PostgreSQL 18不支持。于是下载最新版的Python:Python 3.14.2https://www.python.org/downloads/windows/
安装如下:
注意:这里记得勾选添加环境变量。
注意:这里记得勾选“pip”方便后面安装其它包或插件。
安装成功后打开cmd命令行工具,输入“Python”显示版本号信息“Python 3.14.2”。- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。
pip install jieba
# 也可使用国内的清华镜像
pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple
编写Python代码导入jieba分词包,文件名jieba_example.py,也可在Python tools中直接编码。import jiebasentence = "马斯克是特斯拉的ceo"seg_list = jieba.cut(sentence, cut_all=False)print("Default Mode: " + "/ ".join(seg_list))
# 运行py文件
# 结果:
Default Mode: 马斯克/ 是/ 特斯拉/ 的/ ceo
测试结果:分词正确。
问题就出现在这里,需要在PostgreSQL 18中使用Python语言调用jieba分词。首先创建Python语言(plpython3u):CREATE LANGUAGE plpython3u;
就报错误了:ERROR: could not load library "E:/zNewAPPs/PostgreSQL/18/lib/plpython3.dll": The specified module could not be found.就是开头说的问题,plpython3.dll模块找不到?但是明明已经存在lib目录下。开始怀疑是Python版本问题,但是现在也安装了新版本的Python 3.14.2,也不行,后面还尝试过把Python的各种dll复制到PostgreSQL安装目录的lib目录下无果。实在没办法了只能试试Dependency Walker查看下plpython3.dll的依赖。官网下载:https://www.dependencywalker.com/然后重启:postgresql-x64-18 服务。再次运行:CREATE LANGUAGE plpython3u; 终于成功了。--查看语言
SELECT * FROM pg_language
WHERE lanname = 'plpython3u';
核心踩坑点总结:PostgreSQL 的plpython3.dll并非兼容任意 Python3 版本,而是绑定了特定的 Python 版本,Windows 版 PG18 的 plpython3.dll 依赖 Python313;好了,问题终于解决了,下篇介绍在 PostgreSQL 中使用 tsvector 文本搜索向量类型结合jieba分词。
点点关注,点点爱心