Home >Backend Development >PHP Tutorial >做一个搜索引擎

做一个搜索引擎

WBOY
WBOYOriginal
2016-06-23 14:19:592715browse

搜索引擎 php 百度 数据库 搜索

就是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,然后再汇总?

回复讨论(解决方案)

或者我说白一点吧,我要做一个  找到美食  的网站,里面就是菜式,标签,店铺,地址之类的一些简单信息,就这些,那我搜索的时候,输入的关键字可能是标签 或菜式名或店铺名,或多个关键字一起,怎么实现?

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

或者我说白一点吧,我要做一个  找到美食  的网站,里面就是菜式,标签,店铺,地址之类的一些简单信息,就这些,那我搜索的时候,输入的关键字可能是标签 或菜式名或店铺名,或多个关键字一起,怎么实现?

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

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


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

友情提醒:需要建立索引表,还要需要对数据库做优化,不然怕响应时间太慢!

一般多关键字间的
空格表示 或,A B ==> A or B
加号表示 与,A+B ==> A and B
你可以自行约定,但最好是符合布尔表达的规则

直接构造出 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效率不够高

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn