Apple的核心数据框架中的全文搜索

时间:2009-12-10 06:16:04

标签: iphone sqlite core-data full-text-search

我想在iPhone应用程序中实现全文搜索。我有数据存储在我通过Core Data框架访问的sqlite数据库中。只是使用谓词和ORing每个搜索词和列的一堆“包含[cd]”短语根本不能正常工作。

你做了什么似乎运作良好?

5 个答案:

答案 0 :(得分:9)

我们让FTS3在150,000多条记录上运行得非常好。我们获得亚秒查询时间,在单个关键字查询中返回超过200个结果。

目前让Sqlite FTS3在iPhone上运行的唯一方法是编译自己的二进制文件并将其链接到您的项目。据我所知,您自己项目中包含的二进制文件不适用于Core Data。也许Apple将在未来版本中启用FTS3编译器选项?

您仍然可以使用自己的Sqlite FTS3二进制文件进行链接,并仅将其用于全文搜索。这与在Web App环境中使用Sphinx或Lucene的方式非常相似。请注意,您仍需要在某个时刻更新搜索索引,以保持与Core Data存储的同步。

祝你好运!!

答案 1 :(得分:1)

我认为“不能很好地工作”你的意思是“表现糟糕”。全文搜索总是相对较慢,尤其是在内存或空间受限的环境中。您可以通过确保将要搜索的属性编入索引并使用BEGINSWITH[cd]代替CONTAINS[cd]来加快速度。我的回忆(目前找不到cocoa-dev帖子)是SQLite将使用索引进行前缀匹配,但是回退到对中缀搜索的线性搜索。

答案 2 :(得分:0)

我在谓词中使用contains[cd],这很好用。也许你可以发布你的谓词,我们可以看出是否有明显的错误。

答案 3 :(得分:0)

Sqlite有自己的全文索引模块:http://sqlite.org/fts3.html

您必须完全控制发送给db的SQL(我不知道Core Data的工作原理),但使用全文索引模块是SQL SELECT语句中执行速度和简单性的关键。做全文搜索。

如果你不需要快速执行就可以使用CONTAINS,但是用它做的选择不能使用常规索引,所以注定要慢,而数据库越大它就越慢。使用真正的全文索引允许使用“CONTAINS”进行相同类型的搜索,但即使使用大型数据库,也会为快速结果编制索引。

答案 4 :(得分:0)

我一直在研究同样的问题,然后开始跟进my post about this from a few weeks ago。我没有使用CONTAINS,而是为每个规范化的单词创建了一个带有实例的独立实体。我在单词上添加了一个索引(在XCode模型构建器中),然后可以使用BEGINSWITH运算符来利用索引。然而,正如我just posted a few minutes ago,即使是小数据集,查询时间仍然很慢。

一定有更好的方法!毕竟,我们在很多应用中看到了这种全文搜索!