在文本中搜索匹配詞時,我可以優化核心數據查詢嗎? (這個問題也適用於定製SQL與iPhone上的核心數據的智慧。)如何針對全文搜索優化核心數據查詢
我正在研究一個新的(iPhone)應用程序,它是科學數據庫的手持參考工具。主界面是一個標準的可搜索表格視圖,當用戶鍵入新單詞時,我想讓你的類型響應。單詞匹配必須是文本中單詞的前綴。文本由10萬字組成。
在我的原型中,我直接編碼SQL。我創建了一個單獨的「單詞」表,其中包含主實體文本字段中的每個單詞。我索引的單詞和執行搜索沿線
SELECT id, * FROM textTable
JOIN (SELECT DISTINCT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz')
ON id=textTableId
LIMIT 50
這運行速度非常快。使用IN可能也是一樣,即
SELECT * FROM textTable
WHERE id IN (SELECT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz')
LIMIT 50
該LIMIT是至關重要的,並且允許我快速顯示結果。如果達到限制,我通知用戶需要顯示太多內容。這是kludgy。
我已經花了最近幾天思考轉移到核心數據的優勢,但我擔心模式,索引和查詢重要查詢缺乏控制。
從理論上講,textField MATCHES '.*\bfoo.*'
的NSPredicate可以正常工作,但我相信它會很慢。這種文本搜索看起來很普遍,我不知道通常的攻擊是什麼?你會像我上面做的那樣創建一個單詞實體,並使用「單詞BEGINSWITH'foo'」的謂詞嗎?它的工作速度與我的原型一樣快嗎?核心數據會自動創建正確的索引?我找不到任何明確的建議關於索引的持久存儲的方法。
我在我的iPhone應用程序中看到了Core Data的一些不錯的優點。錯誤和其他內存考慮允許爲tableview查詢進行有效的數據庫檢索,而不設置任意限制。對象圖管理允許我輕鬆遍歷實體而無需編寫大量的SQL。將來移植功能將會很好。另一方面,在有限的資源環境(iPhone)中,我擔心自動生成的數據庫會因爲元數據,不必要的反向關係,低效的屬性數據類型等而臃腫。
我應該潛入還是謹慎行事? 。
感謝您的回覆。我現在正在編寫命令行工具,以將初始sqlite數據加載到xcdatamodel兼容數據庫中。涉及實質性勞動。我會報告我的經驗。 – 2009-11-23 17:38:02
爲了跟進你的例子,我認爲問題是一個提取請求不會在Word實體上,而是在textTable實體上。 (例如,假設textTable包含電子郵件信息,Word包含所有電子郵件字段中的所有單詞)。我認爲這會使問題顯得複雜化,因爲fetchResultsController必須保存通過謂詞過濾的textTable實體 - 而這樣的ANY或SUBQUERY謂詞是慢。 也許有一種方法可以在「相反」的方向上做到這一點:通過啓動w/Word匹配,遵循反向關係,以及解析textTable。嗯。 – 2009-12-11 06:27:33
如果謂詞的第一部分儘可能地減少了搜索空間,那麼謂詞的其餘部分的整體執行速度會更快,其搜索空間更少。查看Core Data指南的性能部分:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/ TP40003468 – 2009-12-11 06:47:24