前言:
最近工作上需要把pg数据库的中文分词zhparser插件安装在Windows使用,网上查询一番后,发现相关文章和解决办法很少,存在的资料多半是n年之前的了。在反复查阅参考资料以及自己不断试错后,最终还是成功解决了问题,现将经验分享如下。
环境配置:
- Windows 10 64位
- PostgreSQL 12
- Visual Studio 2024
1、scws和zhparser源码下载
要使用zhparser插件必须要先编译scws,scws下载地址:http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2
zhparser工程下载地址:https://github.com/kerneltravel/zhparser (已使用vs改进)
2、将scws文件夹和zhparser文件夹放在同一层目录下(注意名称)
3、编译scws
- 打开文件夹 scws\win32\scws.sln文件,点击确定,将工程文件自动升级到当前可用版本。
- 升级后关闭工程,再次点开文件夹 zhparser-master\zhparser.sln文件,这样我们需要的两个工程都显示在这里了。
- 添加文件目录:右键解决方案资源管理器中libscws —>属性 —>C/C++ —>常规下的附加包含目录,将下面路径添加进去。(查看自己的路径进行修改)
D:\project\words_voctor\scws\libscws
D:\PostgreSQL\12\include
D:\PostgreSQL\12\include\server
D:\PostgreSQL\12\include\server\utils
D:\PostgreSQL\12\include\server\port
D:\PostgreSQL\12\include\server\port\win32
D:\PostgreSQL\12\include\server\port\win32_msvc
%(AdditionalIncludeDirectories)
- 如果你使用的是64位系统,那么同样在这个属性页面,点击窗口右上角的“配置管理器”,新建活动解决方案平台,选择新平台“x64”,点击确定。
- 为了避免生成报错,找到打开xdict.h文件,将其中的中文注释删除。
- 此时右键项目点击生成,我们会得到一个错误,出现在“__cdecl logf(_In_ float _X);”处。找到config_win32.h文件,注释掉以下logf定义的代码行。再次右键项目点击生成即可成功编译。
4、编译zhparser
- 先把前文提到过的文件路径按照同样的方法添加到zhparser中,另外还要在 属性—> 链接器 —> 常规 —> 附加库目录 添加以下路径:
D:\PostgreSQL\12\lib
D:\linshi\words_voctor\zhparser-master
%(AdditionalLibraryDirectories)
- 将postgresql软件文件夹中的postgres.lib 和scws编译后生成的libscws.lib文件拷贝到zhparser文件夹下,替换原来的旧文件。 此时我们已经能够进行正常编译,但是为了避免后续在数据库应用插件时出错,我们找到zhparser.c文件并打开,查找pstrdup函数,重新在上面写一个pstrdup_call函数替换掉pstrdup。
char *pstrdup_call(const char *src)
{
char *dst;
int len;
if (src == NULL)
return NULL;
len = strlen(src) + 1;
dst = (char *) palloc(len);
memcpy(dst, src, len);
return dst;
}
- 执行生成命令,最终在zhparser-master\x64\Release下找到生成的 zhparser.dll文件。
5、 补全文件
- 把zhparser.dll复制到到postgresql文件夹中的lib目录,再把zhparser-master下的 zhparser.control 、zhparser --1.0.sql 、zhparser --unpackaged --1.0.sql 这三个文件拷贝到postgresql文件夹的share\extension目录下。
- 将rules.utf8.ini 和 dict.utf8.xdb 拷贝到 Postgresql安装目录的 \share\tsearch_data
6、测试插件
打开psql,执行测试语句。
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = 'zhparser');
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
如果没有报错则说明安装成功啦
参考文档:https://github.com/kerneltravel/zhparser