• Stars
    star
    189
  • Rank 204,649 (Top 5 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created about 7 years ago
  • Updated almost 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🔍搜索关键字🚀🚀高亮显示,支持汉字、全拼、简拼搜索,支持多音字搜索

HighlightedSearch

基本介绍

  • 类似微信的客户端本地搜索、搜索关键字高亮显示

Demo 效果如图所示

支持:

  • 汉字支持汉字直接搜索、拼音全拼搜索、拼音简拼搜索

  • 搜索匹配到的关键字高亮显示

  • 搜索结果优先显示全部匹配、其次是拼音全拼匹配、拼音简拼匹配;关键字在结果字符串中位置越靠前,优先显示

  • 支持搜索英文、汉字、电话号码及混合搜索

  • 英文名称及电话号码的搜索直接使用完全匹配的方式即可

  • 重难点是汉字的拼音相关的拼音全拼、简拼搜索,比如 “刘亦菲” 对应的搜索关键字有且只有以下三大类总计 25 种匹配

    • 汉字:“刘”、“亦”、“菲”、“刘亦”、“亦菲”、“刘亦菲”
    • 简拼相关:"l"、"y"、"f"、"ly"、"yf"、"lyf"
    • 全拼相关:"li"、"liu"、"liuy"、"liuyi"、"liuyif"、"liuyife"、"liuyifei"、"yi"、"yif"、"yife"、"yifei"、"fe"、"fei"
  • 拼音的重难点还包括:比如搜索关键字为“xian”,既要匹配出“先”,也要匹配出“西安”

  • 支持多音字,比如“朝阳”,既能匹配出“cháo yáng”相关key,也能匹配到“zhāo yáng”相关key(微信目前是不支持多音字搜索的,钉钉的搜索都是放在服务器做的<可能是为了信息安全考虑>,但是多音字匹配问题比较大)

多音字Tips

  • 现在只是简单支持两个多音字,如果一个多音字有两个以上读音(如“和”:和huó面/和hé睦/和hú了),只支持按拼音排序的第一个和最后一个(特殊情况在姓名中比较少,为了这些生僻的字全局建立更多的表进行更多的判断,性价比太低)
  • 对于姓名中包含两个多音字的情况,只支持按拼音排序的靠前与靠前的匹配 + 靠后与靠后的匹配,比如一个人叫“藏(cáng & zàng)禅(chán & shàn)”,那么对应的拼音只有“cáng chán” 和 “zàng shàn”,没有进行交叉处理,也是因为性价比不高(我朋友圈里存在两个多音字的都是叠字,比如“乐乐”,因此匹配“lè lè”和“yuè yuè”即可,匹配“lè yuè” 完全没必要,降低查找的效率)

代码细节讲解

使用方法

1. 示例工程
  • git clone [email protected]:PengfeiWang666/HighlightedSearch.git
  • cd Example
  • open HighlightedSearch.xcworkspace
2. Install
  • pod "HighlightedSearch"
3. Usage
// WPFPinYinDataManager 依次添加数据源(标识符为了防止重名现象)
+ (void)addInitializeString:(NSString *)string identifer:(NSString *)identifier

// 更新搜索结果
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    ...
    ...
    for (WPFPerson *person in [WPFPinYinDataManager getInitializedDataSource]) {
        WPFSearchResultModel *resultModel = [WPFPinYinTools searchEffectiveResultWithSearchString:keyWord Person:person];
        if (resultModel.highlightedRange.length) {
            person.highlightLoaction = resultModel.highlightedRange.location;
            person.textRange = resultModel.highlightedRange;
            person.matchType = resultModel.matchType;
                [resultDataSource addObject:person];
        }
}