赞
踩
实现一个较为简单的搜索引擎,在拥有较多网页的基础上,在用户输入查询词之后,能够从这些网页中尽可能地匹配出用户想要的网页
当然,不同于百度搜狗这种搜索引擎,它们能够对互联网中大量的网站都进行搜索,我们这里实现的是针对「Java 文档」的搜索引擎,就像下图,能对 Java 帮助文档 的 API 针对关键词进行文档的搜索
了解了项目的大概之后,就可以开始一点一点制作了,首先进行 Spring 项目的创建
至此,项目的创建就完成了,为了简化目录,可以将新创建中的这四个文件进行删除
既然要搜索页面,那肯定得先有页面才能搜索,这里建议直接去官网中下载
网址:Java 文档下载
然后点击下载即可
随后,将安装包解压,放到自己指定的目录,这里我就放在项目所在目录(路径上尽量不要有中文)
至此,准备阶段就完成了
在真正编写代码之前,先了解一下搜索的逻辑。
首先我们需要预处理所有的静态页面,获取文档标题(这里文档可以理解成一个静态页面),url,正文等信息,然后包装成一个Document对象。并且还需要通过两个索引来组织这些对象——正排索引和倒排索引,同时记录「权重或者说是相关性」,便于将搜索结果进行整合并排序
- 正排索引:根据文档 ID 能够得到相应的 文档,显然这个结构可以让人想起了 哈希表,但是 ArrayList 更适合,下标和元素相对应
- 倒排索引:根据某个词,可以得到相关联的 List<文档ID>
在用户搜索的时候,我们会获取搜索的语句(这里称为 query),然后对 query 进行分词得到分词结果,然后遍历分词结果,得到「相关联的文档」整理后返回给前端展示
如下,和普通的搜索引擎一样,展示的部分主要有标题,url,摘要(其实也就是正文的截取);
并且点击标题能够跳转到相应的页面
接下来就是代码部分:
为了分词,这里可以在仓库—Ansj链接中,点击第一个,选择最高版本的导入 Spring 中即可
然后可以使用ToAnalysis.parse(字符串).getTerms()
获取到根据该字符串分词得到的 List<Term>
对象,而 Term
就是一个分词结果对象,里面有不少属性,其中又可以通过getName()
来获取这个分词的名字,例如
然后是预处理API中所有的 HTML 文件,然后将这些文件构造成 Document 对象并加入到正排索引和倒排索引中
⭐创建一个 Parser
类,负责进行索引的加载,在此之前还要完成 HTML 文件的预处理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。