最近應項目需求,要在windows下把中文全文檢索zhparser編譯到postgresql的安裝包中。可是網上的資料少之又少,即便有這方面的介紹,最後也有問題沒解決。好在最後通過幾天的努力終於作出來了。php
下面就把我編譯的過程,遇到的問題及解決方法記錄一下。git
編譯環境: windows 7 (32位) VS2010 postgresql 9.4版本
前提:github
用VS2010對postgresql進行編譯安裝。sql
1. 首先下載scws和zhparser的源碼。 數據庫
http://www.xunsearch.com/scws/download.php 下載scws-1.2.3windows
https://github.com/kerneltravel/zhparser 下載已經用vs改進的zhparser工程函數
2. 把下載的scws和zhparser源碼放在同一目錄下。工具
3. 因爲下載的scws工程文件是vs2008工程, 這裏須要把vs2008工程轉換成vs2010post
的工程文件,直接用vs2010打開scws.sln能夠自動轉換。測試
4. 用vs2010打開zhparser的工程文件zhparser.sln,此時能夠看到vs也會把scws的
工程加載進來。
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. 右擊項目,執行生成命令時,可能會提示如下錯誤。
這是因爲這個宏在定義時,後面帶有中文字符形成的,打開xdict.h文件,去掉這些中文字符。
7. 下面編譯zhparser。
一樣把上面的頭文件路徑添加到zhparser的頭文件目錄中,另外還要把在
屬性 --> 連接器 --> 常規中的’附加庫目錄’添加如下路徑:
C:\hgsql\3.0\lib; C:\Source\3.0\zhparser-master; %(AdditionalLibraryDirectories)
從新執行生成命令,提示一下錯誤:
這個頭文件在gettext工具(postgresql在編譯前會預先下載這個工具)裏,把libintl.h拷貝到pg安裝包
的include目錄裏,從新執行生成命令,在zhparser-master\Release下就生成咱們所須要的
zhparser.dll。
8. 把生成zhparser.dll拷貝到pg安裝包的lib目錄,把zhparser源碼下的三個文件
拷到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時出現的問題:
解決這一問題的方法是寫一個函數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','保障房資金壓力');
但執行第二個語句時顯示:
從上面執行結果看,zhparser並無對輸入的字符串進行正確分詞。
根據紅框的內容提示,發現是由於在pg安裝包下share/tsearch_data目錄下
沒有dict.utf8.xdb詞典形成的。
把zhparser源碼目錄下的dict.utf8.xdb拷到share/tsearch_data目錄下。
從新執行上面sql語句,結果正常。
這樣,就把zhparser在windows下成功編譯出來了。
參考文檔:https://github.com/kerneltravel/zhparser