当前位置: 首页 > 后端技术 > PHP

我从头开发了一个完整的网络搜索引擎!

时间:2023-03-30 05:53:32 PHP

前言由于本人对搜索引擎技术很感兴趣,所以开始尝试开发搜索引擎。参考了网上有限的资料,加上自己的研究,终于开发了一个全网的小搜索引擎,底部有项目地址和搜索测试图片。本项目的语言是PHP(语言不重要,主要是思想、架构、算法)。搜索引擎的一般流程1.网页采集网页采集需要使用网络爬虫。由于互联网连接种类繁多且极不稳定,因此需要一个健壮的爬虫系统来应对复杂的情况。爬取策略一般分为深度优先和广度优先两种情况,具体选择哪一种要视情况而定。一个HTTP请求是非常耗时的,从1秒到几秒不等,所以需要多线程爬取(我用的是curl_multi);同时,如果有条件可以配置集群爬取。2.预处理预处理是搜索引擎中最复杂的部分。基本上,大多数排序算法都是在预处理环节生效的。然后,在搜索引擎的预处理部分,主要对数据进行了以下几个步骤的处理:许多相关页面的主要内容是无关紧要的。因此,搜索引擎需要做以下几件事:①代码去噪。去掉网页中的所有代码,只留下文字。②去除非文本关键词。示例包括页面上导航栏的关键字和不同页面共享的其他公共区域。③去除停用词。停用词是指没有特定含义的词,如“of”、“in”等。当搜索引擎得到这个网页的关键词时,会使用自己的分词系统,将这篇文章分成一个分词列表,然后存入数据库,并和这个的网址做一一对应文章。网页去重互联网上存在大量重复的网页内容。如果不经处理就存储,会严重影响搜索体验。这一步涉及海量数据的去重技术。由于网页不能简单的通过字符串比较来比对去重,一般的网页去重逻辑是提取网页的指纹(涉及自然语言处理,词向量等),然后比对去重。比较字符串的相似度,常用的技术有“余弦相似度”、“汉明距离”等。网页去噪在网页去噪过程中,去除网页中无用的标签等内容,充分利用网页代码(如H标签、强标签)、关键词密度、内链锚文本等进行分析网页中最重要的短语。数据保存和更新当数据量增加时,所有的小问题都会变成大问题。大量的数据经过处理后存储在数据库中,数据库的选择和设计就显得尤为重要。因为要兼顾海量数据的快速插入和查询。保存的数据还需要考虑数据的更新,设计更新策略,爬取更新这么多的内容,对服务器的性能和数量会有更高的要求。网页重要度分析确定网页的权重值,同时结合上述“重要信息分析”建立该网页的关键词集合p中各关键词的排名系数。倒排索引搜索引擎之所以能够快速查询到相应的内容,是因为索引的使用。索引是一种数据结构。一般而言,搜索引擎采用的是倒排索引结构,即先对网页内容进行切分,将同一切分的不同文档id组合起来,依此类推。相关细节可以详细查到。搜索引擎在保证搜索效果的同时需要有非常高的召回率,所以分词器的选择和分词策略都需要慎重考虑和选择。索引分为全量索引和增量索引。一次更新全量索引,比较耗时。增量索引每次只更新“新增内容”索引,然后将查询与旧索引合并。3、查询服务查询服务,顾名思义,就是处理用户在搜索界面上的查询请求。搜索引擎构建检索器,然后分四步处理请求。查询重写相当一部分搜索语句可能不清楚和不完整。这时候如果按照原来的内容进行分词搜索,效果肯定不理想。这时候就需要query重写,让搜索词更准确的表达搜索者。想法,从而达到更高的召回率。根据查询方式和关键词切词。首先将用户搜索的关键词划分为一系列关键词,我们暂且用q来表示,然后将用户搜索的关键词q划分为q={q1,q2,q3,...,qn}.然后根据用户的查询方式,比如是否所有的词都连在一起,或者中间有空格等,并根据q中不同关键词的词性,确定q中的每个词所需查询词在查询结果显示中所占的重要性。内容过滤去除了很多网页内容,肯定有一些非法内容,所以需要去除相关内容,防止前台显示;有时搜索者也会搜索一些敏感内容,搜索查询必须经过处理。搜索结果排序我们有一组搜索词q,计算q中每个关键词相对于其所属文档的重要性,进行综合排序算法,搜索结果就出来了。排序算法是搜索引擎的核心,影响着搜索结果的准确性。实际应用中排序的计算方法是多维度的,极其复杂。显示搜索结果和文档摘要当有搜索结果时,搜索引擎会将搜索结果显示在用户界面上,以供用户使用。一般搜索词会被标红,显示效果会更好。其他优化内容,包括使用redis等缓存工具缓存搜索结果;保证速度,使用cdn等搜索结果测试总结以上只是对搜索引擎的大致过程的简单描述,具体的细节还有很多。我的项目地址是海豚搜索www.haitemm.com,欢迎体验。受限于客观环境,现在存储的数据量并不大,只有几千万。