搜索算法:我想做一个搜索程序,请大家帮帮我!

cn0cn 2003-11-24 04:41:01
各位朋友大家好:

小弟我想做一个搜索程序,由于自己能力的有限。还请各位朋友多多帮忙!


这个程序我想做成一个带逻辑搜索的、比如:a and abc or aaaad and xxx

就像google、baidu这样的搜索引擎。可以实现多个关键字的搜索。


谢谢大家!
...全文
101 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysz628 2004-02-17
  • 打赏
  • 举报
回复
两位老大,其他的还算看懂了,能不能解释一下instr()怎么用的?
weiwei6 2004-02-17
  • 打赏
  • 举报
回复
老大
ustb 2004-02-16
  • 打赏
  • 举报
回复
多字段搜索,请大家指正。

/**
* 功能:高级搜索代码
* 编写时间:2003.5.11
* 编写人:偶然
* 变量: $keyword 关键字
* $con 关系,and或or
* $method 模糊或精确
* $field 字段数组
* 返回值:$tmp sql主体
*/
function super_search($keyword,$con,$method,$field)
{
global $tmp;
$keyword = split("[ \t\r\n\,]+",$keyword);
$num_word = count($keyword);//统计关键字个数
$num = count($field);
if($con=="")
{
$con = "OR";
}
if($method=="like")//模糊查找
{
for($i=0; $i<$num; $i++)
{
$i<$num-1?$condition = $con:$condition=NULL;
$tmp.= " {$field[$i]} $method '%".join("%' $con {$field[$i]} $method '%",$keyword)."%' $condition";
}
}
elseif($method=="exact")//精确查找
{
for($i=0; $i<$num; $i++)
{
$i<$num-1?$condition = $con:$condition=NULL;
$tmp.= " instr({$field[$i]},'".join("')!=0 $con instr({$field[$i]},'",$keyword)."')!=0 $condition";
}
}
return $tmp;
}
$fields = array("title","content","intro");
echo super_search("a b c d","AND","exact",$fields);
echo super_search("a b c d","OR","like",$fields);
countstars 2004-02-11
  • 打赏
  • 举报
回复
多个字段怎么办?=_=
应该加上多个字段的功能嘛:D:D
ustb 2004-02-11
  • 打赏
  • 举报
回复
再少占点篇幅:)

/**
* 功能:高级搜索代码
* 编写时间:2003.5.11
* 编写人:偶然
* 变量: $keyword 关键字
* $con 关系,and或or
* $method 模糊或精确
* $field 要查找的字段
* 返回值:$tmp sql主体
*/
function super_search($keyword,$con,$method,$field)
{
$keyword = split("[ \t\r\n\,]+",$keyword);
$num_word = count($keyword);//统计关键字个数
$con==""?$con = "OR":NULL;
$method=="like"?$tmp = " $field $method '%".join("%' $con $field $method '%",$keyword)."%'":($method=="exact"?$tmp = " instr($field,'".join("')!=0 $con instr($field,'",$keyword)."')!=0":NULL);
return $tmp;
}
echo super_search("a b c d","","like","var")."<br>";
echo super_search("a b c d","","exact","var");
ustb 2004-02-11
  • 打赏
  • 举报
回复
:)
精练多了,学习!
xuzuning 2004-02-11
  • 打赏
  • 举报
回复
似可这样简化
<?php
/**
* 功能:高级搜索代码
* 编写时间:2003.5.11
* 编写人:偶然
* 变量: $keyword 关键字
* $con 关系,and或or
* $method 模糊或精确
* $field 要查找的字段
* 返回值:$tmp sql主体
*/
function super_search($keyword,$con,$method,$field)
{
$keyword = split("[ \t\r\n\,]+",$keyword);
$num_word = count($keyword);//统计关键字个数
if($con=="")
{
$con = "OR";
}
if($method=="like")//模糊查找
{
$tmp = " $field $method '%".join("%' $con $field $method '%",$keyword)."%'";
}
elseif($method=="exact")//精确查找
{
$tmp = " instr($field,'".join("')!=0 $con instr($field,'",$keyword)."')!=0";
//或 $tmp = " $field='".join("' $con $field='",$keyword)."'";
}
return $tmp;
}
echo super_search("a b c d","","like","var")."<br>";
echo super_search("a b c d","","exact","var");
?>
无名2018 2004-02-11
  • 打赏
  • 举报
回复
感谢"偶然"大哥:)

小弟佩服的是五体投地:)
ustb 2004-02-11
  • 打赏
  • 举报
回复
非常感谢老大指出这个错误,我修改了一下,敬请指正。

