MPMediaQuery:搜索时查找元音变音和特殊字符

Posted

技术标签:

【中文标题】MPMediaQuery:搜索时查找元音变音和特殊字符【英文标题】:MPMediaQuery: find Umlauts and special characters when searching 【发布时间】:2012-11-08 20:01:24 【问题描述】:

我正在使用MPMediaQuery 在用户库中搜索歌曲名称:

MPMediaPropertyPredicate *titlePredicate = [MPMediaPropertyPredicate predicateWithValue:titleString
                                                                            forProperty:MPMediaItemPropertyTitle
                                                                         comparisonType:MPMediaPredicateComparisonContains];

MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate: titlePredicate];


NSArray* result = query.items;

titleString 是用户输入的NSString,取自UISearchField。这在大多数情况下可以正常工作,但在某些情况下会失败:当您在桌面上使用 iTunes 时,您可以搜索“holle”,它会找到“Der Hölle Rache”。这不适用于我的方法。同样,搜索“que”不会找到“Qué pasa?”。有没有办法解决这个问题?

【问题讨论】:

【参考方案1】:

MPMediaPropertyPredicate 目前不允许您指定任何NSStringCompareOptions。这种情况需要一个变音符号不敏感搜索,它将忽略任何重音符号或其他变音符号。

一种解决方法(虽然根据库大小比理想的要慢)是使用NSString rangeOfString:options: 方法使用变音符号和不区分大小写的搜索遍历整个媒体库:

MPMediaQuery *query = [[MPMediaQuery alloc] init];
NSArray *result = query.items;
NSString *searchString = @"que";

NSIndexSet *filteredSet = [result indexesOfObjectsWithOptions:NSEnumerationConcurrent
                                                  passingTest:^BOOL(MPMediaItem *song, NSUInteger idx, BOOL *stop) 
    NSString *songTitle = [song valueForProperty:MPMediaItemPropertyTitle];
    NSRange foundRange = [songTitle rangeOfString:searchString
                                          options:NSDiacriticInsensitiveSearch | NSCaseInsensitiveSearch];

    // rangeOfString:options: returns NSNotFound, 0 if "que" is not found during search.
    if (foundRange.location != NSNotFound)  
        return YES;
     else
        return NO; 
];

NSArray *filteredResult = [result objectsAtIndexes:filteredSet];

【讨论】:

虽然我很确定这会奏效,但它会非常缓慢,因为我们必须遍历整个歌曲数据库。当用户在搜索字段中输入内容时,每个字母都会非常缓慢(尤其是第一个)。 您是否考虑过使用 Core Data?它针对“键入时搜索”的快速搜索进行了优化,您可以在搜索中轻松添加变音符号和不区分大小写的谓词。 是的,将搜索表加载到内存中当然是可行的方法,但这不是一项非常简单的任务,因为当媒体库发生变化时,您必须使其与媒体库保持同步.我会在以后的某个时间把它写下来,当我写的时候,我会在 SO 上发布它。

以上是关于MPMediaQuery:搜索时查找元音变音和特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

Lucene 为带有元音变音的单词创建索引

有没有办法在 Android 中检测德国元音变音

国际字符(例如元音变音字符)在电子邮件地址的本地部分是不是有效?

将 UTF8 输入从 JSP 表单传输到 Spring 控制器会破坏元音变音[重复]

将 MySQL 字段字符集从 latin1 更改为 utf8_general_ci 会破坏元音变音 (ä,ö,ü)

哪种排序算法最适合重新排序几乎完全排序的列表?