2011-07-19 8 views
1

ファイルを表すCoreDataオブジェクトの大きなコレクションがあります。定期的に、私はこのコレクションを検索し、特定のパスに存在するファイルを見つける必要があります。現在、私は次のNSPredicateを構築しており、かなり基本的なexecuteFetchRequestを実行して、クエリに一致するすべての結果を検索しています。CoreDataフルテキストクエリの最適化

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"path ==[c] %@", receivedPath]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Files" inManagedObjectContext:self.moc]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 
[request setFetchBatchSize:10]; 

NSError *error = nil; 
NSArray *results = [self.moc executeFetchRequest:request error:&error]; 
[request release]; 

私がいる問題は、この機能はかなり頻繁に呼び出されることで、executeFetchRequestは(インスツルメンツは98.1パーセントと、関数は合計で約49.2パーセントを占めて私に指示、実行時間のかなりの割合を占めていますexecuteFetchRequest呼び出しで費やされた合計の合計)。私は永続的なストアのためにNSSQLiteStoreTypeを使用していて、pathの属性が私のMOMにインデックスされています。

私はこれをどのように最適化できますか?私はlowercasePath属性を設定することを考えていましたが、比較に[c]修飾子を控えていましたが、実行時にどのような影響があったかはわかりません。

ご協力いただければ幸いです。

+0

MacまたはiOS? Macでは、[検索キット](http://developer.apple.com/library/mac/#documentation/UserExperience/Reference/SearchKit/Reference/reference.html)はおそらくフルテキスト検索を行うのに適しています。 – omz

+0

私は言及していないことをお詫び申し上げます。これはMac上にあります。 – ndg

答えて

0

[c]を削除すると効果があります。 ==[c]はおそらくSQLite LIKE演算子に変換されていますが、これは正しく覚えていればSQLiteではインデックスを使用できません。それについて言えば、あなたのモデルには索引付けされた属性がありますか?そうでない場合は、そうする必要がありますが、大文字と小文字を区別しない検索でも、これは違いはありません。

+0

これは私に少し希望を与えます。 -com.apple.CoreData.SQLDebug引数を有効にすると、実行されるLIKEクエリが表示されません。すべてのフルテキスト比較はNSCoreDataStringCompare関数によって実行されているように見えますが、これはドキュメントを見つけることができません。 – ndg

+0

おそらく 'LIKE'と似たようなことがあります。クエリでカスタム関数を使うようにSQLiteを設定することは可能です。普通の '=='を使うと同じことがありますか? – omz

+0

いいえ! [c]修飾子を削除すると単純なパスになりますか?クエリ。私はそれを試して、あなたの答えをマークして、それが問題を解決すれば正しい! – ndg