我有一个带有 Verse 实体的模型,该模型与 Word 实体具有多对多关系。
我想找到包含用户正在搜索的所有单词的经文。
我猜它可以用一个谓词来完成
"ANY words.word == %@ AND ANY words.word == %@ AND ...", term1, term2, ...
这可以使用某种类型的 word-> Verse 索引,以避免将每节经文的单词与 term1 进行比较吗?
如果不是,应该如何更改(模型或)谓词以使此获取更有效?
我有一个带有 Verse 实体的模型,该模型与 Word 实体具有多对多关系。
我想找到包含用户正在搜索的所有单词的经文。
我猜它可以用一个谓词来完成
"ANY words.word == %@ AND ANY words.word == %@ AND ...", term1, term2, ...
这可以使用某种类型的 word-> Verse 索引,以避免将每节经文的单词与 term1 进行比较吗?
如果不是,应该如何更改(模型或)谓词以使此获取更有效?
我会NSPredicate
为每个术语创建一个,然后使用一个andPredicateWithSubpredicates:
NSCompoundPredicate
来执行搜索。如果是实时搜索,则在空格上重新加载搜索结果,或在每个字符上重新加载并使用一个带有 CONTAINS 的谓词。
首先,您可以在一个谓词中包含一个:
[NSPredicate predicateWithFormat:"ANY words.word CONTAINS %@", arrayOfWords];
但是,那会很慢。字符串比较很慢。不区分大小写和变音符号几乎是最慢的。您最好在您的Word
实体上拥有另一个属性,用于搜索您去除大小写和变音符号的位置,然后针对该字段进行搜索。您的搜索性能会更高。