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

时间:2012-09-20 07:11:03

标签: sqlite full-text-search fts3

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

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

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

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

2 个答案:

答案 0 :(得分:11)

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

<强> 1。那么那么总共使用双重存储吗?

是的。此外,它可能会使用更多空间。例如,对于众所周知的安然电子邮件数据集和FTS3 example,只是感觉不同:

enter image description here

  
      
  • 与刚刚相比,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命令。
  •   

因此,如果您需要在表上使用另一个索引,则需要使用两个表。