iOS应用搜索大量文本

时间:2013-03-28 00:46:20

标签: objective-c cocoa-touch search

如果这是重复,我道歉,但老实说,我已经尽力研究这个并且没有提出太多。

我正在制作一个iPad参考应用程序,可以搜索几个大型教科书(总共可能有3-4k页)。这是一个相当简单的想法:用户可以选择任何文本组合进行搜索,放入他的术语,应用程序将在所有文本中找到这些术语并将其返回,并在表格视图中编制索引。

视图控制器有一系列开关,其值由方法读入NSSet并传递给搜索控制器。那部分有效。

我有一个SearchController类,视图控制器实例化并调用方法:

-(void)performSearchWithString:(NSString *)searchString andTexts:(NSSet *)texts
{
for (id book in texts) {
    if ([book isEqual:kBook1]){
        NSError *error = nil;
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"neiJing" withExtension:@"txt"];
        NSString *text = [NSString stringWithContentsOfURL:url encoding:NSStringEncodingConversionAllowLossy error:&error];
        [text enumerateSubstringsInRange:NSMakeRange(0, [text length])
                                 options:NSStringEnumerationByWords
                              usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                  NSRange found = [substring rangeOfString:text];
                                  if (found.location != NSNotFound) {
                                      NSLog(@"%@", substring);
                                  } else {
                                      NSLog(@"Not found");
                                  }
                              }];
    }

我似乎成功地枚举了所有文本中的每个单词,但没有找到返回值,所以我只得到一个永无止境的“未找到”流。

我在每个我确定知道的文本中插入了一个测试短语,但它不会出现。

我有一种感觉,我认为这一切都错了。即使我做了这个工作,对于一个可用的应用程序来说性能打击可能太大了......我仍然试图将我的头围绕在块上。我还没有找到任何现成的解决方案来搜索大量文本并选择结果。如果有人对我可能适应的开源库有任何提示或参考,我将非常感激。

2 个答案:

答案 0 :(得分:2)

看起来你正在搜索传递给块的每个子字符串中的整个文本。这一行是问题(并导致保留周期):

NSRange found = [substring rangeOfString:text];

代码需要寻找可以找到的东西:

NSString *findMe = @"A string we expect to find";        
[text enumerateSubstringsInRange:NSMakeRange(0, [text length])
                         options:NSStringEnumerationByWords
                      usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                  if ([findMe isEqualToString:substring] ) {
                                      NSLog(@"Found %@", substring);
                                  } else {
                                      NSLog(@"Not found");
                                  }
                              }];

答案 1 :(得分:1)

我不认为代码块是你想要的。它循环遍历文本中的每个单词,并且您想要查找所有搜索字符串。这是一个循环,根据上次成功匹配设置新的搜索范围。

-(void)performSearchWithString:(NSString *)searchString andTexts:(NSSet *)texts
{
for (id book in texts) {
    if ([book isEqual:kBook1]){
        NSError *error = nil;
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"neiJing" withExtension:@"txt"];
        NSString *text = [NSString stringWithContentsOfURL:url encoding:NSStringEncodingConversionAllowLossy error:&error];

        NSRange searchRange = NSMakeRange(0, [text length]);
        NSRange match = [text rangeOfString:searchString options:0 range:searchRange];
        while (match.location != NSNotFound) {

            // match is the range of the current successful match
            NSLog(@"matching range -- %@", NSStringFromRange(match));

            NSUInteger locationOfNextSearchRange = NSMaxRange(match);
            searchRange = NSMakeRange(locationOfNextSearchRange, [text length] - locationOfNextSearchRange);
            match = [text rangeOfString:searchString options:0 range:searchRange];
        }
    }
}