admin管理员组

文章数量:1344720

android sqlite fts4,SQLite FTS3/FTS4与一些使用心得

此文已由作者王攀授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

简介

对于今天的移动、桌面客户端应用而言,离线全文检索的需求已经十分强烈,我们日常使用的邮件客户端、云音乐、云笔记、易信等就是离线全文检索的潜在用户。

作为目前使用最为广泛的嵌入式数据库,SQLite3其实内置了全文检索的扩展模块——FTS。FTS分为FTS1、FTS2、FTS3、FTS4和FTS5几个版本,其中FTS1和FTS2已经被废弃,而FTS3在2007年9月4日发布的SQLite 3.5.0中被引入,其增强版FTS4则第一次出现在2010年12月8日的SQLite 3.7.4中。由于FTS3与FTS4有着千丝万缕的联系,所以本文将两种FTS引擎放在一起来介绍。FTS5则它们不兼容,所以笔者将以另外一个文章来单独作介绍。

相比于普通表,FTS3/FTS4其实是两种虚表。当你创建一个名为t的FTS虚表的时候,你会发现数据库中其实创建了若干个普通表用于存储物理数据,它们被称为影子表(shadow tables),分别命名为t_content、t_messageize、t_segdir、t_segments、t_stat等。

编译

想让SQLite支持FTS3/FTS4,在编译SQLite的时候需要打开以下编译开关

-DSQLITE_ENABLE_FTS3

注:Chromium、CEF和iOS7及以后的版本内建的SQLite都默认打开了此选项。

如果想要让FTS3/FTS4支持带括号优先级的高级查询(见下文),那么需要同时打开以下开关:

-DSQLITE_ENABLE_FTS3_PARENTHESIS

注:Chromium、CEF内建SQLite没有打开该开关。

如果想要让FTS3/FTS4支持ICU分词器,则需要再打开以下开关:

-DSQLITE_ENABLE_ICU

注:Chromium、CEF内建SQLite打开并实现了该开关;iOS自带的没有。

表操作

最简单地创建表的形式:-- 创建一个fts3表message,包含title和body两列CREATE VIRTUAL TABLE message USING fts3(title, body);-- 创建一个fts4表message,包含title和body两列CREATE VIRTUAL TABLE message USING fts4(title, body);

需要注意的是如果在创建表的时候给某个列指定了类型,那么这些类型将被完全忽略。 我们还可以在建表的时候给表指定分词器。例如:CREATE VIRTUAL TABLE message USING fts3(title, body, t

本文标签: android sqlite fts4SQLite FTS3FTS4与一些使用心得