核心数据查询速度慢

时间:2010-01-28 23:57:13

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

提取与搜索栏中输入的字符相匹配的项目的秘诀是什么?例如,如果我在搜索栏中输入字母“W”,则会立即返回短语中任何字符位置包含字母“W”的所有短语。

因此,如果一个包含20,000个短语的数据库包含500个带有字母“W”的短语,则只要用户键入第一个字符,它们就会出现。然后,当输入其他字符时,列表会自动缩短。

我可以从iPhone发送查询到SQL服务器并得到这种类型的响应,但是,无论我们尝试什么并接受其他用户的建议,我们仍然无法在存储数据库时获得良好的响应时间在iPhone本地。

我知道这种性能可用,因为有许多其他应用程序会在您开始输入时立即显示结果。

请注意,这与索引每个短语中的所有单词不同,因为这只会出现单词以字符输入开头的匹配。在这种情况下,我们在单词中查找字符。

3 个答案:

答案 0 :(得分:1)

我认为异步结果过滤就是答案。每次用户键入新字符时,不要更新搜索结果,而是在键入第一个字符时将db查询放在后台线程上。如果在查询完成之前键入了新字符,请取消旧查询并启动新查询。最后,您将达到用户停止输入足够长的时间以使查询返回的程度。这样,查询本身就不会阻止用户输入。

我相信UISearchDisplayController类提供了这种类型的异步搜索,不过你是想要使用那个类还是只是采用异步设计模式取决于你。

答案 1 :(得分:0)

如果您愿意为此离开数据库,则可以使用包含短语中所有术语的通用后缀树。您可以在线性时间内构建后缀树,我相信,它可以使用它来非常快速地查找子串的所有出现。 Web上有很多关于后缀树和后缀数组的页面。维基百科可能是一个很好的起点。

答案 2 :(得分:0)

我有一个有趣的计划。您可以通过32位整数构建每个短语中存在的字符的索引。翻转位[0-25]以表示短语中存在的字符(不区分大小写)a-z。构建查询字符串的第二个位图。现在,您可以通过按位运算(&和|)进行比较以确定匹配。这非常快,并且信不信任SQLite实际上支持查询中的按位操作 - 所以你甚至可以使用这个方案直接进入数据库。我有一个工作代码,它在我们的一个iPhone应用程序中构建了它 - Alphagram。