我现在很困惑,已经阅读了有关SQLite3的FTS3 / FTS4的文档的第一部分。我感到困惑的原因是分散在整个网络中的示例,我认为它不能涵盖所有可能的用例,而另一个原因是我所处的现状。说了这么多,我有一个名为Note的表,其中包含两个属性的类型为TEXT和其他属性,这对于整个应用程序来说非常重要。
这是一个非常简单的表。我想提供全文搜索,这样就可以同时搜索短笔记和长笔记,也就是我遇到此FTS3 / FTS4时。您会看到,这样存储信息很简单,但是我在设计时遇到了问题,尤其是在我的应用程序内部发生的任何事情。 Web上的示例,尤其是从sdk目录提供的SearchableDictionary示例,仅显示了虚拟表的创建,而实际上仅显示了虚拟表。这是不正确的,对我来说也是这样。我已经有一个现有表,该表的其他属性对应用程序来说非常重要,而且我永远也不会计划将它们存储为虚拟表中的文本!也没有单一虚拟表,其类型均为TEXT。我可以将ShortNote和LongNote分离到单独的虚拟表中,并通过以下方式进行fts:
create virtual table virtual_note_table using fts3(_ID, ShortNote, LongNote);
由于某些原因,我对这种方法不满意:
如果这样做,我将必须维护两个表,a)易于理解的普通SQLite表,b)虚拟表,鉴于我的情况,我对该表的工作方式知之甚少。
我在想的只是创建一个单独的虚拟表,并在进行搜索时将其填满,结束后将其删除。内容的来源将来自我已经拥有的表格。但是我不确定这是否是最好的处理方法,因为我担心空间开销。
假设我采用了以前的原始想法,那就是从注释表中完全删除ShortNote和LongNote并仅保留一个引用。似乎根本不可能将虚拟表连接到非虚拟表。这是一个可怕的概念,而且我从未见过任何文章或写过任何文章,因此也许我完全完全误解了FTS3 / FTS4虚拟表!
我完全迷路了,需要设计方面的帮助。我非常需要完全搜索数据(ShortNote和LongNote)的功能。我想我最好的镜头是#2。
我将不胜感激任何建议。
最佳答案
将所有文本复制到(临时)FTS表将非常慢。
为了避免在两个表中存储重复文本的开销,可以使用external content table。
为了使两个表中的数据保持同步,可以使用触发器。有关示例,请参见上面的链接。
关于android - 了解FTS3/FTS4:什么是虚拟表,要从中进行搜索并具有可搜索的非虚拟表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29729979/