您所在的位置:小祥子 » 编程 » IOS » 正文

iOS- 如何建立索引实现本地文本搜索引擎,允许容错搜索?

时间:2015-05-26 编辑:清澈Saup 来源:本站整理

1.前言  

实现一个本地搜索引擎,允许容错搜索,也就是搜索结果不需要和搜索的关键字完全精准匹配。比如,搜索”eric wang“,搜索结果可以包括Erica Watts等等。搜索效率十分高. 这里我们需要用到作者:Jerome Morissard的Lib,大家可以进我的github下载. https://github.com/SaupClear/qingchegithub    

2.PermissiveResearch的使用  

2.1.导入核心.h文件  

2.2.在文本输入控件发生变化时我们开始实现文本检索  

也就是在下面这个代理方法每次被调用时,我们开始检索  

2.3.需要检索的数据仓库初始化  

#pragma mark 检索数据仓库初始化
/**
 *  检索数据初始化
 */
-(void)rebuildDatabase{
   
    //你自己代码里需要检索的数据
    NSArray *allmenus = self.mainDelegate.gbdata.objMenu.MenuItemArray;
   
    //将自己代码里需要检索的数据对象添加进检索数据仓库,并且关联上name
   
    for (MenuItemObject *objmenu in allmenus) {
       
        //第一个参数为你需要检索的对象 obj ,第二个为你对象obj.name (例如根据 name.检索)
        [[PermissiveResearchDatabase sharedDatabase] addRetainedObjet:objmenu forKey:objmenu.displayname];
    }
}

 2.4.开始检索  

 检索十步走  
   
    //1.首先清空搜索结果数组
    [self.arraySearchMenu removeAllObjects];
   
    //2.将文本控制用户输入的字符进行简单处理
    NSString *final = [textField.text stringByReplacingCharactersInRange:range withString:string];
   
   
    //3.开始检索
    NSLog(@"Start search by matrix");
   
    //4.消除所有
    [[ScoringOperationQueue mainQueue] cancelAllOperations];
   
    //5.初始化
    ExactScoringOperation *ope = [[ExactScoringOperation alloc] init];
   
    //6.要检索的字符串赋值
    ope.searchedString = final;
   
    //7.调用检索block 返回检索到的结果
    SearchCompletionBlock block = ^(NSArray *results) {
       
        dispatch_async(dispatch_get_main_queue(), ^{
           
            //8.注意:这里统一检索出来的对象 都是PermissiveObject
            //你自己需要的检索出来真在的对象是在PermissiveObject.refencedObject里
            NSMutableArray *permissiveObj = [NSMutableArray arrayWithArray:results];
           
            //9.取出检索到你每个需要的数据 然后添加进检索结果的数据
            for (PermissiveObject *perobj in permissiveObj) {
               
                MenuSearchObject *obj=[[MenuSearchObject alloc]init];
               
                MenuItemObject *objMenu = perobj.refencedObject;
                //测试log
                NSLog(@"%@",objmenu.displayname);
               
                obj.menuid=[NSNumber numberWithInteger:objMenu.menuid.integerValue];
               
                [self.arraySearchMenu addObject:obj];   // add filter menu objection
               
            }
            //10.刷新显示检索结果的tableView
            [self.searchTableview reloadData];
           
            NSLog(@"End search by matrix");
           
        });
       
    };
   
   
    //检索完成
    [ope setCustomCompletionBlock:block];
    //添加操作 End.
    [[ScoringOperationQueue mainQueue] addOperation:ope];
如果还有什么不明白欢迎在下面留言,有时间的我回一一回复,谢谢大家。     作者: 清澈Saup
出处: http://www.cnblogs.com/qingche/
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。