2021SC@SDUSC

文章目录

  • 简介
  • 代码分析

简介

承接上文SQLite源代码分析----------分词器①,接下来我们介绍Tokenizer的另外一个模块:Porter_Tokenizer;
       除了“simple”分词器之外,FTS源代码还提供了一个使用波特词干算法(porter stemming algorithm)的分词器。此分词器使用相同的规则将输入文档分隔为术语,包括将所有术语折叠为小写,但也使用波特词干算法将相关的英语单词简化为公共词根。例如,使用与上面一段相同的输入文档,Porter分词器提取以下标记:“right now thei veri frustrat”。尽管其中一些术语甚至不是英语单词,但在某些情况下,使用它们构建全文索引比简单标记器产生的更容易理解的输出更有用。使用波特标记器,文档不仅匹配全文查询,如"MATCH ‘Frustrated’",还匹配查询如 “MATCH ‘Frustration’”,因为”Frustration“这个词被波特词干算法简化为”frustrat“就像”Frustrated“一样。因此,在使用波特分词器时,FTS不仅能够找到查询术语的精确匹配,而且能够找到与类似的英语术语匹配的词。
举例说明“simple”和“porter”分词器之间的区别:

-- Create a table using the simple tokenizer. Insert a document into it.
CREATE VIRTUAL TABLE simple USING fts3(tokenize=simple);
INSERT INTO simple VALUES('Right now they''re very frustrated');-- The first of the following two queries matches the document stored in
-- table "simple". The second does not.
SELECT * FROM simple WHERE simple MATCH 'Frustrated';
SELECT * FROM simple WHERE simple MATCH 'Frustration';-- Create a table using the porter tokenizer. Insert the same document into it
CREATE VIRTUAL TABLE porter USING fts3(tokenize=porter);
INSERT INTO porter VALUES('Right now they''re very frustrated');-- Both of the following queries match the document stored in table "porter".
SELECT * FROM porter WHERE porter MATCH 'Frustrated';
SELECT * FROM porter WHERE porter MATCH 'Frustration';

代码分析

Poter_Tokenizer是一个包装分词器。它接受其他令牌处理器的输出,并应用波特词干算法(porter stemming algorithm)返回给FTS 5之前的每个令牌。这使得像“correction”这样的搜索词能够匹配类似的词,如“corrected”或“correcting”。波特词干算法是专为英语词汇使用而设计的–将它与其他语言一起使用可能会或不可能改进搜索工具。默认情况下,Porter令牌程序充当默认令牌器(Unicode 61)的包装器。如果将一个或多个额外的参数添加到“Porter”之后的“Tokenize”选项中,则将它们视为PorterStemmer使用的底层令牌程序的规范。例如:

(-- Two ways to create an FTS5 table that uses the porter tokenizer to
-- stem the output of the default tokenizer (unicode61).
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = porter);
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter unicode61');-- A porter tokenizer used to stem the output of the unicode61 tokenizer,
-- with diacritics removed before stemming.
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter unicode61 remove_diacritics 1');)

在fts_poter.c文件中有如下定义:

typedef struct porter_tokenizer_cursor {sqlite3_tokenizer_cursor base;const char *zInput;          /* 正在标记的输入 */int nInput;                  /* 输入的大小 */int iOffset;                 /* zInput 的位置*/int iToken;                  /* 返回的下一个令牌的索引 */char *zToken;                /* 当前令牌的存储 */int nAllocated;              /* 分配给zToken缓冲区的空间 */
} porter_tokenizer_cursor;

该结构体是由sqlite3_tokenizer_cursor衍生出的类。

static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){int i, mx, j;int hasDigit = 0;for(i=0; i<nIn; i++){char c = zIn[i];if( c>='A' && c<='Z' ){zOut[i] = c - 'A' + 'a';}else{if( c>='0' && c<='9' ) hasDigit = 1;zOut[i] = c;}}mx = hasDigit ? 3 : 10;if( nIn>mx*2 ){for(j=mx, i=nIn-mx; i<nIn; i++, j++){zOut[j] = zOut[i];}i = j;}zOut[i] = 0;*pnOut = i;
}

