zhparser在windows下的編譯安裝

最近應項目需求,要在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

相關文章
相關標籤/搜索