如何优化全文搜索的 Core Data 查询

2023-12-31

在文本中搜索匹配单词时可以优化核心数据查询吗? (这个问题也涉及到 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)中,我担心自动生成的数据库会因元数据、不必要的反向关系、低效的属性数据类型等而变得臃肿。

我应该潜入还是谨慎行事?


我做了一个解决方案。我认为它类似于这个帖子 https://stackoverflow.com/questions/1878962/full-text-searching-in-apples-core-data-framework/2076064#2076064。我将合并源代码添加到我的 Core Data 项目中,然后创建一个不是托管对象子类的全文搜索类。在 FTS I 类中#import "sqlite3.h"(源文件)而不是 sqlite 框架。 FTS 类保存到与 Core Data 持久存储不同的 .sqlite 文件。

当我导入数据时,Core Data 对象将相关 FTS 对象的 rowid 存储为整数属性。我有一个静态数据集,因此我不担心引用完整性,但维护完整性的代码应该很简单。

为了执行 FTS,我MATCH查询 FTS 类,返回一组 rowid。在我的托管对象类中,我使用以下命令查询相应的对象[NSPredicate predicateWithFormat:@"rowid IN %@", rowids]。我避免以这种方式遍历任何多对多关系。

性能的提升是巨大的。我的数据集有 142287 行,包括 194MB(核心数据)和 92MB(删除停用词的 FTS)。根据搜索词频率的不同,我的搜索时间从几秒变为不常见词(2000 次点击)的搜索时间为 0.2 秒。

我确信我的方法存在无数问题(代码膨胀、可能的命名空间冲突、丢失一些核心数据功能),但它似乎有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优化全文搜索的 Core Data 查询 的相关文章

  • 如何增加每次 INSERT INTO 迭代的值?

    我有一个查询 如下所示 第 1 列位于 另一列是 varchar 100 INSERT INTO TABLE1 column1 column2 SELECT MAX column1 FROM TABLE1 1 anotherColumn F
  • 使用递归 CTE 遍历父/子树?

    我被 cte 困住了 我想要一个查询 其中第一个父级为空 上一个父级的子级将成为下一个父级的父级 依此类推 WITH RESULT PARENT CHILD TNAME LEVEL AS anchor SELECT E PARENT GEN
  • iOS 8 启动图像文件 - 导航栏和状态栏

    我正在使用 Interface Builder 制作 iOS 8 的启动图像文件 我想要的启动图像非常简单 我认为与 设置 应用程序相同 顶部的导航栏带有一个空的分组 TableView 无标题等 请注意 我通常不使用 Interface
  • Phonegap 不显示警报

    为什么phonegap不显示警报通知 运行于 iPhone 5 1 1 phonegap Phonegap 2 1 0 0 g26d211b 山狮 10 8 2 xcode 4 4 1
  • iPhone只能使用SQLite数据库吗?

    iPhone 可以使用 SQLite 之外的其他数据库吗 比如 MySQL iPhone 只能直接在设备上使用 SQLite 作为数据库 这意味着 iPhone 内部没有 MySQL 服务器 但是您可以并且可以自由地拥有 您自己的 MySQ
  • 如何在条件持续时在Mysql中选择行

    我有这样的事情 Name Value A 10 B 9 C 8 意思是 这些值是按降序排列的 我需要创建一个新表 其中包含占总值 60 的值 所以 这可能是一个伪代码 set Total sum value set counter 0 fo
  • 如何在我的查询中使用日期格式?

    这适用于 phpmyadmin 但是当我在代码上使用时给我一个错误 错误说 解析错误 语法错误 意外的 我的语法有什么问题 gt
  • postgresql 中的咨询锁超时

    我正在从 ORACLE 迁移 目前我正在尝试移植此呼叫 lkstat DBMS LOCK REQUEST lkhndl DBMS LOCK X MODE lktimeout true 这个功能 http docs oracle com cd
  • 复制具有不同列名的 MySQL 表

    我需要将 table1 中与特定列匹配的所有行复制到具有不同列名称的 table2 中 例如 table1 name oldAddressBook table1 的列 name Name Surname Number table2 name
  • iPhone 录音时不振动

    我正在修改 AurioTouch 示例 我想振动手机以响应特定的声音输入 我可以检测输入并printf他们 但是AudioServicesPlaySystemSound kSystemSoundID Vibrate 会话期间不执行任何操作k
  • initWithFrame 与 initWithStyle

    我想从已弃用的 TableView 中更新initWithFrame reuseIdentifier 我的表格视图使用自定义单元格 到处都说要使用initWithStyle 并且它不会以任何方式改变行为或细胞initWithFrame CG
  • 我需要进行哪些更改才能让我的表在 AppEngine 的 BigTable 上运行?

    假设我有一个预订数据库 其中包括users user id fname lname 和他们的tickets ticket id user id flight no 以及相关的flights flight no airline departu
  • 何时使用 takeUnretainedValue() 或 takeRetainedValue() 来检索 Swift 中的非托管对象?

    根据将 Swift 与 Cocoa 和 Objective C 结合使用 https developer apple com library prerelease ios documentation Swift Conceptual Bui
  • NSXMLParser 解析使用 Windows-1256 编码的 xml 文件

    我想解析 Windows 1256 编码的 rss 文件 但解析器没有读取它 我用 UTF8 编码做了很多解析 但只有这个不起作用 为什么 带有 Windows 1256 的 rss 文件 http youm7 com Rss asp 解决
  • “UITableViewCell 附件复选标记”是图像吗?

    我需要定义一个自定义UITableViewCell哪里的UITableViewCellAccessoryCheckmark位于 a 的左侧UILabel 我应该将其定义为图像还是有更聪明的方法 非常感谢 卡洛斯 这只是一个关于苹果文档 ht
  • 具有自定义背景图像的 iPhone UITableView PlainStyle - 在代码中“完全”完成

    我已经走遍了所有的地方 似乎UITableView静态背景问题已有详细记录 但没有人有直接的解决方案 我正在建设我的TableViews完全在代码中 如下所示 UIViewController tableViewController Tab
  • 将 .sql 文件导入 SQLite

    我正在尝试将大型 sql 文件导入 SQLite db 文件 但出现以下错误 sqlite gt read smsCorpus en 2012 04 30 sql Error near line 23 near COMMENT syntax
  • PHP/MySQL - 在数据库中存储数组

    我正在开发一个 PHP 应用程序 它需要将各种设置存储在数据库中 客户经常询问是否可以添加或更改 删除某些内容 这导致了表格设计出现问题 基本上 我有很多布尔字段 它们只是指示是否为特定记录启用了各种设置 为了避免再弄乱表格 我正在考虑将数
  • 选择具有按两列分组的最大值的行

    我见过很多关于此类问题的解决方案 尤其是这个SQL 仅选择列上具有最大值的行 https stackoverflow com questions 7745609 sql select only rows with max value on
  • Knex 中的表的别名

    我有一个 SQL 查询两次引用同一个表 并且我需要将该表别名为两个单独的别名 我不太清楚如何用 Knex 来编写它 有一个 单词 表和一个 用户 表 Words 表有两个外键 author id 和 winner id 引用 Users 表

随机推荐