• 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];
    
    如果还有什么不明白欢迎在下面留言,有时间的我回一一回复,谢谢大家。
     
     
    作者: 清澈Saup
    出处: http://www.cnblogs.com/qingche/
    本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
      
     
     
  • 相关阅读:
    乐乐的作业
    Spring中配置数据源的5种形式
    乐观锁和悲观锁的区别
    使用Nexus搭建Maven私服
    Maven错误记录
    Maven学习笔记(一)
    Eclipse的SVN插件下载
    SSH整合(Struts2+Spring+Hibernate)
    java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    使用mss2sql将SqlServer转换为Mysql
  • 原文地址:https://www.cnblogs.com/qingche/p/4530826.html
Copyright © 2020-2023  润新知