2012-09-20 60 views
10

即使閱讀了很多關於SQLite的全文索引並且出現了一個問題,我沒有在任何地方看到答案:SQLite全文虛擬表通常可用?

我已經有了一個表,我想用全文索引進行搜索。我只是創建一個額外的虛擬表USING FTS3USING FTS4然後INSERT我的數據到它。

那麼這是否總共使用雙存儲?我是否可以像普通表一樣使用這樣的虛擬表格,從而避免兩次存儲數據?

(我在Android上使用SQLite的工作,但這個問題可以適用於使用任何的SQLite兼容的平臺。)

回答

10

儘管你並發現了一些細節,我會盡量提供詳細的解答:

1.這是否然後使用雙存儲總?

是的。而且它可能會使用更多的空間。例如,衆所周知安然電子郵件數據集和FTS3example,只是感覺不一樣:

enter image description here

  • 的FTS3表會消耗2006年左右MB磁盤上的比例僅爲 1453 MB爲普通表

  • FTS3表只需31分鐘就可以完成31 分鐘,而普通表需要25分鐘

這使得情況有點不愉快,但仍全文檢索值得的。

2.我可以像普通表一樣使用這樣的虛擬表嗎?

簡短的回答不,你不能。虛擬表只是一種查看有幾個限制。你已經注意到了幾個。

通常說你不應該使用任何似乎是不自然的功能查看。只需要最低限度地讓您的應用程序充分利用全文搜索的力量。所以稍後會有更新版本的模塊出現。

有這個解決方法沒有神奇的,它僅僅是性能,所需的磁盤空間和功能性之間進行權衡。

最終結論

我會強烈建議使用FTS4,因爲它是快,是額外的存儲空間,唯一的缺點。

無論如何,你必須仔細設計虛擬表考慮到這樣的解決方案的補充和專業性很強。換句話說,不要試圖用虛擬表格替換你的初始表格。謹慎使用這兩者。

更新 我會建議看看下面的文章:iOS full-text search with Core Data and SQLite。一些有趣的時刻:

  • 虛表是在至極的核心數據內容駐留在同一SQLite數據庫創建的。 爲了使該表保持儘可能輕的效果 只插入了與搜索查詢相關的對象屬性。
  • SQLite實現提供了一些核心數據不包含的內容:全文搜索。 除此之外,它比同等核心數據查詢執行速度提高了近10%,並且至少有效地提高了660%(內存)
4

我剛剛發現了main differences of virtual tables,它似乎取決於你使用一個單一的表是否足以滿足您。

  • 一個不能創建一個虛擬表的觸發器。

  • 無法在虛擬表上創建附加索引。 (虛擬表可以有索引,但必須建立在虛表 實現。指數不能使用CREATE INDEX 報表中單獨添加。)

  • 一個無法運行ALTER TABLE ... ADD對虛擬表列命令。

所以,如果你需要在表上的另一個索引,你需要使用兩個表。

+0

@RenatGilmanov我認爲,因爲這是更多的答案? –