0

OS Xの検索キットフレームワークを使用すると、検索インデックスを作成してアクセスできます。ただし、既存の検索インデックスの名前が不明な場合、そのインデックスにアクセスすることはできません。既存の検索インデックス(SKIndexOpenWithData、SKIndexOpenWithMutableData、SKIndexOpenWithURL)にアクセスするために使用できるフレームワークのすべての関数は、インデックス名を要求します。これは、検索インデックスデータが保存されているファイルのファイル名と同じではありません。

インデックスの名前を知らずにSKIndexOpenWithURLを呼び出して既存の検索インデックスファイルにアクセスしようとすると、関数は有効なSKIndexRefを返しません。Search Kit Frameworkは「IADefaultIndex」のインデックス名のみを使用しようとするため、(フレームワークのドキュメントで提案されているように)インデックス名としてNULLを渡すことは機能しません。

例として、次のようなインデックス名でインデックスファイルを作成するとします。

    NSString *path = @"/Users/Tim/Desktop/searchindex.skindex";
    NSURL *url = [NSURL fileURLWithPath: path];  
    NSString *name = @"myIndex";          
    SKIndexType type = kSKIndexInverted;                    
    SKIndexRef skIndex;
    skIndex = SKIndexCreateWithURL ((__bridge CFURLRef)url, (__bridge CFStringRef)name, (SKIndexType)type, (CFDictionaryRef)NULL);
    // ..

インデックス名「myIndex」がわかっている場合にのみ、後でファイルを開いて保存されているインデックスにアクセスできます。インデックス名を持たない(または知らない)ファイルを開こうとすると、次のコードサンプルは失敗します。

    NSURL *skURL = [NSURL fileURLWithPath:@"/Users/Tim/Desktop/searchindex.skindex"];
    SKIndexRef skIndex;
    skIndex = SKIndexOpenWithURL((__bridge CFURLRef)skURL, NULL, true);
    if (!skIndex) NSLog (@"couldn't open index!");

ただし、検索インデックスの名前は確かにそのインデックスファイル内にあります。その名前を取得する方法や、検索インデックス名を知らなくても検索インデックスファイルにアクセスする方法を知っている人はいますか?フレームワークのドキュメントによると、フレームワークを使用してそのインデックス名を取得する可能性はないことは承知していますが、それでも可能であるはずです。

4

2 に答える 2

2

さて、いくつかの調査の後、検索インデックスファイルからインデックス名を抽出する方法を見つけました:

-(NSString*)getIndexNameOfSKFile:(NSString*)filePath
{
    if (!filePath) return nil;

    // open the search index file
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    if (!data) return nil;
    NSUInteger dataLength = [data length];

    // calculate the offset where the index name is stored
    int32_t offset1, offset2;
    if (dataLength<11) return nil;
    [data getBytes:&offset1 range:NSMakeRange(4,4)];
    [data getBytes:&offset2 range:NSMakeRange(8,4)];
    int32_t offset = CFSwapInt32HostToBig(offset1)+(CFSwapInt32HostToBig(offset2)/2)+14;

    // Get index name string (stored as zero-terminated string)
    unichar c;
    NSMutableString *indexName = [NSMutableString stringWithCapacity:0];
    do {
        if (dataLength<(offset+1)) return nil;
        [data getBytes:&c range:NSMakeRange(offset, 2)];
        if (c!=0) [indexName appendString:[NSString stringWithCharacters:&c length:1]];
        offset+=2;
    } while (c!=0);
    return indexName;
}

これはすべてのOSXバージョンで機能するとは限りませんが、10.7では機能します。

于 2012-06-18T16:25:49.023 に答える
1

問題を引き起こしているのはインデックス名がないことであり、コードの他の部分(有効なURLなど)ではないことを確認しますか?お気づきのように、ドキュメントには、インデックス名がわからなくても機能するはずだと書かれています。私はSearchKitを幅広く使用してきましたが、それは必要ありませんでした。そのため、問題は別のものである可能性があります。

コードを投稿してもらえますか?

インデックスから名前を取得できるかどうかについての質問に答えるために、メソッドSKIndexCreateWithURLのドキュメントには次のように記載されています。

inIndexNameインデックスの名前。inIndexNameをNULLに設定してこの関数を呼び出すと、SearchKitはインデックスにデフォルトのインデックス名IADefaultIndexを割り当てます。次に、名前を割り当てずに同じファイルに2番目のインデックスを作成しようとすると、2番目のインデックスは作成されず、この関数はNULLを返します。Search Kitは現在、インデックスからのインデックス名の取得をサポートしていません

ココアランドで作業している場合は、オープンソースの検索キットラッパーを使用することをお勧めします。コードはGithubにあります。

https://github.com/phildow/SPSearchStore

コードを投稿していただければ幸いです。

于 2012-06-17T01:46:40.443 に答える