/**
* 功能:高级搜索代码
* 编写时间:2003.5.11
* 编写人:偶然
* 变量: $keyword 关键字
* $con 关系,and或or
* $method 模糊或精确
* $field 要查找的字段
* 返回值:$tmp sql主体
*/
function super_search($keyword,$con,$method,$field)
{
$keyword = eregi_replace("[ \t\r\n\,]+","|",$keyword);
$keyword = explode("|",$keyword);
$num_word = count($keyword);//统计关键字个数
if($con=="")
{
$con = "OR";
}
if($method=="like")//模糊查找
{
if($num_word=="1")
{
$tmp = $field. " LIKE \"%".$keyword[0]."%\" ";
}
elseif($num_word>1)
{
$tmp = "( ";
for($i = 0;$i<$num_word;$i++)
{
if($i==0)
{
$tmp.= $field." LIKE \"%".$keyword[$i]."%\" ";
}
if($i!= 0)
{
$tmp.= $con." ".$field." LIKE \"%".$keyword[$i]."%\" ";
}
}
$tmp.=")";
}
}
elseif($method=="exact")//精确查找
{
if($num_word>"0")
{
$tmp = " instr(".$field.",'".$keyword[0]."')!=0";
$first = "1";
}
if($first=="1")
{
for($n = 1;$n<$num_word;$n++)
{
$tmp.=" ".$con." instr(".$field.",'".$keyword[$n]."')!=0 ";
}
}
}
return $tmp;
}

echo super_search("a b c d","","like","var");
output:( var LIKE "%a%" OR var LIKE "%b%" OR var LIKE "%c%" OR var LIKE "%d%" )
xuzuning 2004-02-11
  • 打赏
  • 举报
回复
与 ustb(偶然) 商榷
函数有点问题吧?
echo super_search("a b c d","","like","var");

结果:
( var LIKE "%a%" OR var LIKE "%b%" )var LIKE "%c%" OR var LIKE "%d%" )
显然是错的
cn0cn 2004-02-11
  • 打赏
  • 举报
回复
up
xinyaoxp 2004-02-11
  • 打赏
  • 举报
回复
收藏
ustb 2003-11-25
  • 打赏
  • 举报
回复
关键字你可以用空白字符或逗号隔开,如果你还想设置更多的分隔标记
改一下这一句,比如想用+来隔开,可以改成这样
$keyword = eregi_replace("[ \t\r\n\,\+]+","|",$keyword);

and或是or在任何情况下都只能有一个出来,默认是or,可以增大匹配几率。
我不明白一个即是0又是1的数是什么,相信你也不知道。

//具体用法:
//比如你可以从表单中得到查询数据:
$keyword = "abc xyz";//关键字
$con = "and";//与
$method = "like";//模糊
$field = "title";//如果你有title字段的话
$tmp = super_search($keyword,$con,$method,$field);

//假设你有一个叫news的表,你想从标题里找到匹配的关键字,下面是SQL
$sql = "select * from news where $tmp";
cn0cn 2003-11-25
  • 打赏
  • 举报
回复
up
arcow 2003-11-25
  • 打赏
  • 举报
回复
cn0cn 2003-11-24
  • 打赏
  • 举报
回复
感谢偶然:

小弟我对这个函数没有理解太好:

* 变量: $keyword 关键字 [a b abc ???这样的吗?]
* $con 关系,and或or [只能选一个?]
* $method 模糊或精确 [ok]
* $field 要查找的字段 [ok]

如何使用关键字。它的格式是什么样的? 如果$con只能选择一个的话、那这个函数的意义就不大了。还请您说明一下。谢谢!还有具体的用法。
jxyuhua 2003-11-24
  • 打赏
  • 举报
回复
mark
ustcfrank 2003-11-24
  • 打赏
  • 举报
回复
短小精悍,收了
ustb 2003-11-24
  • 打赏
  • 举报
回复
/**
* 功能:高级搜索代码
* 编写时间:2003.5.11
* 编写人:偶然
* 变量: $keyword 关键字
* $con 关系,and或or
* $method 模糊或精确
* $field 要查找的字段
* 返回值:$tmp sql主体
*/
function super_search($keyword,$con,$method,$field)
{
$keyword = eregi_replace("[ \t\r\n\,]+","|",$keyword);
$keyword = explode("|",$keyword);
$num_word = count($keyword);//统计关键字个数
if($con=="")
{
$con = "OR";
}
if($method=="like")//模糊查找
{
if($num_word=="1")
{
$tmp = $field. " LIKE \"%".$keyword[0]."%\" ";
}
elseif($num_word>1)
{
$tmp = "( ";
for($i = 0;$i<$num_word;$i++)
{
$first = 0;
if($first==0)
{
$tmp.= $field." LIKE \"%".$keyword[$i]."%\" ";
$first = 1;
}
if($first!= 0)
{
$i++;
$tmp.= $con." ".$field." LIKE \"%".$keyword[$i]."%\" ";
}
if(trim($tmp)!= "(")
{
$tmp.= " )";
}
}
}
}
elseif($method=="exact")//精确查找
{
if($num_word>"0")
{
$tmp = " instr(".$field.",'".$keyword[0]."')!=0";
$first = "1";
}
if($first=="1")
{
for($n = 1;$n<$num_word;$n++)
{
$tmp.=" ".$con." instr(".$field.",'".$keyword[$n]."')!=0 ";
}
}
}
return $tmp;
}

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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