乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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)買(mǎi)等信息,謹(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)論公約

        類似文章 更多