>백엔드 개발 >PHP 튜토리얼 >做一个搜索引擎

做一个搜索引擎

WBOY
WBOY원래의
2016-06-23 14:19:592709검색

搜索引擎 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效率不够高

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.