第一節(jié) ICU下載和編譯
ICU 主頁(yè) : http://site./ 考慮使用MSVC2015編譯,選擇ICU4C 59.1版本 下載地址 : http://site./download/59#TOC-ICU4C-Download 
Window版編譯: 1. 解壓icu4c-59_1-src.zip 2. 進(jìn)入icu4c-59_1-src\icu\source\allinone目錄 3. 雙擊allinone.sln文件啟動(dòng)MSVC2015 選擇批生成,并選擇所有win32版本,如下圖所示: 
點(diǎn)擊生成,開(kāi)始編譯,只要版本選擇正確,編譯不會(huì)出錯(cuò)。 4. 編譯結(jié)果 進(jìn)入icu4c-59_1-src\icu目錄,如下圖: 
編譯結(jié)果位于:lib目錄和bin目錄,include是導(dǎo)出的頭文件。 5. 部署 可以將編譯結(jié)果手工部署到開(kāi)發(fā)環(huán)境中。 Mac版編譯: 1. 解壓icu4c-59_1-src.tgz 2. icu4c-59_1-src\icu\source目錄 3. 運(yùn)行configure 4. 運(yùn)行make 5. 運(yùn)行make install,或者手工部署(推薦手工部署)
第二節(jié) Tokenize自定義中文分詞器
1. 原理介紹 https://www./fts5.html 7.1. Custom Tokenizers 
重點(diǎn)是實(shí)現(xiàn)Create(),Delete()和Tokenize()三個(gè)函數(shù)。 2. 參考示例 https://github.com/TangXiaoLv/Android-Sqlite-Fts5-Tokenizer/blob/master/sqlite3/src/main/cpp/sqlite3/extra/wcicu_tokenizer.h https://github.com/TangXiaoLv/Android-Sqlite-Fts5-Tokenizer/blob/master/sqlite3/src/main/cpp/sqlite3/extra/wcicu_tokenizer.c 示例wcicu_tokenizer是一個(gè)基于ICU的中文分詞器的完整實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)可以完全copy,在Mac和Android上直接編譯,Windows用MSVC編譯時(shí)只需要做部分語(yǔ)法修正就可以編譯通過(guò)。這個(gè)分詞器依賴于上一節(jié)中ICU編譯生成的lib、dll和頭文件。
第三節(jié) Sqlite + FTS5 + 中文分詞器的集成
Sqlite與分詞器和ICU的關(guān)系可以近似的用下圖表示: 
集成步驟: 1. 編譯ICU(見(jiàn)第一節(jié)) 2. 實(shí)現(xiàn)WCICUTokenizer自定義分析器(見(jiàn)第二節(jié)) 3. 將Tokenizer引入sqlite (1)分詞器實(shí)現(xiàn): 參見(jiàn): wcicu_tokenizer.h和wcicu_tokenizer.c( 這個(gè)命名可以隨便修改,重點(diǎn)是三個(gè)函數(shù)名需要注冊(cè)要Sqlite中) Create函數(shù)聲明如下: int fts5_wcicuCreate(void *pCtx, const char **azArg, int nArg, Fts5Tokenizer **ppOut);
Delete函數(shù)聲明如下: void fts5_wcicuDelete(Fts5Tokenizer *pTok);
Tokenzier函數(shù)聲明如下: int fts_wcicu_Tokenize(Fts5Tokenizer *pTokenizer,
(2)將wcicu引入Sqlite 在sqlite3.c中導(dǎo)入分詞器頭文件 #include "wcicu_tokenizer.h"
在sqlite3.c中將wcicu注冊(cè)為build-in的分詞器,如下所示: ** Register all built-in tokenizers with FTS5. static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ struct BuiltinTokenizer { { "unicode61", {fts5UnicodeCreate, fts5UnicodeDelete, fts5UnicodeTokenize}}, { "ascii", {fts5AsciiCreate, fts5AsciiDelete, fts5AsciiTokenize }}, { "porter", {fts5PorterCreate, fts5PorterDelete, fts5PorterTokenize }}, { "wcicu", {fts5_wcicuCreate, fts5_wcicuDelete, fts_wcicu_Tokenize }}, int rc = SQLITE_OK; /* Return code */ int i; /* To iterate through builtin functions */ for(i=0; rc==SQLITE_OK && i<ArraySize(aBuiltin); i++){ rc = pApi->xCreateTokenizer(pApi,
4. 編譯sqlite,生成支持自定義分詞器的sqlite庫(kù) 開(kāi)啟SQLITE_ENABLE_FTS5和SQLITE_ENABLE_ICU標(biāo)志 途徑一:在sqlite3.h頂部加入如下兩行 #define SQLITE_ENABLE_FTS5 1 #define SQLITE_ENABLE_ICU 1
途徑二:在qt工程文件中加入DEFINES DEFINES += SQLITE_ENABLE_FTS5=1 SQLITE_ENABLE_ICU=1
第四節(jié) FTS的使用和測(cè)試
基于上一節(jié)的修改,可以編譯生成支持自定義分詞器的SQLite Shell,方便數(shù)據(jù)測(cè)試。 
1. 使用FTS5和wcicu分詞器創(chuàng)建虛表: 
2. 查看創(chuàng)建結(jié)果: 
3. 插入數(shù)據(jù): 
4. Select: 
5. Match: 
6. 查看數(shù)據(jù)庫(kù)的編碼方式: 
7. 設(shè)置 數(shù)據(jù)庫(kù)的編碼: 
注意設(shè)置編碼一定要在數(shù)據(jù)庫(kù)創(chuàng)建后,所有操作之前才有效,否則設(shè)置會(huì)無(wú)效,如下所示: 
8. Highlight 
代碼示例: QString start = QString::fromUtf8("<label style=''color:#1abc9c;''>"); QString stop = QString::fromUtf8("</label>"); cmd = QString::fromUtf8("SELECT highlight(%1, %2, '%3', '%4') as %5 " "MATCH :%5 ").arg("city") .arg(QString::fromUtf8("cityname"));
|