输入输入词zIn[0…nIn-1],将输出存储在zOut中,ZOut至少大到可以容纳nIn字节,写实际的输出字的大小(不包括“\0”终止符)到*pnOut。US-ASCII字符集中的任何大写字符([A-Z])被转换为小写字母,大写UTF字符不变,长度约20字节的单词被保留从单词的开头和结尾开始的几个字节;如果单词包含数字,取从结尾开始的3个字节;对于没有数字的长单词,需要10个字节从两端都取出来。US-ASCII的折叠案例仍然适用;如果输入字不包含数字,但字符不包含在[a-zA-Z]中,没有任何引导,这个程序只是使用US-ASCII将输入复制到输出中。即模板永远不会增加单词的长度,所以有没有机会溢出zOut缓冲区。

SQLite源代码分析----------分词器②相关推荐

  1. SQLite源代码分析----------分词器③

    2021SC@SDUSC 目录 简介 源码分析 解析 简介 本文我们介绍分词器部分的最后一个内容fts3_expr.c:fts3_expr.c这个文件主要是实现查询字符串功能(MATCH函数).MAT ...

  2. android sqlite 分词,sqlite fts3自定义分词器 zz

    return sqlite3_finalize(pStmt); } 要想实现自定义的分词器,最关键的时是得到指向sqlite3_tokenizer_module结构的一个指针,sqlite3_toke ...

  3. SQLite源代码分析----------分析器③

    2021SC@SDUSC 目录 Lemon输入文件语法 终点站和非终点站 语法规则 优先规则 Lemon输入文件语法 Lemon语法规范文件的主要目的是为解析器定义语法.但是,输入文件还指定Lemon ...

  4. tcpmp 编译 源代码分析

    TCPMP源代码分析 TCPMP源代码分析 播放器主要由核心框架模块(common工程)和解码器.分离器插件组成.TCPMP的插件非常多,其中主要的插件有:interface插件实现了TCPMP的界面 ...

  5. SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  6. SDL2源代码分析3:渲染器(SDL_Renderer)

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  7. XBMC源代码分析 7:视频播放器(dvdplayer)-输入流(以libRTMP为例)

    前文分析了XBMC的基本结构: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分 ...

  8. XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)

    XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分析 4: ...

  9. XBMC源代码分析 4:视频播放器(dvdplayer)-解码器(以ffmpeg为例)

    XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 本文我们分析XBMC中视 ...

最新文章

  1. 李飞飞新研究:基于深度学习和视觉化语言来了解不同物体间的关系
  2. ili9341代码移植注意事项
  3. 《技术的本质》2月24日part1
  4. vue2.0 之文本渲染-v-html、v-text
  5. 课程设计+计算机程序设计,高职计算机程序设计课翻转课堂初探
  6. NHibernate 对分组聚合支持的不好
  7. python是如何实现进程池和线程池的_进程、线程、线程池和协程如何理解?
  8. Linux命令之telnet 命令
  9. 【转载】简直可爱极了的即时通讯
  10. mysql 海量数据库的查询优化及分页算法方案_mysql 海量数据库的查询优化及分页算法方案...
  11. 简单 黑苹果dsdt教程_黑苹果笔记本:关于DSDT亮度表的分析与修改
  12. 使用window.performance对应用性能监测
  13. [做一个幸福的记号 忘了琐碎的烦恼]西兰花猪柳
  14. Mysql:日志管理:二进制事务日志
  15. DISCUZ编辑器工具栏图标不显示
  16. 科学计算机怎么算定积分,定积分计算方法的归纳和分析
  17. java 社招 简历_招聘java简历模板
  18. POJ 3295 Tautology(构造)
  19. CAD中插入外部参照字体会变繁体_CAD中形形色色的“替换”技巧你确定都知道了?...
  20. Java实现蓝桥杯模拟空地长草

热门文章

  1. 软件工程教程:第2章软件问题定义及可行性分析 课后习题
  2. Java基础:数据类型与变量
  3. 【头歌】旅游网站大数据分析-数据抓取
  4. 血泪史!外包如何找到靠谱的兼职程序员?
  5. 宝德开开游戏云战略发布会在京瞩目召开
  6. mysql事务的四个特点和实现原理
  7. 2.MySQL索引优化
  8. 苹果cmsv10仿韩剧TV网电脑加手机高端模板免费下载
  9. 股票 价格 定价 资料收集
  10. java扫雷设计_毕业设计Java版扫雷的设计与实现介绍