search
HomeBackend DevelopmentPHP Tutorial搜索引擎技术核心揭密_PHP
搜索引擎技术核心揭密_PHPJun 01, 2016 pm 12:27 PM
googleustechnologysearchsearch engineInquirecore

编者按:这是一篇精彩的编程教学文章,不但详细地剖析了搜索引擎的原理,也提供了笔者自己对使用PHP编制搜索引擎的一些思路。整篇文章深入浅出,相信无论是高手还是菜鸟,都能从中得到不少的启发。

  谈到网页搜索引擎时,大多数人都会想到雅虎。的确,雅虎开创了一个互联网络的搜索时代。然而,雅虎目前用于搜索网页的技术却并非该公司原先自己开发的。2000年8月,雅虎采用了Google(www.google.com)这家由斯坦福大学学生创建的风险公司的技术。理由非常简单,Google的搜索引擎比雅虎先前使用的技术能更快、更准确搜索到所需要的信息。

  让我们自己来设计、开发一个强劲、高效的搜索引擎和数据库恐怕短时间内在技术、资金等方面是不可能的,不过,既然雅虎都在使用别人的技术,那么我们是不是也可以使用别人现成的搜索引擎网站呢?

剖析编程思路

  我们可以这样设想:模拟一个查询,向某个搜索引擎网站发出相应格式的搜索命令,然后传回搜索结果,对结果的HTML代码进行分析,剥离多余的字符和代码,最后按所需要的格式显示在我们自己的网站页面里。

  这样,问题的关键就在于,我们要选定一个搜索信息准确(这样我们的搜索才会更有意义啊)、速度快(因为我们分析搜索结果并显示需要额外的时间),搜索结果简洁(便于进行HTML源代码分析和剥离)的搜索网站,由于新一代搜索引擎Google的各种优良特性,这里我们选择它为例,来看看用PHP怎样实现后台对Google(www.google.com)搜索、前台个性化显示这一过程。

  我们先来看看Google的查询命令的构成。进入www.google.com网站,在查询栏中输入“abcd”,点击查询按钮,我们可以发现浏览器的地址栏变成:"http://www.google.com/search?q=abcd&btnG=Google搜索&hl=zh-CN&lr=",可见,Google是通过表单的get方式来传递查询参数并递交查询命令的。我们可以使用PHP中的file()函数来模拟这个查询过程。

