- Quick-Dialog
- Voice-Dialog
Handwrite-Dialog
-
完全匹配。指输入字符串与联系人内某一匹配项完全匹配。基础匹配数值为600,无加减分项。
PanZhiHui-->PanZhiHui
-
前置首字母完全匹配。指输入字符串与联系人前几个首字母完全匹配。是前置首字母溢出匹配的特殊形式。
有两个加分项,无加分项,减分项为不匹配的首字母个数。PZH-->PanZhiHui
。+2-0
PZ-->PanZhiHui
。+2-1 -
前置首字母溢出匹配。指在匹配首字母的情况下,还匹配了某一个或者几个首字母后一段连贯的字符串。~~有一个加分项,~~加分项为匹配到的首字母个数,减分项为不匹配的首字母个数。
PanZH-->PanZhiHui
。+1-0
PZhiHui-->PanZhiHui
。+1-0
PZHui-->PanZhiHui
。+1-0
PZHu-->PanZhiHui
。+1-0
PZhi-->PanZhiHui
。+1-1 -
前置段匹配。指一个长度为N的连贯字符与联系人内某一匹配项的前N个字符完全匹配。是前置首字母溢出匹配的特殊形式。
同时意味着前置首字母溢出匹配事实上不需要加分项,只要保证前置首字母完全匹配的加分项比它大就足够了。panzh-->PanZhiHui
-
后置首字母完全匹配。指输入字符串匹配除第一个首字母以外的其他几个连续首字母。
有两个加分项,无加分项,减分项为不匹配的首字母个数。ZH-->PanZhiHui
-
后置首字母溢出匹配。后置首字母完全匹配的情况下,还匹配了某一个或者几个首字母后一段连贯的字符串。
有一个加分项,加分项为匹配的首字母的数量,减分项为不匹配的首字母个数。ZHu-->PanZhiHui
。+1-0
Zh-->PanZhiRui
。+1-1 -
后置段匹配。指有一串长度为N的连贯字符与与联系人内某一匹配项的后半部的一段N个字符串匹配,且此连贯字符的开头位置必须是某一首字母位置。*是后置首字母溢出匹配的特殊形式,同时意味着后置首字母溢出匹配事实上不需要加分项,只要保证后置首字母完全匹配的加分项比它大就足够了**。
ZhiHui/Zhi/Hui-->PanZhiHui
-
后置无头匹配。指一串连贯字符在前7种全部未匹配成功的情况下,却被包含在字符串里。加分项为-index,减分项为长度差
hiHui-->PanZhiHui
查询时匹配以上8种,其他情况不匹配。
- 查询出的列表将按匹配度排序,匹配度不是一个简单的数值,而是几个有优先级别的匹配字段。优先按照级别排序,级别相同,再按加分项排序,加分项相同,再按照减分项排序,减分项相同,再按照默认的sort_key排序,加分项在大多数情况下是相同的。优先级别从高到低如下。
- 完全匹配
- 前置首字母完全匹配、前置首字母溢出匹配、前置段匹配。(当只有一个字母时,按规则#1算)
- 后置首字母完全匹配、后置首字母溢出匹配、后置段匹配。(当只有一个字母时,按规则#5算)
- 后置无头匹配。(可以考虑摒弃此匹配,没有人会这么按,而按键出错的可能性导致无头匹配的可能性又极小,往往不是想要的结果)
- 输入的一列查询字符串将同时与联系人的名字和电话匹配。
- 对于一个联系人,他的名字可能有多种发音,这时候要取匹配度最高的。
- 对于一个联系人,他可能有两个甚至更多的电话号码,匹配的时候要分别匹配,而不是单独取匹配度最高的。
事实上仍然可以简单地使用一个数值来表示匹配度。只需要做到低一级的无论怎么加都不可能大于高一级,高一级的无论怎么减都不会小于低一级的即可,因此我们要这时我们就需要对加分和减分顶做一个限制。对于加分和减分做一些数量上的限制。比如说最多+32,最多-32。就目前的情况来看,最多只+2,而减分项有可能任意多。但是不可能太多,出于谨慎考虑,对于减分限制为99个,若减分99次仍然不能影响加分项,则一个加分项至少要是减分项的100倍,那么我们取减分项为0.01,加分项为1。而四个级别分别给出400,300,200,100的加分基础数值。这样仍旧可以获得一个+99的加分空间和-99的减分空间而不会越级。
匹配算法写起来比较麻烦的应该是前/后首字母溢出匹配算法
取减分项为0.01,加分项为1不变,对应六级基础数值分别是600,500,400,300,200,100。这样仍旧可以获得一个+99的加分空间和-99的减分空间而不会越级。
匹配的原则是匹配尽可能多的单词
这六个匹配规则还可以分成两大类。
- 前置匹配。
- 后置匹配。
#2,#4均为#3的特殊形式; #1看起来是#3的特殊形式,但是它的匹配加分规则不同,所以不属于#3; #5,#7均为#6的特殊形式; #8不属于以上任何形式,事实上#8存在的意义不要不是用来匹配姓名,而是匹配一段电话号码;
取减分项为0.001,加分项为1,对应四级基础数值分别是4000,3000,2000,1000。这样可以获得一个+999的加分空间和-999的减分空间而不会越级,采取这么大的数值纯属无聊。