了解 FTS3/FTS4:什么是虚拟 table 以及从中搜索具有可搜索的非虚拟 table?

Understanding FTS3/FTS4: What are virtual tables and to search from it having a searchable non-virtual table?

我现在很困惑,已经阅读了 SQLite3 文档的第一部分 FTS3/FTS4。我感到困惑的原因是这个例子散布在整个网络上,我认为它没有涵盖所有可能的用例,另一个原因是我所处的现状。话虽如此,我有一个名为 table注意其中包含两个类型为 TEXT 的属性和其他对整个应用程序非常重要的属性。

很简单table。我想提供全文搜索,这样我就可以搜索短笔记和长笔记,这就是我遇到这个 FTS3/FTS4 的时候。你看,这样存储信息很简单,但我在设计上遇到了问题,尤其是在我的应用程序的幕后发生的事情。网络上的示例,尤其是 sdk 目录中提供的 SearchableDictionary 示例,仅显示了虚拟 tables 的创建,实际上仅此而已。这不是真的,对我来说也是如此。我已经有一个现有的 table,它的其他属性对应用程序非常重要,我永远不会计划将它们作为文本存储在虚拟 table 上!也没有单一的虚拟 table 类型都是 TEXT。我可以将 ShortNote 和 LongNote 分开到一个单独的虚拟 table 并通过以下方式在这里进行 fts:

create virtual table virtual_note_table using fts3(_ID, ShortNote, LongNote);

出于以下几个原因,我不喜欢table这种方法:

  1. 如果我这样做,我将不得不维护两个 table,a) 普通的 SQLite table,这很容易理解,b) 虚拟的 table 鉴于我的情况,我对它的工作方式知之甚少。

  2. 我在想的只是创建一个单独的虚拟 table 并在我要进行搜索时填充它,并在我结束时删除 table。内容的来源将来自我已有的 table。但我不确定这是否是最好的做事方式,因为我担心 space 开销。

  3. 假设我采用了之前的原始想法,即从笔记 table 中完全删除 ShortNote 和 LongNote 并只保留一个引用。似乎根本不可能将虚拟 table 连接到非虚拟 table。这是一个糟糕的概念,我从未看过任何文章或写过关于它的文章,所以也许我完全误解了 FTS3/FTS4 虚拟 tables!

我完全迷失了,需要有关设计的帮助。我非常需要完全搜索数据(ShortNote 和 LongNote)的功能。我认为我最好的镜头是 #2。

如有任何建议,我将不胜感激。

将所有文本复制到(临时)FTS table 会相当慢。

为了避免在两个 table 中存储重复文本的开销,您可以使用 external content table.

要保持​​两个table中的数据同步,可以使用触发器;有关示例,请参见上面的 link。