2013-10-18 54 views
4

我正在使用coredata作爲其持久性存儲的iphone的企業ios應用程序。我們有幾個核心數據實體,其中一個有30個字段。我的數據集超過了這些30個實體的45,000個。ios coredata搜索大型數據集

我需要構建一個查詢,其中我的搜索字符串可以匹配對象上12個不同字段之一。我的NSPredicate基本上是一個大鼠窩(屬性== $ A)|| (otherproperty == $ A)...等$ A是我的搜索字符串。

我們剛剛開始調整它的性能,因爲它很糟糕。我們應該做什麼明顯的事情?使用複合謂詞並且每個子謂詞都是(property == $ A)會更好嗎?

想法?提前致謝。

我的(部分)解決方案 - 我觀看了關於核心數據的一些wwdc視頻,基本上做了Apple所說的。從我的真實對象到另一個對象來創建一個關係來表示一個搜索令牌。這個新的搜索令牌實體有兩個字段 - 令牌和權重。當我將主要對象插入coredata時,我給他一組這些搜索令牌。我想查詢的每個字段的一個搜索標記以及標記屬性的內容是某種標準化(全部小寫)的數據。然後我的謂詞就是「任何searchTokens.token以%@開頭」。因此,現在我們只是在其索引字段上搜索一個表,並且我們不必在where子句的右側進行任何擴展。 Coredata的搜索速度非常快。我唯一做的另一件事是將NSTimer放在shouldReloadTableForSearchString中,以便在1秒鐘不活動後觸發搜索。

UISearchDisplayController - wait for N seconds OR for user to press "Search" before conducting search

+0

這只是我的看法,不知道你是否可以做到,但是因爲我在做iOS開發,所以我擺脫了我所有的Web應用+關係數據庫背景,有時候我發現真的很有幫助計算多字段值然後將其存儲在非持久性或持久性屬性中,僅用於特定的提取請求。只需記住在NSManagedObject的保存和更新期間刷新數據。 – Leonardo

+0

你看過哪個視頻,你能分享一下嗎?另外,既然你有多個實體你使用了一個單一的searchToken對象還是不止一個?將單個搜索標記對象連接到多個實體的任何問題?感謝您使這個答案如此有用。 –

回答

3

使用複合謂語會給你同樣的結果作爲長字符串||,所以沒有,那也不會幫助。

可能有所幫助的是優化謂詞的順序。它們從左向右進行評估,只要結果已知,評估就會停止。如果你有一個長的邏輯或的鏈,並且第一個是真的,那麼它們的其餘部分是什麼樣的並不重要。這些謂詞甚至不會被評估。

因此,如果您可以合理地預計某些屬性比其他屬性更可能匹配,請將它們移到列表的前面。如果幾乎所有的時候都會是YES,那就做第一個吧。

此外,如果這些謂詞中的任何一個是數字,則將這些謂詞移動到該行的前面。數字比較比字符串比較快得多,所以任何返回YES的數字檢查都可以讓您跳過任何後續的字符串比較。

+0

同樣在NSFetchRequest上,您可以指定獲取限制和/或批量大小 – rfrittelli

+0

是的 - 批量大小確實幫助了很多!謝謝。 – tmeisenh

+0

謝謝湯姆!我想這是coredata在封面下做的事情,但我不確定.. – tmeisenh