高级的模糊查找功能的实现!!!!!!!

立志做一个佳娃~ 2003-05-11 08:48:06
请教了:

我想查找
张山丰,
但我输入
张珊丰,(就是根本不知道库中的张山丰是这样写的,,而写出张珊丰)

怎么样也能找到这个人名??怎么查找??
...全文
115 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
winternet 2003-05-15
  • 打赏
  • 举报
回复
up
supersoho 2003-05-13
  • 打赏
  • 举报
回复
逐个字匹配(按内码,一班来说发音相同的字都在同一区中):

例:

张山丰 (我没查,假设是:A889 A967 AA45)
张珊丰 A889 A989 AA45

也就是说 A967和A989不同,但A9是相同的(因为声母相同),只要用A889 A989 AA45 跟 A889 A967 AA45 进行匹配(匹配程序越小,模糊程序越高)!

我在DOS年代的时候做过这个,大多都可以。
TOMWLD 2003-05-13
  • 打赏
  • 举报
回复
我一般对这些经常使用的表都建一个拼音首字母的字段,一级字库的可以根据名字自动获取,别的,客房就要手工修改了,出现你要求的情况,只能要求他用拼音来查了,:)
ihihonline 2003-05-12
  • 打赏
  • 举报
回复
摩托,去基础版看一看我的问题。恼人啊。。。。
  • 打赏
  • 举报
回复
up
del_c_sharp 2003-05-12
  • 打赏
  • 举报
回复
嘻嘻,小小现在发财了?
ihihonline 2003-05-12
  • 打赏
  • 举报
回复
因为名子有可能重复,而名子的代码重复与否可以不去考虑,你同时也可以问用户,是否进行匹配查询,如果用户选择的是匹配查询的话,OK,那么就用姓名代码进行查询,如果用户没有选择匹配查询的话,那么就直接用姓名进行查询,不知道你明白了吗?这个贴子,竟然出现了这么多潜水很久的朋友。
ihihonline 2003-05-12
  • 打赏
  • 举报
回复
如下试过吗?
No.1:
如果你的数据库不是很大的话,试着在Onchange里实现,这样的话,属入张,就有可能出来了张....,有可能避免第二个字。
No.2:
还有一种解决方案就是,再数据库中再添加一个姓名代码库,当你作用户的信息输入时,将用户的名字的每个字的首字母也提取出来,比如你说的应该是ZSF,这三个字母,到时只用检索这三个字母就可以了,当然,用户是在前台操作,你在后台操作,用户没有办法可以感觉的出来,如此一来,用户根本不知道你在后台操作,实现过程可以参考如下代码:

function GetPYCode(HanStr: String) : String;//提取汉字的汉语拼音首字母函数。
const
PRCCodePage=936;
{ 数据来源于汉字码表 }
VowelPos: array['`'..'{'] of Integer = ($0000,$B0A1,$b0c5,$b2c1,$b4ee,
$b6ea,$b7a2,$b8c1,$b9fe,$0000,$bbf7,$bfa8,
$c0ac,$c2e8,$c4c3,$c5b6,$c5be,$c6da,$c8bb,
$c8f6,$cbfa,$0000,$0000,$cdda,$cef4,$d1b9,
$d4d1,$FFFF);
var
sVol : string;
Vowels : String;
i:Char;
HanziCode:Word;
lps,p1,p2:Pointer;
begin
sVol := HanStr;
GetMem(lps,Length(sVol)+1);
StrPCopy(lps,sVol);
p1:=lps;
p2:=CharNextEx(PRCCodePage,p1,0);
Repeat
if Abs(Longint(p2)-Longint(p1))=2 then
begin
HanziCode:=Word(p1^);
HanziCode:=swap(HanziCode);
for i:='`' to '{' do
begin
if VowelPos[i]>HanziCode then
begin
if i='a' then
Vowels:=Vowels+i
else if i='j' then //因为汉语内没有以“I”开头的拼音,遇到这种情况就是遇到了“H”
Vowels:=Vowels+'h'
else if i='w' then // 没有以“U、V”开头的拼音,遇到这种情况就是遇到了“T”
Vowels:=Vowels+'t'
else
Vowels:=Vowels+Chr(Ord(i)-1);
break;
end;
end;
end
else begin
Vowels:=Vowels+PChar(p1)^; //非汉字不转换
end;
p1:=p2;
p2:=CharNextEx(PRCCodePage,p1,0);
Until p1=p2;
Result:=Vowels;
//Result:=UpperCase(Vowels);
FreeMem(lps);
end;

XiaoDingDangKM 2003-05-12
  • 打赏
  • 举报
回复
如果你确定有‘张’和‘丰’,不确定‘山’和‘珊’:
第1步:"SELECT * FROM tb WHERE name LIKE '%张%'
INTERSECT
SELECT * FROM tb WHERE name LIKE '%丰%' "
第2步:将‘珊’字及所有1步的结果集中名字转换为拼音,查“shan”。
^-^
del_c_sharp 2003-05-11
  • 打赏
  • 举报
回复
一级字库的3000多字的顺序是按拼音排列的,你可以建立这个表,就可以实现你所想要的功能
但非一级字库的词,就要麻烦点喽~~
lkpc001 2003-05-11
  • 打赏
  • 举报
回复
如果不采用拼音字段几乎不可能实现,实现的唯一方法是:有一个拼音和汉字对照的代码库。
建议采用汉字首字母做一个字段,这样查询时用拼音查找。
lkpc001 2003-05-11
  • 打赏
  • 举报
回复
?
goodloop 2003-05-11
  • 打赏
  • 举报
回复
我的建议是把姓和名的声母建成一个(或多个)字段,在进行对比。。。
好像也有些麻烦。。。:(
ly_liuyang 2003-05-11
  • 打赏
  • 举报
回复
这个比较难哦
先单独查找"张山丰",没有的尝试"张山X",继续是“张X丰”,直到有接近的数据
还要注意查找中文读音相近问题,要一个同音字词表,很复杂+麻烦的
英文相对来说就简单很多了
jxc163 2003-05-11
  • 打赏
  • 举报
回复
这样很难吧?
如果库中有个保存姓氏拼名的字段,比较容易实现,用拼音反查就可以了。
但这样的话,比较难吧。
不可能把字符串分解,然后用LIKE和多个OR来进行操作吧,这样会很多。
lf43 2003-05-11
  • 打赏
  • 举报
回复
我有个办法就是增加一个字段(就是拼音简拼)
先查找名称字段若查不到再查找拼音简拼字段

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