iOS- 如何建立索引实现本地文本搜索引擎,允许容错搜索?
1.前言
实现一个本地搜索引擎,允许容错搜索,也就是搜索结果不需要和搜索的关键字完全精准匹配。比如,搜索”eric wang“,搜索结果可以包括Erica Watts等等。搜索效率十分高.
这里我们需要用到作者:Jerome Morissard的Lib,大家可以进我的github下载.
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];
如果还有什么不明白欢迎在下面留言,有时间的我回一一回复,谢谢大家。