日期:2014-05-17  浏览次数:20501 次

做一个搜索引擎
就是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 百度 数据库 搜索

------解决方案--------------------
首先说一下百度,谷歌,淘宝的搜索引擎算法还是有点复杂的,关键一直有变,不然市场上也不会出现专门做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语句中。


当然这里讲的还是简单的方法,个人觉得除非你的网站规模已经非常大了,不然应该勉强够用了!

友情提醒:需要建立索引表,还要需要对数据库做优化,不然怕响应时间太慢!
------解决方案--------------------
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效率不够高