了解File()函数

  语法: array file(string filename);

  返回值为数组,将文件全部读入数组变量中。这里的文件可以是本地的,也可以是远程的,远程文件必须指明所使用的协议。例如: result=file(“http://www.google.com/search?q=abcd&btnG=Google搜索&hl=zh-CN&lr=”),该语句将模拟我们在Google上查询单词“abcd”的过程,并将搜索结果以每行为元素,传回到数组变量 result中。因为这里读取的文件是远程的,所以协议名“http://”不能缺少。

  如果要让用户输入搜索字符进行任意搜索,我们可以做一个输入文本框和提交按钮,并将上文中的被搜索字符“abcd”用变量替换:
echo '

'; //没有参数的form,默认提交方式为get,提交到本身
echo ''; //构造一个文本输入框
echo ''; //构造一个提交查询按钮
echo '
';

if (isset( keywords)) //提交后PHP会生成变量 kwywords,即要求下面的程序在提交后运行
{
urlencode( keywords); //对用户输入内容进行URL编码
result=file("http://www.google.com/search?q=". keywords."&btnG=Google搜索&hl=zh-CN&lr=");
//对查询语句进行变量替换,将查询结果保存在数组变量 result中
result_string=join(" ", result); //将数组$result合并成字符串,各数组元素之间用空格粘和
... //进一步处理
}
?>

  上面的这段程序已经能按用户输入内容进行查询,并将返回的结果合成一个字符串变量$result_string。请注意要使用urlencode()函数将用户输入内容进行URL编码,才可以正常地对输入的汉字、空格以及其他特殊字符进行查询,这样做也是尽可能逼真地模拟Google的查询命令,保证搜索结果的正确性。

对Google的分析

  为了便于理解,现在假设我们所真正需要的东西是:搜索结果的标题。网址和简介等,这是一个简洁而典型的需求。这样,我们所要做的便是:去除Google搜索结果的台头和脚注,包括一个Google的标志、再次搜索的输入框和搜索结果说明等,并且在剩余的搜索结果各项条目中剥离原来的HTML格式标记,替换成我们想要的格式。

  要做到这一点,我们必须仔细地分析Google搜索结果的HTML源码,找到其中的规律。不难发现,在Google的搜索结果的正文总是包含在源码的第一个

标记和倒数第二个

标记之间,并且倒数第二个

标记后紧跟table字符,而且这个组合“


  以下所有程序均依次接续在上文程序的“进一步处理”处。

  result_string = strstr( result_string, "

"); //取 result_string从第一个

开始后的字符串,以去除Google台头
position= strpos( result_string,"

table符号的位置
result_string= substr( result_string,0, position);//截取第一个

table符号之前的字符串,以去除脚注

应用与实现

  OK,现在我们已经得到有用的HTML源码主干了,剩下的问题是如何自主地显示这些内容。我们再分析一下这些搜索结果条目,发现每个条目之间也是很有规律的用
分隔,也就是各成一个段落,按这个特点我们用explode()函数把每个条目切开:

  语法:explode(string separator, string string);

  返回一个数组,按separator切开后的各个小字串被保存在数组中。

  于是:
result_array=explode("

", result_string); //用字串"

"把结果切开

  我们就得到一个数组 result_array,其中每个元素都是一个搜索结果条目。我们所要做的仅仅是研究每个条目及其HTML显示格式代码,然后按要求替换就行了。下面用循环来处理 result_array中的每个条目。
for( i=0; i {
... //处理每个条目
}

  对于每个条目,我们也很容易找到一些特点:每个条目都由标题、摘要、简介、类别、网址等组成,每个部分都换行,即包含
标记,于是再次分割:(以下处理程序放在上文的循环中)
every_item=explode("
", result_array[ i]);

  这样我们得到一个数组 every_item,其中 every_item[0]就是标题, every_item[1]和 every_item[2]两行为摘要, every_item[3]和 every_item[4]等等的头部如果包含“简介:”、“类别:”字符,则是简介或类别(因为有的结果条目没有该项),如果头部包含“”则肯定就是网址啦,这种对比判断我们常使用正则表达式(略),如果要替换也很方便,比如包含标题的$every_item[0],其本身是有链接的,我们希望修改这个链接属性,让它在新窗口打开链接:
echo eregi_replace(' {
... //处理每个条目中除去第一项(第一项为标题,已经显示)的每一项
... //更多格式修改
}

  这样就修改了链接属性,其余很多显示格式的修改、剥离、替换都能用正则替换eregi_replace()来完成。

  至此我们已经得到了每个搜索条目的每一项,并能任意修改每项的格式,甚至可以给他套上漂亮的表格。然而一个好的程序应该能适应各种运行环境的,这里也不例外,我们其实还只是讨论了搜索结果的HTML剥离的一种框架方法,真正要做得完美,还要考虑很多内容,比如要显示一共搜索出多少结果,分成多少页等等,甚至还可以刨除与Google相关的那些“类别”、“简介”等代码,让客户根本看不到原始网站。不过这些内容和要求我们都能通过分析HTML进行剥离得到。现在大家完全能自己动手,做个极富个性化的搜索引擎啦。

摘自:http://tech.163.com/tm/010228/010228_15747.html
作者:maxid

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
如何在 Windows 11、10 中启用或禁用核心隔离内存完整性如何在 Windows 11、10 中启用或禁用核心隔离内存完整性Apr 27, 2023 pm 10:43 PM

如今,大多数Windows用户都使用虚拟机。当他们系统上的核心隔离被禁用时,安全风险和攻击是可以预料的。即使设置了核心隔离,如果用户升级了系统,也会禁用内存完整性。如果启用核心隔离,系统将免受攻击。对于经常使用虚拟计算机的人,强烈建议他们启用它。如果您正在寻求有关如何在任何Windows11系统上启用或禁用核心隔离内存完整性的说明,此页面可以提供帮助。如何使用Windows安全应用在Windows11中启用或禁用核心隔离内存完整性第1步:按Windows键并键入Windows安全

SOA中的软件架构设计及软硬件解耦方法论SOA中的软件架构设计及软硬件解耦方法论Apr 08, 2023 pm 11:21 PM

​对于下一代集中式电子电器架构而言,采用central+zonal 中央计算单元与区域控制器布局已经成为各主机厂或者tier1玩家的必争选项,关于中央计算单元的架构方式,有三种方式:分离SOC、硬件隔离、软件虚拟化。集中式中央计算单元将整合自动驾驶,智能座舱和车辆控制三大域的核心业务功能,标准化的区域控制器主要有三个职责:电力分配、数据服务、区域网关。因此,中央计算单元将会集成一个高吞吐量的以太网交换机。随着整车集成化的程度越来越高,越来越多ECU的功能将会慢慢的被吸收到区域控制器当中。而平台化

新视角图像生成:讨论基于NeRF的泛化方法新视角图像生成:讨论基于NeRF的泛化方法Apr 09, 2023 pm 05:31 PM

新视角图像生成(NVS)是计算机视觉的一个应用领域,在1998年SuperBowl的比赛,CMU的RI曾展示过给定多摄像头立体视觉(MVS)的NVS,当时这个技术曾转让给美国一家体育电视台,但最终没有商业化;英国BBC广播公司为此做过研发投入,但是没有真正产品化。在基于图像渲染(IBR)领域,NVS应用有一个分支,即基于深度图像的渲染(DBIR)。另外,在2010年曾很火的3D TV,也是需要从单目视频中得到双目立体,但是由于技术的不成熟,最终没有流行起来。当时基于机器学习的方法已经开始研究,比

多无人机协同3D打印盖房子,研究登上Nature封面多无人机协同3D打印盖房子,研究登上Nature封面Apr 09, 2023 am 11:51 AM

我们经常可以看到蜜蜂、蚂蚁等各种动物忙碌地筑巢。经过自然选择,它们的工作效率高到叹为观止这些动物的分工合作能力已经「传给」了无人机,来自英国帝国理工学院的一项研究向我们展示了未来的方向,就像这样:无人机 3D 打灰:本周三,这一研究成果登上了《自然》封面。论文地址:https://www.nature.com/articles/s41586-022-04988-4为了展示无人机的能力,研究人员使用泡沫和一种特殊的轻质水泥材料,建造了高度从 0.18 米到 2.05 米不等的结构。与预想的原始蓝图

如何让自动驾驶汽车“认得路”如何让自动驾驶汽车“认得路”Apr 09, 2023 pm 01:41 PM

与人类行走一样,自动驾驶汽车想要完成出行过程也需要有独立思考,可以对交通环境进行判断、决策的能力。随着高级辅助驾驶系统技术的提升,驾驶员驾驶汽车的安全性不断提高,驾驶员参与驾驶决策的程度也逐渐降低,自动驾驶离我们越来越近。自动驾驶汽车又称为无人驾驶车,其本质就是高智能机器人,可以仅需要驾驶员辅助或完全不需要驾驶员操作即可完成出行行为的高智能机器人。自动驾驶主要通过感知层、决策层及执行层来实现,作为自动化载具,自动驾驶汽车可以通过加装的雷达(毫米波雷达、激光雷达)、车载摄像头、全球导航卫星系统(G

苹果M3 Ultra推出全新版本,新增32个CPU核心和80个GPU核心苹果M3 Ultra推出全新版本,新增32个CPU核心和80个GPU核心Nov 13, 2023 pm 11:13 PM

这款芯片可能会搭载高达80个GPU核心,进而成为M3系列中性能最强大的产品。Max两倍核心数量从M1与M2系列的发展模式来看,苹果的「Ultra」版芯片基本上是「Max」版本的两倍核心数量,这是因为苹果实际上将两颗Max芯片透过内部连接技术结合起来,形成了M1Ultra与M2Ultra。80个GPU核心M3Ultra可能拥有「高达80个图形处理核心」。这一预测基于苹果芯片的发展路径:从基础版到「Pro」版,再到图形核心数量翻倍的「Max」版,以及CPU和GPU核心都翻倍的「Ultra」版。举例来

超逼真渲染!虚幻引擎技术大牛解读全局光照系统Lumen超逼真渲染!虚幻引擎技术大牛解读全局光照系统LumenApr 08, 2023 pm 10:21 PM

实时全局光照(Real-time GI)一直是计算机图形学的圣杯。多年来,业界也提出多种方法来解决这个问题。常用的方法包通过利用某些假设来约束问题域,比如静态几何,粗糙的场景表示或者追踪粗糙探针,以及在两者之间插值照明。在虚幻引擎中,全局光照和反射系统Lumen这一技术便是由Krzysztof Narkowicz和Daniel Wright一起创立的。目标是构建一个与前人不同的方案,能够实现统一照明,以及类似烘烤一样的照明质量。近期,在SIGGRAPH 2022上,Krzysztof Narko

internet的基本结构与技术起源于什么internet的基本结构与技术起源于什么Dec 15, 2020 pm 04:48 PM

internet的基本结构与技术起源于ARPANET。ARPANET是计算机网络技术发展中的一个里程碑,它的研究成果对促进网络技术的发展起到了重要的作用,并未internet的形成奠定了基础。arpanet(阿帕网)为美国国防部高级研究计划署开发的世界上第一个运营的封包交换网络,它是全球互联网的始祖。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.