2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

SQLite 之FTS5全文檢索

 卡瑞吉 2020-04-16

第一節(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ù)聲明如下:

  1. int fts_wcicu_Tokenize(Fts5Tokenizer *pTokenizer,
  2. void *pCtx,
  3. int flags,
  4. const char *pText,
  5. int nText,
  6. int (*xToken)(
  7. void *pCtx,
  8. int tflags,
  9. const char *pToken,
  10. int nToken,
  11. int iStart,
  12. int iEnd)
  13. );

(2)將wcicu引入Sqlite
在sqlite3.c中導(dǎo)入分詞器頭文件

#include "wcicu_tokenizer.h"

在sqlite3.c中將wcicu注冊(cè)為build-in的分詞器,如下所示:

  1. /*
  2. ** Register all built-in tokenizers with FTS5.
  3. */
  4. static int sqlite3Fts5TokenizerInit(fts5_api *pApi){
  5. struct BuiltinTokenizer {
  6. const char *zName;
  7. fts5_tokenizer x;
  8. } aBuiltin[] = {
  9. { "unicode61", {fts5UnicodeCreate, fts5UnicodeDelete, fts5UnicodeTokenize}},
  10. { "ascii", {fts5AsciiCreate, fts5AsciiDelete, fts5AsciiTokenize }},
  11. { "porter", {fts5PorterCreate, fts5PorterDelete, fts5PorterTokenize }},
  12. { "wcicu", {fts5_wcicuCreate, fts5_wcicuDelete, fts_wcicu_Tokenize }},
  13. };
  14. int rc = SQLITE_OK; /* Return code */
  15. int i; /* To iterate through builtin functions */
  16. for(i=0; rc==SQLITE_OK && i<ArraySize(aBuiltin); i++){
  17. rc = pApi->xCreateTokenizer(pApi,
  18. aBuiltin[i].zName,
  19. (void*)pApi,
  20. &aBuiltin[i].x,
  21. 0
  22. );
  23. }
  24. return rc;
  25. }

4.    編譯sqlite,生成支持自定義分詞器的sqlite庫(kù)

開(kāi)啟SQLITE_ENABLE_FTS5和SQLITE_ENABLE_ICU標(biāo)志
途徑一:在sqlite3.h頂部加入如下兩行

  1. #define SQLITE_ENABLE_FTS5 1
  2. #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

代碼示例:

  1. QString cmd;
  2. QString start = QString::fromUtf8("<label style=''color:#1abc9c;''>");
  3. QString stop = QString::fromUtf8("</label>");
  4. int infoColumnIndex = 4;
  5. cmd = QString::fromUtf8("SELECT highlight(%1, %2, '%3', '%4') as %5 "
  6. "FROM %1 "
  7. "WHERE %1 "
  8. "MATCH :%5 ").arg("city")
  9. .arg(infoColumnIndex)
  10. .arg(start)
  11. .arg(stop)
  12. .arg(QString::fromUtf8("cityname"));

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多