就是PHP做一个搜索网站,类似百度那样,对我网站内的所有信息进行搜索。比喻是一个论坛搜索,我输入:A B C。中间隔着空格,我能筛选出A,B,C三个分开的关键字,然后在数据库进行搜索任何与这3个关键字的内容,这就好像是一个百度搜索或者谷歌搜索的原理。我自己想到的难点有几个:1、对3个关键字进行处理的时候,是什么原理,用空格隔开,然后归类为两个不同的关键字?假如我两个关键字之前有别的符号呢?例如A、B   那么处理的时候,也是A和B两个关键字? 那么 A?B呢,怎么实现把关键字筛选出来??2、在对数据库中进行搜索的时候,我有关键字 A,AB,ABC 3个关键字了,那么我是什么逻辑进行搜索?A或AB或ABC 还是A或B或C? 这个逻辑是怎样?我有点不懂,要做成百度搜索之类的。3、假如我有很多个搜索条件(参考上面的问题),那么多得搜索逻辑,是把很多个搜索逻辑放到一个sql语句(进行一次sql查询之后返回一个结果array)?还是没一个逻辑就一个sql语句,然后对每一句查询返回结果array,然后再汇总?搜索引擎php百度数据库搜索

解决方案 »

  1.   

    额,是在thinkphp框架下做的,我现在最难的一点就是,接收前台数据处理,和数据库方面的sql语句以及逻辑,最好能给一下代码,不行,讲解下原理也好。谢谢
      

  2.   


    我是这样想的。就一条sql 语句,别分开了再汇总,挺烦的,用模糊匹配,比如你有标签(暂时字段是title),菜名(dish_name ),店名(dianming ),写成:select * from table_name where title like %输入的关键词% or dish_name like %输入的关键词% or dianming like %输入的关键词% ...............我没做过,但我想的是这样的
      

  3.   

    首先说一下百度,谷歌,淘宝的搜索引擎算法还是有点复杂的,关键一直有变,不然市场上也不会出现专门做SEO的职业!不过你的网站估计不用那么复杂。我说说个人看法!1.A与B用空格隔开可以单纯的用 select * from 索引表 where 索引字段 like "%A%" or  索引字段 like "%B%",A、B可以加大权重,比如
    select * from 索引表 where 索引字段 like "%A、B%" union 
    select * from 索引表 where 索引字段 like "%A%" or  索引字段 like "%B%"
    这样符合A、B就会排在前面,符合A或者符合B在后面2,一样的分权重,用union与order by 权重字段,外加上其他的条件语句not,or,and,in等,具体权重怎么分,看自己的算法了,比如标签排第一,菜式排第二,这个根据具体需求做!(需要说一下,有些关键字属于不重要的,经常出现,权重可以低一些,比如“我”这个字,有可能就会在很多地方出现了)3.如果关键字太多,首先你要对关键字的长度做限制(淘宝他们也都有对关键字做限制),可以在进数据库查询前先用程序写一个简单的算法,把关键字先初步整理一下再放到SQL语句中。
    当然这里讲的还是简单的方法,个人觉得除非你的网站规模已经非常大了,不然应该勉强够用了!友情提醒:需要建立索引表,还要需要对数据库做优化,不然怕响应时间太慢!
      

  4.   

    一般多关键字间的
    空格表示 或,A B ==> A or B
    加号表示 与,A+B ==> A and B
    你可以自行约定,但最好是符合布尔表达的规则直接构造出 SQL 指令并不可取,因为变数太多,容易顾此失彼
    当搜索表达式能格式化成布尔表达式时,你就可以套用现成的布尔表达式解析程序进行
      

  5.   

    1、对3个关键字进行处理的时候,是什么原理,用空格隔开,然后归类为两个不同的关键字?假如我两个关键字之前有别的符号呢?例如A、B   那么处理的时候,也是A和B两个关键字? 那么 A?B呢,怎么实现把关键字筛选出来??
    第一个问题是关于分词的,目前有一个比较出名的系统叫"盘古分词",你可以研究看看,另外百度,google之类的他们都建立了自己的词库,这一点我深信不疑2、在对数据库中进行搜索的时候,我有关键字 A,AB,ABC 3个关键字了,那么我是什么逻辑进行搜索?A或AB或ABC 还是A或B或C? 这个逻辑是怎样?我有点不懂,要做成百度搜索之类的。
    这个部分你可以开发的灵活一点,视状况随时调整就行了,目前大搜索引擎也是在随时调整的.3、假如我有很多个搜索条件(参考上面的问题),那么多得搜索逻辑,是把很多个搜索逻辑放到一个sql语句(进行一次sql查询之后返回一个结果array)?还是没一个逻辑就一个sql语句,然后对每一句查询返回结果array,然后再汇总? 
    你可以这样写
    $sql='';
    if ($k!=''){
    $sql.=" OR Locate("%{$key}%",key)>0"; 
    }
    "select ?? from 表 where 字段='值'{$sql}"
    这里我没有用like,因为like效率不够高