[关闭]
@wrlqwe 2016-07-31T16:23:39.000000Z 字数 1157 阅读 2055

使用SQLite全文检索

sqlite 开发


前言

口袋做app本地搜索,遇到了耗时过长的问题,分析原因如下:

  1. 数据量很大,因为优先级、排序和分页的关系,只能借助子查询+union来实现,拖慢了速度。
  2. 每一个子查询都使用了Like,索引没法用。
  3. iOS9 上SQLite在某些操作上会耗费更长时间(iOS9的6Plus与iOS8的5C搜索某些关键词相比会有一倍的性能落后)。

FTS3/FTS4

FTS(Full Text Search)是sqlite virtual table 的一module,它允许用户在sqlite里执行全文搜索。

在iOS和其他一些预制了sqlite的系统里,它通常不会包含在默认的sqlite里,除非重新编译。

看上去使用FTS会解决我们的问题。

添加FTS支持

引入FTS

我们使用了FMDB来管理数据库,在FMDB的Pod有一个subspec可以直接引入FTS支持:pod 'FMDB/standalone/FTS', '~> 2.6.2'

创建FTS表

  1. create virtual table fts_search using fts4 (title, subtitle, content1, content2, content3, drug_id, drug_type)

这里使用 fts4,是考虑到它包含了一些性能上的优化,某些时候可能速度会优于 fts3,需要注意的是,由于fts4有两张 shadow tables 存储额外的信息,所以磁盘占用上会较fts3有一定的提升[1]

还有就是无需指定column的类型,因为它们都会是 Text 类型。

迁移数据

  1. INSERT INTO fts_search (title, subtitle, content1, content2, content3, drug_id, drug_type) select title, subtitle, content1, content2, content3, drug_id, drug_type from t_search

开始搜索

在搜索上,仅仅把表名替换成了fts表,其他条件都没有动,在iPhone 6 Plus上,对比了两个关键字,各做了两次搜索,结果如下:

关键字 before(秒) after(秒)
阿奇霉素肠溶 8.18905554166849 0.859231499998714
阿奇霉素肠溶 8.45171337500142 0.812341541666683
复方苯甲酸 8.42132416666573 0.858444000001327
复方苯甲酸 7.38970133333351 0.82285420833432
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注