如何为一个非常大的 Core Data 数据库创建一个快速搜索机制?
Posted
技术标签:
【中文标题】如何为一个非常大的 Core Data 数据库创建一个快速搜索机制?【英文标题】:How to create a quick seach-as-you-type mechanism for a very large Core Data database? 【发布时间】:2012-04-13 08:08:03 【问题描述】:我正在尝试实现一种快速搜索即键入机制。
在我当前的实现中,当用户第一次启动应用程序时,他必须稍等片刻才能完成下载过程。在此期间,正在下载有关该应用程序销售的 20,000 种产品的信息。每个产品都由一个 NSManagedObject 实例表示,并被添加到 Core Data 数据库中。
真正的问题是使用这些产品的方式。用户再次启动应用程序(不是第一次)后,需要将产品加载到内存中,以便快速搜索。 为此,我遍历整个数据库并为每个包含其信息的产品创建一个 NSDictionary 实例,因为在我的程序中使用字典对象来检索有关产品的信息要容易得多。
因为字典存储在内存中,因此搜索过程非常快,但是迭代 20,000 个对象(每次启动一次)并创建字典需要很多时间(大约一分钟),因此解决方案不是不错。
我想到了另一种实现快速搜索目标的方法:在输入每个字母后从数据库中获取对象。但我不知道它会多快。
推荐的方法是什么?
谢谢, 萨吉夫特
【问题讨论】:
搜索是如何完成的?是按产品名称匹配的文本搜索吗? 搜索是使用 NSPredicate 完成的。搜索很复杂:除了搜索搜索的文本是否与产品名称匹配外,我还要检查搜索的文本是否与产品的制造商匹配,或者它是否包含有关产品尺寸、数量、价格等的信息。 您是否考虑在包含匹配关键字的可搜索实体上使用附加字符串属性?这将让您仅在该属性上查询匹配项,而不是在许多索引字段上。您可以在播种数据时填充该属性。 此外,在 Core Data 中查询 Unicode 文本非常耗时,因此如果您使用包含可搜索关键字的附加属性,请确保这些属性已标准化。此处示例:developer.apple.com/library/mac/ipad/#samplecode/… 【参考方案1】:我的应用中有类似的功能,但记录要少得多。我在所有搜索字段上都有索引,并从输入中创建尽可能简单(便宜)的 sql 查询(NSPredicate)(第二个 fetchedResultsController 仅用于搜索)。结果集包含“搜索项”。对于文本类型搜索键随机分布的大约 1000 个条目(测试数据大小),这至少足够快。在后台获取以防止 gui 无响应可能是一个好主意。
【讨论】:
在后台获取是个好主意,但我不确定使用 20k 个项目的数据库会有多快。以上是关于如何为一个非常大的 Core Data 数据库创建一个快速搜索机制?的主要内容,如果未能解决你的问题,请参考以下文章
如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?
如何为依赖于关系的自定义 Core Data 属性发布通知?