zhparser在windows下的编译安装
2016-12-02 17:29
393 查看
最近应项目需求,要在windows下把中文全文检索zhparser编译到postgresql的安装包中。但是网上的资料少之又少,即使有这方面的介绍,最后也有问题没解决。好在最后经过几天的努力终于做出来了。
下面就把我编译的过程,遇到的问题及解决方法记录一下。
前提:
用VS2010对postgresql进行编译安装。
1. 首先下载scws和zhparser的源码。
http://www.xunsearch.com/scws/download.php 下载scws-1.2.3
https://github.com/kerneltravel/zhparser 下载已经用vs改进的zhparser工程
2. 把下载的scws和zhparser源码放在同一目录下。
3. 由于下载的scws工程文件是vs2008工程, 这里需要把vs2008工程转换成vs2010
的工程文件,直接用vs2010打开scws.sln可以自动转换。
4. 用vs2010打开zhparser的工程文件zhparser.sln,此时可以看到vs也会把scws的
工程加载进来。
![](https://static.oschina.net/uploads/space/2016/1202/170353_IlFZ_2009022.png)
5. 先编译scws,生成libscws.lib静态库。
编译前,现在scws工程属性 --> C/C++ --> 常规的‘附加包含目录’添加头文件目录。
这里大家可根据自己安装包目录修改一下。
6. 右击项目,执行生成命令时,可能会提示以下错误。
![](https://static.oschina.net/uploads/space/2016/1202/170724_vxCd_2009022.png)
这是由于这个宏在定义时,后面带有中文字符造成的,打开xdict.h文件,去掉这些中文字符。
![](https://static.oschina.net/uploads/space/2016/1202/170851_DWji_2009022.png)
7. 下面编译zhparser。
同样把上面的头文件路径添加到zhparser的头文件目录中,另外还要把在
属性 --> 链接器 --> 常规中的’附加库目录’添加以下路径:
重新执行生成命令,提示一下错误:
![](https://static.oschina.net/uploads/space/2016/1202/171159_1t0q_2009022.png)
这个头文件在gettext工具(postgresql在编译前会预先下载这个工具)里,把libintl.h拷贝到pg安装包
的include目录里,重新执行生成命令,在zhparser-master\Release下就生成我们所需要的
zhparser.dll。
8. 把生成zhparser.dll拷贝到pg安装包的lib目录,把zhparser源码下的三个文件
![](https://static.oschina.net/uploads/space/2016/1202/171651_vWzj_2009022.png)
拷到pg安装包的share\extension目录下。
此时我们就把编译zhparser的工作完成了,下面就开始测试是否可行。
1. 打开pgsql命令行,相继执行一下sql语句。
但是执行到第三个sql语句时,数据库出现崩溃。最后经过一番跟踪发现是在zhparser.c文件中,程序执
行到下面的pstrdup时出现的问题:
![](https://static.oschina.net/uploads/space/2016/1202/172031_ut2M_2009022.png)
解决这一问题的方法是写一个函数pstrdup_call替换掉上面pstrdup函数。
替换完重新生成zhparser.dll库,替换掉拷贝到pg安装包的lib下的库。
重新执行上面sql语句成功。
2. 接着执行一下sql语句:
但执行第二个语句时显示:
![](https://static.oschina.net/uploads/space/2016/1202/172343_Fvgs_2009022.png)
从上面执行结果看,zhparser并没有对输入的字符串进行正确分词。
根据红框的内容提示,发现是因为在pg安装包下share/tsearch_data目录下
没有dict.utf8.xdb词典造成的。
把zhparser源码目录下的dict.utf8.xdb拷到share/tsearch_data目录下。
重新执行上面sql语句,结果正常。
![](https://static.oschina.net/uploads/space/2016/1202/172630_k52a_2009022.png)
这样,就把zhparser在windows下成功编译出来了。
参考文档:https://github.com/kerneltravel/zhparser
下面就把我编译的过程,遇到的问题及解决方法记录一下。
编译环境: windows 7 (32位) VS2010 postgresql 9.4版本
前提:
用VS2010对postgresql进行编译安装。
1. 首先下载scws和zhparser的源码。
http://www.xunsearch.com/scws/download.php 下载scws-1.2.3
https://github.com/kerneltravel/zhparser 下载已经用vs改进的zhparser工程
2. 把下载的scws和zhparser源码放在同一目录下。
3. 由于下载的scws工程文件是vs2008工程, 这里需要把vs2008工程转换成vs2010
的工程文件,直接用vs2010打开scws.sln可以自动转换。
4. 用vs2010打开zhparser的工程文件zhparser.sln,此时可以看到vs也会把scws的
工程加载进来。
![](https://static.oschina.net/uploads/space/2016/1202/170353_IlFZ_2009022.png)
5. 先编译scws,生成libscws.lib静态库。
编译前,现在scws工程属性 --> C/C++ --> 常规的‘附加包含目录’添加头文件目录。
C:\Source\3.0\scws\libscws; C:\hgsql\3.0\include; C:\hgsql\3.0\include\server; C:\hgsql\3.0\include\server\utils; C:\hgsql\3.0\include\server\port; C:\hgsql\3.0\include\server\port\win32; C:\hgsql\3.0\include\server\port\win32_msvc; %(AdditionalIncludeDirectories)
这里大家可根据自己安装包目录修改一下。
6. 右击项目,执行生成命令时,可能会提示以下错误。
![](https://static.oschina.net/uploads/space/2016/1202/170724_vxCd_2009022.png)
这是由于这个宏在定义时,后面带有中文字符造成的,打开xdict.h文件,去掉这些中文字符。
![](https://static.oschina.net/uploads/space/2016/1202/170851_DWji_2009022.png)
7. 下面编译zhparser。
同样把上面的头文件路径添加到zhparser的头文件目录中,另外还要把在
属性 --> 链接器 --> 常规中的’附加库目录’添加以下路径:
C:\hgsql\3.0\lib; C:\Source\3.0\zhparser-master; %(AdditionalLibraryDirectories)
重新执行生成命令,提示一下错误:
![](https://static.oschina.net/uploads/space/2016/1202/171159_1t0q_2009022.png)
这个头文件在gettext工具(postgresql在编译前会预先下载这个工具)里,把libintl.h拷贝到pg安装包
的include目录里,重新执行生成命令,在zhparser-master\Release下就生成我们所需要的
zhparser.dll。
8. 把生成zhparser.dll拷贝到pg安装包的lib目录,把zhparser源码下的三个文件
![](https://static.oschina.net/uploads/space/2016/1202/171651_vWzj_2009022.png)
拷到pg安装包的share\extension目录下。
此时我们就把编译zhparser的工作完成了,下面就开始测试是否可行。
1. 打开pgsql命令行,相继执行一下sql语句。
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;
但是执行到第三个sql语句时,数据库出现崩溃。最后经过一番跟踪发现是在zhparser.c文件中,程序执
行到下面的pstrdup时出现的问题:
![](https://static.oschina.net/uploads/space/2016/1202/172031_ut2M_2009022.png)
解决这一问题的方法是写一个函数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.dll库,替换掉拷贝到pg安装包的lib下的库。
重新执行上面sql语句成功。
2. 接着执行一下sql语句:
select ts_token_type('zhparser'); select * from ts_parse('zhparser','保障房资金压力');
但执行第二个语句时显示:
![](https://static.oschina.net/uploads/space/2016/1202/172343_Fvgs_2009022.png)
从上面执行结果看,zhparser并没有对输入的字符串进行正确分词。
根据红框的内容提示,发现是因为在pg安装包下share/tsearch_data目录下
没有dict.utf8.xdb词典造成的。
把zhparser源码目录下的dict.utf8.xdb拷到share/tsearch_data目录下。
重新执行上面sql语句,结果正常。
![](https://static.oschina.net/uploads/space/2016/1202/172630_k52a_2009022.png)
这样,就把zhparser在windows下成功编译出来了。
参考文档:https://github.com/kerneltravel/zhparser
相关文章推荐
- 使用Postgresql进行中文分词
- 润乾填报页面导入excel后增加js动作
- reactor一行代码高性能并发编程
- [CSS] No selectable effect
- python with as的用法
- 网易笔试编程-数字游戏
- 5-51 两个有序链表序列的合并 (20分)
- 万维网发布服务(w3svc)以停止。除非万维网发布服务(w3svc)
- PHP 数组操作常用函数
- IB_DESIGNABLE 和 IBInspectable 的用法
- 《javascript设计模式与开发实践》阅读笔记(7)—— 迭代器模式
- maven 开发环境 、测试环境、生产环境打包
- 轻松自动化---selenium-webdriver(python) (五)---层级定位
- Linux挂载文件系统时出现遇到问题wrong fs type
- 【未解决】安卓版的游戏崩溃了,在bugly上看不到详细堆栈
- Linux BT下载(15)-连接Tracker模块的设计和实现
- dtrace
- 配置java环境变量导致cmd不能用了
- 关于D3.js 力导向图V3和V4节点固定
- 一个简单的 java 文件流下载函数