即使在阅读了很多关于SQLite的全文索引之后,又出现了一个我没有在任何地方看到答案的问题:
我已经有了一个我想用全文索引搜索的表。我只想创建一个额外的虚拟表格USING FTS3
或USING FTS4
,然后INSERT
我的数据。
那么总共会使用双存储吗?我可以像普通表一样使用这样的虚拟表,从而防止将数据存储两次吗?
(我在Android上使用SQLite,但这个问题可能适用于任何SQLite兼容平台上的使用。)
答案 0 :(得分:11)
尽管您确实找到了一些细节,但我会尝试提供详细的答案:
<强> 1。那么那么总共使用双重存储吗?
是的。此外,它可能会使用更多空间。例如,对于众所周知的安然电子邮件数据集和FTS3 example,只是感觉不同:
与刚刚相比,FTS3表在磁盘上消耗大约2006 MB 普通餐桌1453 MB
FTS3表格略低于31 填充的分钟数,而普通表格为25分钟
这使情况有点不愉快,但仍然值得全文搜索。
<强> 2。我可以像普通表一样使用这样的虚拟表吗?
简短的回答不,你不能。虚拟表只是一种具有一些限制的 View 。你已经注意到了几个。一般来说,你不应该使用任何对 View 来说似乎不自然的功能。只需最低限度,让您的应用程序充分利用全文搜索的强大功能。因此,对于较新版本的模块,以后不会有任何意外。
这个解决方案背后没有任何魔力,它只是性能,所需磁盘空间和功能之间的权衡。
最终结论
我强烈建议使用FTS4,因为它更快,唯一的缺点是需要额外的存储空间。
无论如何,您必须仔细设计虚拟表,同时考虑到此类解决方案的补充和高度专业化的性质。换句话说,不要尝试用虚拟表替换初始表。小心使用两者。
<强>更新强> 我建议您浏览以下文章:iOS full-text search with Core Data and SQLite。几个有趣的时刻:
- 虚拟表是在Core Data内容所在的同一个SQLite数据库中创建的。 保持此表尽可能轻 仅插入与搜索查询相关的对象属性。
- SQLite实现提供了Core Data不具备的功能:全文搜索。 接下来,它的速度提高了近10% 比同类核心数据查询多660%(内存)。
答案 1 :(得分:4)
我刚刚发现了main differences of virtual tables,这似乎取决于您的用法是否适合您。
无法在虚拟桌面上创建触发器。
无法在虚拟表上创建其他索引。 (虚拟表可以有索引但必须内置到虚拟表中 实现。无法使用CREATE INDEX单独添加索引 语句。)
- 无法对虚拟表运行ALTER TABLE ... ADD COLUMN命令。
因此,如果您需要在表上使用另一个索引,则需要使用两个表。