T9拨号盘搜索和排序算法
一. 背景
今日头条为何能突破bat的壁垒,很大程度在于它精确的推荐算法, 能够根据用户的喜爱推荐适合用户的资讯,不断根据用户的浏览记录构建用户的偏好生态圈,进而精准投放流量。
大家平常拨打电话应该都有用T9拨号盘吧,输入几个数字后一般会把当前通讯录匹配中的联系人显示出来并高亮显示命中的字符,根据输入的数字串显示哪些联系人数据以及这些联系人数据如果排序显得十分重要,站在用户角度,尽可能的少输入数字并能把用户想拨打的联系人优先显示到前列,这里面涉及的算法就尤为重要了,在此感谢产品mm对权重分配的打磨。
二. T9匹配和排序思路
加载本地通讯录,本地通讯录作为数据源;
获取本地通话记录,通话记录作为其中一项影响因子;
本地联系人的名字转化为T9键盘上对应的数字,根据输入的数字串进行匹配;
根据首字母匹配、全拼匹配、号码匹配三种类型确认匹配的数据源;
根据各项影响因子分别计算对应的权重,最终累加权重作为联系人排序的依据。
三. 联系人实体类
拿名字曾轶可 拨号盘输入95举例,注意曾是多音字
t9.png
联系人SimpleContact
字段
值
类型
描述
mName
曾轶可
String
名字
mNumber
13912345678
String
号码
isFirstMatch
true
boolean
是否首字母匹配
firstCharactorCounts
2
int
拼音匹配到多少汉字
numberMatchId
-1
int
号码匹配的下标
pinyinMatchId
(10,13)
List
关键字在全拼中的下标
startIndex
1
int
keyword在contact首字母拼接字符串的起始位置
searchType
1
int
搜索类型( 拼音SEARCH_TYPE_PINYIN1,号码SEARCH_TYPE_NUMBER2)
PinYin
PinYin
拼音类
simplePinyinIndex
0
int
记录用的是哪个首字母拼接字符串
hightLighter
12
List
高亮的字符位置
mSearchWeight
0
float
权重
spaceIndexList
null
List
名字中空格的下标
拼音PinYin
字段
值
类型
描述