CoreSpotlight索引

时间:2015-07-11 09:42:37

标签: ios indexing corespotlight

您好,我正在尝试在我的应用中实施CoreSpotlight。

当建立索引时,我是否每次都需要运行此命令,或者在第一次安装应用程序时运行此命令是否足够? 如果app被删除,我是否需要再次索引?

以下是我使用的代码:

- (void)spotLightIndexing {

    NSString *path = [[NSBundle mainBundle] pathForResource:
                      @"aDetailed" ofType:@"plist"];

    NSDictionary *plistDict = [[NSDictionary alloc] initWithContentsOfFile:path];
    NSArray *plistArray = [plistDict allKeys];

    for (id key in plistDict) {

        CSSearchableItemAttributeSet* attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeImage];

        // Set properties that describe attributes of the item such as title, description, and image.

        attributeSet.title = key;
        attributeSet.contentDescription = [plistDict objectForKey:key];

//*************************************

 attributeSet.keywords = plistArray; // Another Q: do i need this????

//**************************************  

        // Create an attribute set for an item

        UIImage *image = [UIImage imageNamed:@"icon.png"];
        NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];
        attributeSet.thumbnailData = imageData;

        // Create a searchable item, specifying its ID, associated domain, and the attribute set you created earlier.

        CSSearchableItem *item;
        NSString *identifier = [NSString stringWithFormat:@"%@",attributeSet.title];

        item = [[CSSearchableItem alloc] initWithUniqueIdentifier:identifier domainIdentifier:@"com.example.apple_sample.theapp.search" attributeSet:attributeSet];

        // Index the item.

        [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler: ^(NSError * __nullable error) {
                        if (!error)
           NSLog(@"Search item indexed");
                       else {
                            NSLog(@"******************* E R R O R *********************");


        }];

    }
}

谢谢

1 个答案:

答案 0 :(得分:3)

按指定索引。因此,如果您将spotLightIndexing方法放在didFinishLaunchingWithOptions中,那么每次启动都会自然地对项目进行索引,除非您设置了bool。如果应用程序被删除,它将再次重新索引,因为NSUserDefault值将被清零。这就是为什么他们通过批量更新或其他注释here

的方法为您提供添加/更改/更新索引的原因

由于您是从本地plist而不是Web填充它,因此您必须自己进行更新或创建索引维护应用程序扩展。

如果您在此主题上观看WWDC视频,您将看到使用域标识符可以通过“组”轻松更新或删除域。 Source这是一个很好的手表。

就关键字而言,在文档完全支持iOS9 API之前,没有任何意义。但是,通过阅读Apple公开提供的内容,您应该考虑一个注意事项:

  

重要提示:请务必避免对应用内容进行过度索引或添加不相关的关键字和属性,以尝试提高结果的排名。由于iOS会衡量用户与搜索结果的互动程度,因此可以快速识别用户找不到有用的项目,并最终停止显示在结果中。

位于新的搜索功能摘要之后。它继续说明原因:

  

组合多个Search API时,可以从多个位置索引项目。为避免在搜索结果中向用户提供重复项,您需要适当地链接项ID。要确保链接项目ID,可以在可搜索项目的uniqueIdentifier属性和NSUserActivity对象的contentAttributes属性中的relatedUniqueIdentifier属性中使用相同的值

换句话说,假设您按照他们的意图合并NSUserActivity,因为它可以应用于您应用的所有用户,而不仅仅是执行查询的人,它可以填充多次在同一搜索中。因此,根据Apples建议,尽量不要使用关键字,除非您确定,特别是基于您的示例,关键字已经= uniqueIdentifier。

就个人而言,我已经在我的应用程序中实现了它并且喜欢它,但是,我使用网络标记几乎立即进行批量更新,而不是您的路线,您必须实际推出新的更新重新更新/删除索引。