在文本中搜索匹配单词时可以优化核心数据查询吗? (这个问题也涉及到 iPhone 上自定义 SQL 与 Core Data 的区别。)
我正在开发一款新的(iPhone)应用程序,它是科学数据库的手持参考工具。主界面是一个标准的可搜索表格视图,我希望在用户输入新单词时得到即时响应。单词匹配必须是文本中单词的前缀。文本由 100,000 个单词组成。
在我的原型中,我直接编写了 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 至关重要,它可以让我快速显示结果。我通知用户,如果达到限制,则显示太多。这很糟糕。
在过去的几天里,我一直在思考迁移到核心数据的优势,但我担心对重要查询的架构、索引和查询缺乏控制。
理论上的 NSPredicatetextField MATCHES '.*\bfoo.*'
会起作用,但我确信它会很慢。这种文本搜索似乎很常见,我想知道通常的攻击是什么?您会像我上面那样创建一个单词实体并使用“word BEGINSWITH 'foo'”谓词吗?它的工作速度会像我的原型一样快吗? Core Data 会自动创建正确的索引吗?我找不到任何明确的方法来向持久存储提供关于索引的建议。
我在我的 iPhone 应用程序中看到了 Core Data 的一些很好的优势。故障和其他内存考虑因素允许对表视图查询进行高效的数据库检索,而无需设置任意限制。对象图管理使我能够轻松遍历实体,而无需编写大量 SQL。将来迁移功能会很好。另一方面,在有限的资源环境(iPhone)中,我担心自动生成的数据库会因元数据、不必要的反向关系、低效的属性数据类型等而变得臃肿。
我应该潜入还是谨慎行事?