我需要我的iPhone / iPad应用程序能够快速搜索记录中包含的任何子字符串的大约10,000条记录(大约每段文本段)。因此,如果记录包含单词“Flame”,则查询“lame”应该匹配。
我目前正在使用SQLite,但“LIKE%term%”搜索对于这么多记录来说太慢了。启用全文搜索似乎不能完全满足我的需求,因为SQLite只支持前缀通配符(例如“Flam *”,而不是“* lame”)。
我已经尝试过使用一大块文本(~350K)和[NSString rangeOfString:...],我认为它使用的是Boyer-Moore算法。这比“LIKE%term%”搜索更快,但仍然不是我希望的那种速度。
对于实现这种可扩展子字符串搜索的方法或库的任何建议,哪些可以在iPhone上运行?
答案 0 :(得分:2)
以下是一些不同的选项。我不知道每个的标记,所以你必须做一些测试。
首先是SQLite的FTS3扩展。这应该为您提供快速,索引的全文搜索: http://regularrateandrhythm.com/regular-rate-rhythm-blog/sqlite3-fts-in-IOS4.html
那么,在iOS 4中引入的正则表达式如何:
http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html
对于iOS 4之前的版本,您可以使用RegexKitLite:
http://regexkit.sourceforge.net/RegexKitLite/index.html
如果您决定使用正则表达式,请查看此条目以了解如何优化它们:
How to speed up iPhone regular expressions with NSRegularExpression?
答案 1 :(得分:0)
也许考虑将第二种方法与异步方法结合起来。将大块文本划分为5,10,无论大小如何,并使用相同数量的线程分别搜索它们。然后通过使用知道如何正确定位匹配的坐标系统来组合结果(例如,线程5搜索到的区域5并且在位置337处找到与文档x相关的匹配,位置y)。您会发现添加更多线程没有任何好处是有限的,因此这是首先要弄清楚的。
答案 2 :(得分:0)
如果您无法对文本进行标记(将其拆分为单词),则无法将其编入索引。这就是LIKE是顺序搜索的原因。除非您的子字符串可以以某种方式受到约束(例如,总是删除子字符串的第一个字母或固定长度),否则您的文本不能存储为所有可能标记的列表,并且这些标记无法编入索引。关键(双关语)是找到一个算法,该算法产生足够小的标记列表,索引它们的成本低于线性搜索的成本。