2011-10-05 87 views
0

我正在使用NSFetchedResultsController在UITableView中显示一些搜索结果。搜索结果由以下谓词请求:性能不佳核心数据CONTAINS谓词

[NSPredicate predicateWithFormat:@"(plainText CONTAINS %@)", _searchString] 

搜索正在经历的实体约有25.000个对象。 plainText属性包含一个字符串值,每个约700字。

这个搜索大约需要20秒,这太慢了。

有没有什么办法来优化性能?

我观看了WWDC 2010 Session 137,她正在讨论将关键字规范化为单独的实体以避免使用CONTAINS。这是改进它的一种方法,每个我只有700个关键字。制作700 x 25.000 = 17.500.000个关键字。我怀疑它会改善。我应该尝试吗?

回答

3

在25,000个实体中为一个字符串搜索700个字的属性确实会很慢,是的。你的wddc想法是正确的 - 你想要创建一个单独的实体,它是一个单一的“关键字”,并有一对多的关系返回到你的实体。这样,您将很快找到一个关键字实体,然后很快找到25,000个实体。这样你就可以避免搜索每个很长的字符串。

tldr;是的,你应该尝试

+0

尽管这个想法确实非常实用,但我会小心数据库的大小是否重要,因为这种方法将会极大地增加它的大小。 – Craimasjien

+0

直到尝试才会知道。它可以减小尺寸,因为每个关键字都会存在一次。您将为每个实体存储约700 * 2 * sizeof(主键) - 关系表将包含实体的pk和关键字的pk。但是你会摆脱700 *(单词的平均长度)。我敢打赌,它只是一个洗脸。 – Colin

+0

嗨科林,谢谢你的回答。我确实创建了与Part实体(最初包含文本)具有多对多关系的Keyword实体。现在我需要最快的查询来获取包含所有查询关键字的部分。我用关键字实体上的NSFetchRequest用谓词(word == \“testword \”AND word = \“testword2 \”)尝试了这种方式,我很快得到了关键字。只有当我循环访问关键字并获得部分内容时,才需要很长时间。你知道更快的方法来做到这一点吗? –