当前位置:   article > 正文

SQLite 之FTS5全文检索

fts5

第一节 ICU下载和编译


ICU 主页 : http://site.icu-project.org/
考虑使用MSVC2015编译,选择ICU4C 59.1版本
下载地址 : http://site.icu-project.org/download/59#TOC-ICU4C-Download

Window版编译:
1.    解压icu4c-59_1-src.zip
2.    进入icu4c-59_1-src\icu\source\allinone目录
3.    双击allinone.sln文件启动MSVC2015
选择批生成,并选择所有win32版本,如下图所示:

点击生成,开始编译,只要版本选择正确,编译不会出错。
4.    编译结果
进入icu4c-59_1-src\icu目录,如下图:

编译结果位于:lib目录和bin目录,include是导出的头文件。
5.    部署
可以将编译结果手工部署到开发环境中。
Mac版编译:
1.    解压icu4c-59_1-src.tgz
2.    icu4c-59_1-src\icu\source目录
3.    运行configure
4.    运行make
5.    运行make install,或者手工部署(推荐手工部署)


第二节 Tokenize自定义中文分词器


1.    原理介绍
https://www.sqlite.org/fts5.html
7.1. Custom Tokenizers

重点是实现Create(),Delete()和Tokenize()三个函数。
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是一个基于ICU的中文分词器的完整实现,这个实现可以完全copy,在Mac和Android上直接编译,Windows用MSVC编译时只需要做部分语法修正就可以编译通过。这个分词器依赖于上一节中ICU编译生成的lib、dll和头文件。


第三节 Sqlite + FTS5 + 中文分词器的集成


Sqlite与分词器和ICU的关系可以近似的用下图表示:

集成步骤:
1.    编译ICU(见第一节)
2.    实现WCICUTokenizer自定义分析器(见第二节)
3.    将Tokenizer引入sqlite
(1)分词器实现:
参见:  wcicu_tokenizer.h和wcicu_tokenizer.c( 这个命名可以随便修改,重点是三个函数名需要注册要Sqlite中)
Create函数声明如下:

int fts5_wcicuCreate(void *pCtx, const char **azArg, int nArg, Fts5Tokenizer **ppOut);

Delete函数声明如下:

void fts5_wcicuDelete(Fts5Tokenizer *pTok);

Tokenzier函数声明如下:

  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中导入分词器头文件

#include "wcicu_tokenizer.h"

在sqlite3.c中将wcicu注册为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库

开启SQLITE_ENABLE_FTS5和SQLITE_ENABLE_ICU标志
途径一:在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

 


第四节 FTS的使用和测试


基于上一节的修改,可以编译生成支持自定义分词器的SQLite Shell,方便数据测试。

1.    使用FTS5和wcicu分词器创建虚表:

2.    查看创建结果:

3.    插入数据:

4.    Select:

5.    Match:

6.    查看数据库的编码方式:

7.    设置 数据库的编码:

注意设置编码一定要在数据库创建后,所有操作之前才有效,否则设置会无效,如下所示:

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"));

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/492397
推荐阅读
相关标签
  

闽ICP备14008679号