SQLite全文虚拟表是否正常可用?

SQLite全文虚拟表是否正常可用?,sqlite,full-text-search,fts3,Sqlite,Full Text Search,Fts3,即使在阅读了大量关于SQLite全文索引的内容之后,我仍然发现一个问题没有得到任何回答: 我已经有了一个要用全文索引搜索的表。我只需要使用FTS3创建一个额外的虚拟表,或者使用FTS4创建一个,然后将我的数据插入其中 那么,这是否总共使用了两倍的存储空间?我可以像使用普通表一样使用这样的虚拟表,从而防止数据存储两次吗 (我正在Android上使用SQLite,但这个问题可能适用于任何SQLite兼容平台上的使用。)我刚刚发现了问题,似乎取决于您的使用情况,一个表是否满足您的需要 无法在虚拟表上

即使在阅读了大量关于SQLite全文索引的内容之后,我仍然发现一个问题没有得到任何回答:

我已经有了一个要用全文索引搜索的表。我只需要使用FTS3创建一个额外的虚拟表
,或者使用FTS4创建一个
,然后将我的数据插入其中

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

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

我刚刚发现了问题,似乎取决于您的使用情况,一个表是否满足您的需要

  • 无法在虚拟表上创建触发器

  • 无法在虚拟表上创建其他索引。(虚拟表可以有索引,但必须内置到虚拟表中。) 无法使用“创建索引”单独添加索引 声明。)

  • 无法运行ALTER TABLE。。。针对虚拟表添加列命令

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

尽管您确实找到了一些详细信息,但我将尝试提供详细答案:

1。那么这是否总共使用了两倍的存储空间?

是的。此外,它可能会使用更多的事件空间。例如,对于广为人知的安然电子邮件数据集和FTS3,只需感受一下区别:

  • FTS3表在磁盘上的消耗量约为2006 MB,而 普通表为1453 MB

  • 富时3指数(FTS3)的成交量略低于31% 填充时间为分钟,而普通表格为25分钟

这让情况有点令人不快,但全文搜索还是值得的

2。我可以像使用普通桌子一样使用这样的虚拟桌子吗?

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

一般来说,您不应该使用任何对视图来说似乎不自然的功能。这只是让应用程序充分利用全文搜索功能所需的最低要求。因此,稍后使用新版本的模块将不会有任何意外

这个解决方案背后没有什么魔力,它只是性能、所需磁盘空间和功能之间的折衷

最终结论

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

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

更新 我建议您仔细阅读以下文章:。几个有趣的时刻:

  • 虚拟表是在核心数据内容所在的同一个SQLite数据库中创建的使这张桌子尽可能轻 仅插入与搜索查询相关的对象属性。
  • SQLite实现提供了核心数据所没有的功能:全文搜索除此之外,它的速度快了近10%,至少 与可比的核心数据查询相比,效率提高660%(内存)