SQLite全文虚拟表通常可用吗?

aki*_*irk 10 sqlite full-text-search fts3

即使在阅读了很多关于SQLite的全文索引之后,又出现了一个我没有在任何地方看到答案的问题:

我已经有一个表,我想用全文索引搜索.我只是想创建一个额外的虚拟表USING FTS3USING FTS4,然后INSERT我的数据进去.

那么总共使用双存储吗?我可以像普通表一样使用这样的虚拟表,从而防止存储数据两次吗?

(我在Android上使用SQLite,但这个问题可能适用于任何SQLite兼容平台上的使用.)

Ren*_*nov 11

尽管您确实找到了一些细节,但我会尝试提供详细的答案:

那么总共使用双重存储吗?

是的,它确实.此外,它可能会使用更多空间.例如,对于广为人知的安然电子邮件数据集和FTS3 示例,只是感觉不同:

在此输入图像描述

  • FTS3表在磁盘上消耗大约2006 MB,而普通表仅消耗1453 MB

  • 填充FTS3表的时间不到31分钟,而普通表只需25分钟

这使得情况有点不愉快,但仍然全文搜索值得.

2.我可以像普通表一样使用这样的虚拟表吗?

简短的回答不,你不能.虚拟表只是一种具有一些限制的视图.你已经注意到了几个.

一般说你不应该使用任何功能,这是似乎是不自然的景观.只需最低限度,即可让您的应用程序充分利用全文搜索的强大功能.因此,对于较新版本的模块,以后不会有任何意外.

这个解决方案背后没有任何魔力,它只是性能,所需磁盘空间和功能之间的权衡.

定论

我强烈建议使用FTS4,因为它更快,唯一的缺点是需要额外的存储空间.

无论如何,您必须仔细设计虚拟表,同时考虑到此类解决方案的补充和高度专业化的性质.换句话说,不要尝试用虚拟表替换初始表.两者都要小心使用.

更新 我建议您查看以下文章:使用Core Data和SQLite进行iOS全文搜索.几个有趣的时刻:

  • 虚拟表在Core Data内容所在的同一SQLite数据库中创建.为了使该表尽可能轻,只插入与搜索查询相关的对象属性.
  • SQLite实现提供了Core Data不具备的功能:全文搜索.除此之外,与同类Core Data查询相比,它的执行速度提高了近10%,并且(内存)的效率至少提高了660%.