用SQLite进行全文检索
转载地址:http://blog.sina.com.cn/s/blog_64aedc270100sf1x.html
对于应用软件开发人员来说,要解决这个问题有许多的方案可以选择。如,利用MySQL和PostgreSQL或者Sphinx和Lucene这样的独立软件进行本地执行。然而,这些要么用起来棘手,要么就过度了。
幸运的是,Google为SQLite贡献了一些资源以实现帮助。在版本3.3.8中第一次实现全文检索。此版本提供的功能可以创建一个依赖于外部延伸的虚拟表:在这里,全文搜索运算法则可用于任何虚拟表内的文本列。在PHP 5.3.0中,对应的支持只被默认的PDO和SQLite3激活。较早版本的PHP可以使用PECL 的SQLite3扩展库。
创建一个搜索索引通常情况如下:
• 把文本分解成记号。
• 转换为小写字母。
• 确定根词。
• 建立索引。
设置好一切
对于应用软件开发人员来说,要解决这个问题有许多的方案可以选择。如,利用MySQL和PostgreSQL或者Sphinx和Lucene这样的独立软件进行本地执行。然而,这些要么用起来棘手,要么就过度了。
幸运的是,Google为SQLite贡献了一些资源以实现帮助。在版本3.3.8中第一次实现全文检索。此版本提供的功能可以创建一个依赖于外部延伸的虚拟表:在这里,全文搜索运算法则可用于任何虚拟表内的文本列。在PHP 5.3.0中,对应的支持只被默认的PDO和SQLite3激活。较早版本的PHP可以使用PECL 的SQLite3扩展库。
创建一个搜索索引通常情况如下:
• 把文本分解成记号。
• 转换为小写字母。
• 确定根词。
• 建立索引。
设置好一切
在默认情况下,SQLite提供了两个基本的分词器,Simple和Porter。它们可以控制字的分开方式。Simple根据空格和标点符号将文本分解成不同的记号。Porter是专为英文使用而设计,它可以将大量的文字扩展化解为基础形式。例如,condolidate,consolidated,和consolidating这一类词语都会被转变成consolid。
遗憾的是,SQLite目前还没有取消停用词。所以常用词,例如,the,of和to仍位于索引内。这会极大地扩充索引的范畴并减缓搜索速度。最简单的解决办法是,在按下确认检索之前手动除去停用词。
下面,向您展示一些代码,教你如何创建自己的第一个全文索引。 SQLite之所以做到这些,是因为它通过使用FTS3扩展建立一个虚拟表。只有文本列位于这个虚拟表以内时,才可以被搜索,并且最后一列用来识别使用的分词器类型。
CREATE VIRTUAL TABLE example
USING FTS3(title TEXT, TOKENIZE SIMPLE) |
创建表后,您可以使用SELECT, INSERT,UPDATE和DELETE语句询问此表。此处要附加说明的是:没有进一步的索引可以建立在表格上,所以简单的查询将导致对全表的扫描。
一旦你键入一些数据,你就可以试试。本文中其余的例子,我会使用出自英文版维基百科的所有标题。我的数据库有5,453,838行,相比较于没有索引时的146MB,若使用全文索引,其大小是233MB。
检索
搜索索引由匹配操作完成。查询可以包含多个方面,在这种情况下,只有文字行包含所有条件时才返回。还有支持“OR”的查询,但该查询排除了条件,精确的词组匹配以及前缀检索。
SELECT rowid, title FROM example WHERE title MATCH 'tea bag'
SELECT rowid, title FROM example WHERE title MATCH 'tea OR bag' SELECT rowid, title FROM example WHERE title MATCH 'tea -bag' SELECT rowid, title FROM example WHERE title MATCH '"tea bag"' SELECT rowid, title FROM example WHERE title MATCH 'tea*' |
请注意:OR区分大小写,并且在一次查询中只允许一个MATCH操作。
创建片段
为了向匹配的搜索结果提供语境,可以使用snippet()功能。这一功能将突出显示搜索结果中任何文字列的关键词。
SELECT title, snippet(example)
FROM example WHERE title MATCH 'Advent' ADVENT|ADVENT Advent|Advent Advent,_Cornwall|Advent,_Cornwall Advent,_West_Virginia|Advent,_West_Virginia Advent:_One-Winged_Angel|Advent:_One-Winged_Angel Advent_(band)|Advent_(band) |
额外的变量可以用来标示置标,置标过去常用于环绕匹配的表达和任何为缩短结果做的省略。这些分别是第二,第三和第四的变量,它们是第一次被用来标示表名。
非英语的标记
可以通过ICU(指令控制单元)库提供的一些基本功能实现对非英语文本进行全文检索的愿望。这个库是PHP 6 的一个核心部分,该库通过在intl 扩展的PHP5.3中也可得。这两种情况下的SQLite将有更多的分词器。
在ICU分词器将根据语言规则和指定的区域识别词语,然后按照界定拆分。这种方法只适用于某些地域。句法如下:
CREATE VIRTUAL TABLE example
USING FTS3(title TEXT, TOKENIZE icu en_GB) |
此处的第二个变量由语言,国家和信息变体组成。
用SQLite进行全文检索相关推荐
- iOS/Android SQLite 全文检索——FTS (Full Text Search)
文章目录 前言 一.基本概念 二.为什么使用SQLite全文检索 三.版本选择 四.分词器 五.使用步骤 六.```MATCH```部分语法 七.Demo 参考 前言 我们的APP部分功能为了满足用户 ...
- Java.mob.org.cn搜索_探讨Android全文检索技术
原标题:探讨Android全文检索技术 写在前面 客户端本地存储数据一般使用的存储方式是:文件.SharedPreference.数据库(SQLite) 如果我们要做一些查询的操作,对于文件的方式,通 ...
- android sqlite 分词,SQLite 之FTS5全文检索
第一节 ICU下载和编译 Window版编译: 1. 解压icu4c-59_1-src.zip 2. 进入icu4c-59_1-src\icu\source\allinone目录 3. ...
- 技术干货 | 如何在 Electron 上实现 IM SDK 聊天消息全文检索
导读:在 IM 场景的客户端需求上,基于本地数据的全文检索(Full-text search)扮演着重要的角色.本文具体来聊聊网易云信是如何实现全文检索的. 文|李宁 网易云信高级前端开发工程师 所谓 ...
- SQLite FTS3/FTS4与一些使用心得
此文已由作者王攀授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 简介 对于今天的移动.桌面客户端应用而言,离线全文检索的需求已经十分强烈,我们日常使用的邮件客户端.云音乐.云 ...
- 微信团队分享:微信移动端的全文检索多音字问题解决方案
本文来自微信开发团队WeMobileDev公众号的技术分享. 1.前言 微信的移动客户端全文搜索中的多音字问题一直是搜索体验的痛点之一.微信客户端全文搜索在上线以后,也经常收到用户关于多音字问题的反馈 ...
- SQLite入门笔记
先来一段客套话 SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几 ...
- Sqlite优化记录:使用全文索引加快检索速度-转
Sqlite是一个很优秀的数据库,不仅体积小,多平台支持,而且数据库具有单个文件,方便在不同平台上快速部署等很多优势. 关于Sqlite的性能,总是最具有争议的地方.不过之前也在网上看到过有人把sql ...
- IM开发干货分享:网易云信IM客户端的聊天消息全文检索技术实践
1.引言 在IM客户端的使用场景中,基于本地数据的全文检索功能扮演着重要的角色,最常用的比如:查找聊天记录.联系人,就像下图这样. ▲ 微信的聊天记录查找功能 类似于IM中的聊天记录查找.联系人搜索这 ...
最新文章
- SYNCHRO 4D可视化调度学习教程 SYNCHRO 4D: Visual Scheduling
- 快手二面:Java 里的 for (;;) 与 while (true),哪个更快?
- 关于PostgreSQL的GiST索引之四
- 组装高性能服务器配置,高性能计算服务器参考配置需求.doc
- 常规网站模板(flash作div背景)
- Struts2之国际化
- ANSYS18.2/HFSS18.2安装步骤
- JAVA类加载机制详解
- 纳税申报、发票识别验真:解析RPA如何应用于税务领域
- Heidisql中如何解决MySqlServer go away问题
- FusionAccess桌面云介绍
- 信奥中的数学:集合与子集
- 用R进行多元线性回归分析建模
- [SDOI2018]旧试题 题解
- “第二期政府CIO论坛”顺利举行
- 02 KVM安装虚拟化
- 【每日早报】20200114
- soybean单页应用的问题
- windows重装了系统oracle数据库恢复
- 哪些东西,年轻人千万不能碰