zoukankan      html  css  js  c++  java
  • 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/
    本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
      
     
     
  • 相关阅读:
    连续两天写论文
    既然杂事比较多,索性统统处理一下
    Power symbol
    不要被一些无谓的事情烦扰
    今天提前回去吧,整理一下,为下周做好准备。
    天气暖和了,我却感冒了
    每天回想一下,今天到底完成了什么
    opensue12.1硬盘升级安装12.2问题解决
    IPmsg(飞鸽传书)协议翻译
    关于交叉验证和过拟合
  • 原文地址:https://www.cnblogs.com/qingche/p/4530826.html
Copyright © 2011-2022 走看看