即使在阅读了大量有关SQLite的全文索引之后,仍然出现一个问题,我在任何地方都没有找到答案:
我已经有一个要全文索引搜索的表。我将只创建一个额外的虚拟表USING FTS3
或USING FTS4
,然后将我的数据INSERT
放入其中。
那会不会总共使用双倍的存储空间?我可以像普通表一样使用这样的虚拟表,从而防止两次存储数据吗?
(我正在Android上使用SQLite,但此问题可能适用于任何SQLite兼容平台上的用法。)
最佳答案
尽管您确实找到了一些细节,但我将尝试提供详细的答案:
1.这样一来,总共会使用双倍存储量吗?
是的,它确实。此外,它可能会使用事件更多的空间。例如,对于广为人知的Enron电子邮件数据集和FTS3 example,只需感受一下区别即可:
这使情况有些不愉快,但是仍然值得进行全文搜索。
2.我可以像普通表一样使用这种虚拟表吗?
简短的答案不,您不能。虚拟表只是一种具有多种局限性的 View 。您已经注意到了几个。
一般来说,您不应使用任何对View来说似乎不自然的功能。仅需最低限度即可使您的应用程序充分利用全文本搜索的功能。因此,使用该模块的较新版本以后就不会感到惊讶了。
该解决方案背后没有魔术,只是性能,所需磁盘空间和功能之间的折衷。
最终结论
我强烈建议使用FTS4,因为它速度更快并且唯一的缺点是需要额外的存储空间。
无论如何,您必须考虑到这种解决方案的补充性和高度专业性,仔细设计虚拟表。换句话说,请勿尝试将初始表替换为虚拟表。小心使用两者。
更新
我建议您仔细阅读以下文章:iOS full-text search with Core Data and SQLite。几个有趣的时刻:
关于SQLite全文虚拟表通常可用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12507649/