在文本中搜索匹配词时,我可以优化核心数据查询吗? (这个问题也适用于定制SQL与iPhone上的核心数据的智慧。)如何针对全文搜索优化核心数据查询
我正在研究一个新的(iPhone)应用程序,它是科学数据库的手持参考工具。主界面是一个标准的可搜索表格视图,当用户键入新单词时,我想让你的类型响应。单词匹配必须是文本中单词的前缀。文本由10万字组成。
在我的原型中,我直接编码SQL。我创建了一个单独的“单词”表,其中包含主实体文本字段中的每个单词。我索引的单词和执行搜索沿线
SELECT id, * FROM textTable
JOIN (SELECT DISTINCT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz')
ON id=textTableId
LIMIT 50
这运行速度非常快。使用IN可能也是一样,即
SELECT * FROM textTable
WHERE id IN (SELECT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz')
LIMIT 50
该LIMIT是至关重要的,并且允许我快速显示结果。如果达到限制,我通知用户需要显示太多内容。这是kludgy。
我已经花了最近几天思考转移到核心数据的优势,但我担心模式,索引和查询重要查询缺乏控制。
从理论上讲,textField MATCHES '.*\bfoo.*'
的NSPredicate可以正常工作,但我相信它会很慢。这种文本搜索看起来很普遍,我不知道通常的攻击是什么?你会像我上面做的那样创建一个单词实体,并使用“单词BEGINSWITH'foo'”的谓词吗?它的工作速度与我的原型一样快吗?核心数据会自动创建正确的索引?我找不到任何明确的建议关于索引的持久存储的方法。
我在我的iPhone应用程序中看到了Core Data的一些不错的优点。错误和其他内存考虑允许为tableview查询进行有效的数据库检索,而不设置任意限制。对象图管理允许我轻松遍历实体而无需编写大量的SQL。将来移植功能将会很好。另一方面,在有限的资源环境(iPhone)中,我担心自动生成的数据库会因为元数据,不必要的反向关系,低效的属性数据类型等而臃肿。
我应该潜入还是谨慎行事? 。
感谢您的回复。我现在正在编写命令行工具,以将初始sqlite数据加载到xcdatamodel兼容数据库中。涉及实质性劳动。我会报告我的经验。 – 2009-11-23 17:38:02
为了跟进你的例子,我认为问题是一个提取请求不会在Word实体上,而是在textTable实体上。 (例如,假设textTable包含电子邮件信息,Word包含所有电子邮件字段中的所有单词)。我认为这会使问题显得复杂化,因为fetchResultsController必须保存通过谓词过滤的textTable实体 - 而这样的ANY或SUBQUERY谓词是慢。 也许有一种方法可以在“相反”的方向上做到这一点:通过启动w/Word匹配,遵循反向关系,以及解析textTable。嗯。 – 2009-12-11 06:27:33
如果谓词的第一部分尽可能地减少了搜索空间,那么谓词的其余部分的整体执行速度会更快,其搜索空间更少。查看Core Data指南的性能部分:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/ TP40003468 – 2009-12-11 06:47:24