许可研究 0.1.0

许可研究 0.1.0

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布上次发布2014年12月

Jérôme Morissard 维护。



  • 作者:
  • Morissard Jérome

一个 iOS 搜索引擎,允许在大量数据中搜索元素时出现错误。许多开发者会执行对 CoreData 数据库或 NSArray 的 predicate 进行过滤的 fetch 请求。

Image

许可研究是简化搜索步骤的一个替代方案。优点:

  • 不再有 CoreData (context/thread) 的问题,
  • 性能,
  • 100% 可重用于需要在大数据中进行分析的每个项目,
  • 搜索算法可以轻松自定义,
  • 已实现 3 种算法,

性能(在 iPhone4 上,搜索 5000 个对象 4 个属性)

搜索类型 时间(ms) 数据结构
精确搜索 200 使用谓词
精确搜索 2800 使用许可研究(ExactScoringOperation*)
精确搜索 100 使用许可研究(HeuristicScoringOperation*)
精确搜索 700 使用许可研究(HeurexactScoringOperation*)
容错搜索 不可能... 使用谓词
容错搜索 2800 使用许可研究(ExactScoringOperation*)
容错搜索 100 使用许可研究(HeuristicScoringOperation*)
容错搜索 700 使用许可研究(HeurexactScoringOperation*)
  • ExactScoringOperation:进行复杂和全面的分析,
  • HeuristicScoringOperation:使用片段进行扫描(默认大小 3),
  • HeurexactScoringOperation:使用片段进行扫描(默认大小 3),然后对最佳预选对象进行复杂和全面的分析。

算法

它是 Smith-Waterman 算法 的自定义实现。该算法的目的是获得最佳局部对齐。使用相似性矩阵来容忍错误。

共享实例

[[PermissiveResearchDatabase sharedDatabase] setDatasource:self];

用于填写您的搜索数据库的数据源方法

-(void)rebuildDatabase
- (void)addObject:(id)obj forKey:(NSString *)key;
- (void)addObjects:(NSArray *)obj forKey:(NSString *)key;
- (void)addObjects:(NSArray *)objs forKeys:(NSArray *)keys;
- (void)addObjects:(NSArray *)objs forKeyPaths:(NSArray *)KeyPaths;

- (void)addManagedObject:(NSManagedObject *)obj forKey:(NSString *)key;
- (void)addManagedObjects:(NSArray *)objs forKey:(NSString *)key;
- (void)addManagedObjects:(NSArray *)objs forKeys:(NSArray *)keys;
- (void)addManagedObjects:(NSArray *)objs forKeyPaths:(NSArray *)KeyPaths;

示例

///PermissiveResearchDatabase datasource
-(void)rebuildDatabase
{
    NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"data5000"
                                                         ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:jsonPath];
    NSError *error = nil;
    id json = [NSJSONSerialization JSONObjectWithData:data
                                              options:kNilOptions
                                                error:&error];

    [[PermissiveResearchDatabase sharedDatabase] addObjects:json forKeyPaths:@[@"name",@"gender",@"company",@"email"]];
    self.searchedList = json;
}

用于自定义评分方法的的数据源方法

-(NSInteger)customCostForEvent:(ScoringEvent)event

示例(默认值)

-(NSInteger)customCostForEvent:(ScoringEvent)event
{
    switch (event) {
        case ScoringEventPerfectMatch:
            return 2;
            break;

        case ScoringEventNotPerfectMatchKeyboardAnalyseHelp:
            return 1;
            break;

        case ScoringEventNotPerfectBecauseOfAccents:
            return 2;
            break;

        case ScoringEventLetterAddition:
            return -1;
            break;

        default:
            break;
    }

    return NSNotFound;
}

使用许可研究委托进行简单搜索操作


[[PermissiveResearchDatabase sharedDatabase] setDelegate:self];
[[PermissiveResearchDatabase sharedDatabase] searchString:searchedString withOperation:ScoringOperationTypeExact];

#pragma mark PermissiveResearchDelegate

-(void)searchCompletedWithResults:(NSArray *)results
{
    dispatch_async(dispatch_get_main_queue(), ^{
        self.findedElements = results;
        [self.tableView reloadData];
    });
}

创建您的第一次搜索操作


    [[ScoringOperationQueue mainQueue] cancelAllOperations]
    HeuristicScoringOperation *ope = [[HeuristicScoringOperation alloc] init];
    ope.searchedString = searchedString;

    SearchCompletionBlock block = ^(NSArray *results) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.findedElements = results;
            NSLog(@"finded elements %@", results);
        });
    };

    [ope setCustomCompletionBlock:block];
    [[ScoringOperationQueue mainQueue] addOperation:ope];

实际上有3种操作,具体使用取决于您需要的性能。

算法的复杂度非常不同。启发式评分操作 < 确切评分操作 << 精确评分操作

ExactScoringOperation
HeuristicScoringOperation
HeurexactScoringOperation

待办事项

  • 容忍键盘错误,非常接近的字母也可以容忍。