热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLite全文检索(1)

SQLite是一款非常轻量的嵌入型数据库,没有独立的进程,非常小的footprint,零配置,支持事务,“publicdomain”开源,对于客户端程序来说已经游刃有余。[更多的介绍,Syste

SQLite 是一款非常轻量的嵌入型数据库,没有独立的进程,非常小的 footprint,零配置,支持事务,“public domain”开源,对于客户端程序来说已经游刃有余。[更多的介绍,System.Data.SQLite 库]

说到全文检索,目前比较流行、也比较成熟的选择是 Lucene.net。今天给大家介绍的是 SQLite 内置的全文检索功能,以如此小的 footprint 实现全文检索功能,我想还是有一定吸引力的。国内目前涉及此领域的文章还很少,.net 圈估计本文是第一篇吧,能力有限,多多包涵。

要使用 SQLite 全文检索,首先要创建 VIRTUAL TABLE:

CREATE VIRTUAL TABLE pages USING fts3(title, body);

虚表 pages 包含 title, body 两个文本字段,此外还有一个 docid 整数型的内置字段(你可以自行为 docid 赋值,也可以插入 NULL 让系统自动分配)。虚表可以和其他普通表类似的操作、连接等。

INSERT INTO pages (docid, title, body) VALUES (1, 'hello, world', '"hello, world"is my first line of data.');
UPDATE pages SET title='hello, world !' WHERE docid=1;
SELECT title, body FROM pages INNER JOIN pageinfo ON pageinfo.docid=pages.docid WHERE pageinfo.SiteName='sina';

虽然你可以写 WHERE title=’hello, world !’ 这样的查询,但这样做首先效率上比较糟糕(SQLite 将做全表扫描),而且体现不出全文检索的好处来。实际上应该是用 MATCH 运算符:

SELECT title, body FROM pages WHERE pages MATCH 'world';
SELECT title, body FROM pages WHERE title MATCH 'world';

注意这两句,前一个 MATCH 左边写了表名,后一个写的是列名。后一个仅搜索 title 列,前一个是搜索全部列(docid 列以外)。

MATCH 右侧的表达式支持模糊查询、支持指定列查询、支持 AND/OR/NEAR/NOT 等运算:

SELECT title, body FROM pages WHERE pages MATCH 'hel*';
SELECT title, body FROM pages WHERE pages MATCH 'title:hello';
SELECT title, body FROM pages WHERE pages MATCH 'hello AND world';
SELECT title, body FROM pages WHERE pages MATCH '(hello NEAR world) OR (program AND language)';

但要注意只能出现一次 MATCH 判断,WHERE title MATCH 'hello' AND body MATCH 'world' 是不行的,可以改作 WHERE pages MATCH 'title:hello AND body:world'。

我们一般都希望检索结果能给出一片段,并标出所查关键词,此时可以使用 snippet 函数:

SELECT title, snippet(pages, '', '', '...') FROM pages WHERE pages MATCH 'hello';

将会选出一两个包含检索关键词的片段,并在关键词两边用 标记出来; '...' 将用在片段的间隔和末尾。如果略去后三个参数,则默认是以 标签标关键词。

【提示】

1. 从sqlite.org 下载的 SQLite 版本默认是不支持全文检索功能的,需要修改编译参数重新编译。不过,.net 开发者一般直接使用从 phxsoftware.com 下载的 System.Data.SQLite.dll 版本,这个版本是默认开启全文检索功能的。

2. SQLite 内置的切词器只支持西方文字,对缺乏空格分隔的东亚文字无能为力,我们需要做一些扩展让它支持东亚文字的切词。我们下一篇就来讨论这一话题。

3. 我们希望检索结果能按照相关度排序,这需要你先研究明白 offset,matchinfo 函数的用法,然后根据 SQLite 的官方文档的示例,写出自定义的相关度计算函数,然后再据此进行排序。如果有机会,我再单独写一篇这个话题的内容。


推荐阅读
  • mybatis相关面试题 ... [详细]
  • 远程访问用户 Kindle通过电子书实现控制
    介绍自2007年以来,亚马逊已售出数千万台Kindle,令人印象深刻。但这也意味着数以千万计的人可能会因为这些Kindle中的软件漏洞而被黑客入侵。他 ... [详细]
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • Web网络基础
    目录儿1使用HTTP协议访问Web2HTTP的诞生2.1因特网的起源2.2互联网、因特网与万维网2.3万维网与HTTP3网络基础TCPIP3.1TCPIP协议族3.2TCPIP的分 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 从零开始学重构——重构的流程及基础重构手法
    重构的流程重构手法  正如上一次所讲的那样,重构有两个基本条件,一是要保持代码在重构前后的行为基本不变,二是整个过程是受控且尽可能少地产生错误。尤其是对于第二点,产生了一系列的重构手 ... [详细]
  • 探讨如何利用Visual Basic (VB) 将十六进制或二进制字符串写入Windows注册表的方法。 ... [详细]
  • 使用Python模拟登录教务系统抓取成绩并分析存储
    本文详细介绍如何使用Python编程语言模拟登录学校教务系统,抓取学生的成绩信息,并进行数据分析和可视化处理,最终将数据存储到MySQL数据库中。 ... [详细]
  • 深入解析C++中的红黑树
    本文将详细介绍二叉搜索树的一种重要变体——红黑树,探讨其通过颜色标记维持平衡的机制,以及它在实际应用中的优势。 ... [详细]
  • ECharts图表绘制函数集
    本文档提供了使用ECharts库创建柱状图、饼图和双折线图的JavaScript函数。每个函数都详细列出了参数说明,并通过示例展示了如何调用这些函数以生成不同类型的图表。 ... [详细]
  • 抽象工厂模式 c++
    抽象工厂模式包含如下角色:AbstractFactory:抽象工厂ConcreteFactory:具体工厂AbstractProduct:抽象产品Product:具体产品https ... [详细]
  • 本文探讨了SQLAlchemy ORM框架中如何利用外键和关系(relationship)来建立表间联系,简化复杂的查询操作。通过示例代码详细解释了relationship的定义、使用方法及其与外键的相互作用。 ... [详细]
  • Navicat Premium中MySQL用户管理:创建新用户及高级设置
    本文作为Navicat Premium用户管理系列的第二部分,主要介绍如何创建新的MySQL用户,包括设置基本账户信息、密码策略、账户限制以及SSL配置等。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
author-avatar
薇薇MM81_811
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有