核心聚焦索引化

6

你好,我正在尝试在我的应用中实现CoreSpotlight。

当进行索引时,我需要每次都运行这个代码吗?还是仅需在第一次安装应用程序时运行此代码即可? 如果应用程序被删除,我是否需要重新索引?

以下是我正在使用的代码:

- (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 *********************");


        }];

    }
}

谢谢你


你的代码可以工作吗?因为当我在项目中放置这个代码时,编译器没有输出“搜索项已索引”的结果! - iOS.Lover
@Mc.Lover 是的,它运行得非常顺利!请查看编辑后的答案以记录任何错误。 - George Asda
请您看一下这个问题:http://stackoverflow.com/questions/33443833/set-title-property-from-nsarray-in-cssearchableitemattributeset,我使用了您的代码但是没有起作用! - iOS.Lover
1个回答

3
它按指定的方式进行索引。因此,如果您将spotLightIndexing方法放在didFinishLaunchingWithOptions中,它会自然地在每次启动时索引项目,除非您设置了一个布尔值。如果应用程序被删除,NSUserDefault值将被清零,它将重新索引。这就是为什么他们通过批量更新或其他方法添加/修改/更新索引,如此处所注明的原因。
由于您从本地plist而不是Web填充它,因此您必须自己进行更新或创建索引维护应用程序扩展。
如果您观看关于此主题的WWDC视频,则会发现使用域标识符按“组”更新或删除域很容易。 这是一个很好的观看。
至于关键字,直到文档完全支持iOS9 API之前,无法确定。但仅通过阅读苹果公开提供的内容,您应该考虑以下注意事项:

重要提示:请务必避免过度索引应用程序内容或添加不相关的关键字和属性,以试图提高结果排名。因为iOS测量用户与搜索结果的参与度水平,所以用户找不到有用的项目会很快被识别出来,并最终停止显示在结果中。

这位于新搜索功能摘要之后。它继续说:

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

换句话说,假设您按照他们的意图将NSUserActivity整合到应用程序中,因为它可以适用于所有使用您的应用程序的用户,而不仅仅是进行查询的人,它可以在同一搜索中多次填充。因此,基于苹果的建议,请尽量不要使用关键字,除非您确定,特别是基于您的示例,其中关键字已经= uniqueIdentifier。
就我个人而言,我已经将其实施到我的应用程序中并喜欢它,但是我使用Web标记,这使得批量更新几乎是即时的,而不是您的路线,您必须实际推出新更新以重新更新/删除索引。

感谢您的见解。我们选择使用本地plist而不是网络纯粹是因为如果plist更改,则必须更新应用程序以合并新条目/删除。 - George Asda
你能测试你的网页标记是否被索引了吗?在开发/调试中如何实现这一点? - Chris Wagner
1
你能详细说明一下批量索引的相关内容吗?包括 (void)beginIndexBatch 和 endIndexBatchWithClientState:completionHandler 方法。 - user3745996
嘿 @guhan0,我不知道你需要什么,但如果它是一个可以使所有人受益的单独问题,我建议创建一个不同的问题,这样未来的问题寻求者可以轻松找到它,因为这个问题特定于索引频率,而不是如何索引,尽管标题有误导性。 - soulshined
很不幸,我的问题被阻止了 :( - user3745996
@soulshined 你能否使用for循环为不同的数据索引NSuserActivity?我刚试了一下,但只有最后一个索引项显示在搜索结果中。 - The iCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接