【问题标题】:Understanding FTS3/FTS4: What are virtual tables and to search from it having a searchable non-virtual table?了解 FTS3/FTS4:什么是虚拟表并从中搜索具有可搜索的非虚拟表?
【发布时间】:2015-06-26 02:55:01
【问题描述】:

在阅读了 SQLite3 的 FTS3/FTS4 文档的第一部分后,我感到非常困惑。我感到困惑的原因是分散在网络上的示例,我认为它并没有涵盖所有可能的用例,另一个原因是我目前所处的情况。话虽如此,我有一个名为 Note 的表,其中包含两个类型为 TEXT 的属性和其他对整个应用程序非常重要的属性。

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

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

出于以下几个原因,我对这种方法感到不舒服:

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

  2. 我在想的只是创建一个单独的虚拟表,并在我要进行搜索时将其填满,并在我结束时删除表。内容的来源将来自我已经拥有的表格。但我不确定这是否是最好的处理方式,因为我担心空间开销。

  3. 假设我采取了我之前的原始想法,即从笔记表中完全删除 ShortNote 和 LongNote,只保留一个参考。似乎根本不可能将虚拟表连接到非虚拟表。这是一个糟糕的概念,我从来没有看过任何文章或写过这方面的文章,所以也许我完全误解了 FTS3/FTS4 虚拟表!

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

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

【问题讨论】:

    标签: android sqlite full-text-search


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,因为我担心它会很慢。我将阅读有关外部内容的链接,并感谢您对此的提醒。
    • 带有 fts4 的外部内容表是否适用于 android 中的 sqlite?
    • 嗨,几周前我把这个问题加入了书签。也许它会给你一些你需要的信息:stackoverflow.com/questions/6339022/… 它似乎在 API >= 11 上默认启用。检查链接。
    • API 16 是否支持外部内容表?我尝试使用 API 16 在 Sony Xperia 上运行它,但由于错误 vtable contructor failed 而崩溃
    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多