我正在基于我的一个基于Core Data的应用程序中开发搜索功能,并且我试图收集每个人在搜索优化方面的技巧,以尽可能快地获得它。 搜索必须足够快,才能为20,000个以上的对象的数据库提供近乎瞬时的结果。
到目前为止我所做的(就优化而言)
name
属性,并在初始导入过程中通过将主要实体中的相关字符串分开并对其进行规范化(除去大小写和变音符号)来创建关键字> =
和 二进制比较器,而不是 BEGINSWITH
等。我的谓词格式为:
SUBQUERY(keywords,$ keyword,($ keyword.name> = $ LB )AND($ keyword.name
其中 $ LB
是下界字符串, $ UB
是上界。 我使用此格式和搜索项数组创建了一个复合 AND
谓词。
目前,我正在执行一次提取操作(当用户键入第一个字母时),批处理大小为 大约20,然后在继续输入时使用NSArray的-filteredArrayUsingPredicate方法缩小搜索范围。 我还预取了关键字
关系,因为它用于过滤。 显然,占用时间最多的部分是初始获取。 在大约15,000个对象的库中,有大约1-2s的明显延迟。 时间分析表明确实是造成延迟的原因:
http://cl.ly/3a1b2022452M2V323f2H
还有一点值得注意,我必须为结果获取多个实体。 所有实体都具有 ranking
属性,但我一次无法获取多个,因此我被迫分别获取它们,将它们组合成一个数组,然后通过手动排序 ] -sortedArrayUsingDescriptors
。
关于如何加快此速度的任何提示将不胜感激。
编辑:基于@ImHuntingWabbits的建议:
添加 KeywordFirstChar
实体后,我的数据模型(简化了) 看起来像这样:
现在,问题是我如何为基于 KeywordFirstChar
获取的 Car
实体编写谓词? 我唯一能想到的是:
SUBQUERY(关键字,$ keyword,$ keyword.firstChar.char ==%@)
其中%@
是要搜索的字符 ,但我不知道这样做是否会更加有效,因为除非我误解了这些建议,否则仍然必须枚举关键字
。