楼主走了弯路,这个问题你必须记住我们伟大领袖的语录:人民战争为人民。具体怎么做呢,计算机是个傻瓜,人民才是智慧的代表,当某个人搜索你的数据的时候,他输错了,比如,把search 输入成saarch,自然他得不到任何结果,那么他会检查他的关键词,然后他会发现他输入错了,然后他就会重新输入,自然他得到了结果. 在这个过程中,你的笨蛋计算机不会去检查他输的关键词是否正确,但你的笨蛋计算机通过下列规则学会一件事: 当同一个用户输入某个关键字得不到任何结果或得到很少的结果, 他切换另外一个词,得到比较多的结果所以你的笨蛋计算机得出的结论是,某些人很容易把search输入成saarch, 你的笨蛋计算机把这个纪录在他的数据库中,当下次另外一个用户输入saarch的时候 你的笨蛋计算机居然聪明地说: Do you mean "search".现在你说说,谁是笨蛋?谁是聪明蛋?
现在我是这样来处理的: 将用户的搜索记录关键字以及搜索到的结果数到数据库中。 当用户下次搜索没有返回结果时,则去寻找以前的搜索记录,从中找出相似的关键字来。例如: <?php ... $sql = "SELECT keywords FROM searchlog WHERE ..."; ... while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) { similar_text($sourceStr, $descStr, $similarity); if (intval($similarity) > 90){ //如果相似度超过90%,则认为它是相似的关键字,退出循环。 $similarKeywords = $row['keywords']; continue; } } ... if (! empty($similarKeywords)) { echo 'Did you mean:' . $similarKeywords; } ... ?>不知道大家认为这样怎样?如果保存的记录太多,会不会很影响效率?
if (intval($similarity) > 90){ //如果相似度超过90%,则认为它是相似的关键字,退出循环。 $similarKeywords = $row['keywords']; continue; }应该是 if (intval($similarity) > 90){ //如果相似度超过90%,则认为它是相似的关键字,退出循环。 $similarKeywords = $row['keywords']; break; }
当你输入一个关键词时,把该关键词拿去库里作模糊查询,like *你的关键词* ,这样子
然后判断该查询返回的结果条数,如果少于一个标准值,则说明对该关键词进行拆词(至于拆词,是另外一个专门的问题了),再把拆词后的部分拿去查询。比如“中国人民”,假设它真的查不到或结果很秒,则拆成“中国”、“人民”两部分,先“中国”AND “人民”,再少的话,再查“中国”OR “人民”…………
然后针对该语言的特点(特别是与输入法相关的特点)进行词之间的匹配
匹配技术是关键,这个对各民族语言都有所区别
例如中文需要对“拼音”“象形”匹配
英文需要对近似拼写匹配当然,因为google硬件很强大,完全可以用手工制作匹配表的方法而免去匹配技术的研究
金山词霸(iciba.com)也有类似功能,它具体怎么做不太清楚
不是“如何才能根据你输入的关键字,求出与它相似的另一个字符串呢?”
而是“如何才能求出与你输入的关键字相似的已知关键字呢?”当问题变成后者的时候,你就可以用similar_text函数了
int similar_text ( string first, string second [, float &percent] )
返回first在second存在的字符个数,percent为表示相似度的值
echo similar_text ('程序', '程式', $percent);//2
echo $percent;//50对于中文,可能用汉语拼音要更好些
在这个过程中,你的笨蛋计算机不会去检查他输的关键词是否正确,但你的笨蛋计算机通过下列规则学会一件事: 当同一个用户输入某个关键字得不到任何结果或得到很少的结果,
他切换另外一个词,得到比较多的结果所以你的笨蛋计算机得出的结论是,某些人很容易把search输入成saarch,
你的笨蛋计算机把这个纪录在他的数据库中,当下次另外一个用户输入saarch的时候
你的笨蛋计算机居然聪明地说: Do you mean "search".现在你说说,谁是笨蛋?谁是聪明蛋?
将用户的搜索记录关键字以及搜索到的结果数到数据库中。
当用户下次搜索没有返回结果时,则去寻找以前的搜索记录,从中找出相似的关键字来。例如:
<?php
...
$sql = "SELECT keywords FROM searchlog WHERE ...";
...
while ($row = mysql_fetch_array($query, MYSQL_ASSOC)) {
similar_text($sourceStr, $descStr, $similarity);
if (intval($similarity) > 90){
//如果相似度超过90%,则认为它是相似的关键字,退出循环。
$similarKeywords = $row['keywords'];
continue;
}
}
...
if (! empty($similarKeywords)) {
echo 'Did you mean:' . $similarKeywords;
}
...
?>不知道大家认为这样怎样?如果保存的记录太多,会不会很影响效率?
//如果相似度超过90%,则认为它是相似的关键字,退出循环。
$similarKeywords = $row['keywords'];
continue;
}应该是
if (intval($similarity) > 90){
//如果相似度超过90%,则认为它是相似的关键字,退出循环。
$similarKeywords = $row['keywords'];
break;
}
这位兄台好比如啊,这样子的想法更容易编程些!