当前位置: 首页 > article >正文

【文档搜索引擎】项目核心思路,模块划分和分词的概念

文章目录

  • 核心思路
    • 倒排索引
  • 获取 Java 文档
  • 模块划分
    • 索引模块
    • 搜索模块
    • Web 模块
  • 分词

项目目标:实现一个针对 Java 文档的搜索引擎
https://docs.oracle.com/javase/8/docs/api/index.html

  • 像百度,搜狗,bing 这些搜索引擎,都是属于“全站搜索”,搜索整个互联网上所有的网站
  • 还有一类搜索引擎,称为“站内搜索”,只针对某个网站内部的内容进行搜索

核心思路

对于一个搜索引擎来说,首先需要获取到很多的网页,然后再根据用户输入的查询词,在这些网页中进行查找

涉及到的关键问题:

  1. 搜索引擎的页面是怎么获取到的?
    • 此处主要是涉及到“爬虫”这样的程序

[!quote] 爬虫
就是一个 http 客户端,去发送一些 http 请求,获取一些 http 响应的结果,这里的结果就是各种各样的网站

  1. 用户输入了查询词之后,如何让查询词和当前的这些网页进行匹配呢?
    • 假设当前已经爬取到了 1 亿个网页(HTML 网页),用户输入了“蛋糕”这样的查询词
    • 如果使用暴力搜索的话,就需要把“蛋糕”这个查询词在这 1 亿个网页中进行字符串查找。这样效率非常低,不可能达到秒出结果的效果
    • 这时候就需要一种特殊的数据结构——倒排索引

倒排索引

  1. 文档(document):指的是每个待搜索的网页
  2. 正排索引:指的是文档id到文档内容之间的一个映射关系
    • 给你一个文档 id,你就能找到这个文档对应的内容
  3. 倒排索引:指的是词到文档id 列表的映射关系
    • 因为一个词可能在很多文档里面都出现了,所以得到的是一个文档 id 列表

获取 Java 文档

把相关的网页文档获取到,这样才能制作正排索引和倒排索引

可以通过爬虫技术,来获取这些文档。

爬虫是否要学一下 Python 之类的?

  • 所谓的爬虫,只是一个 http 客户端
  • 只要这个编程语言能够访问网络,那么就可以实现爬虫

爬虫是获取到网页页面的一种“通用的手段”,但是针对 Java 文档来说,我们有更简单的方案

  • 可以直接从官方网站上下载文档的压缩包
    因此我们就不必通过爬虫来实现了

实现爬虫程序是存在法律风险的。每个网站都会提供一个 robots.txt 文件,这个文件里面就会告诉你哪些内容允许爬取,爬取这个白名单之外的内容,都是属于非法行为

文档下载链接:(https://www.oracle.com/java/technologies/javase-jdk8-doc-downloads.html)[https://www.oracle.com/java/technologies/javase-jdk8-doc-downloads.html]

在本地基于离线文档来制作索引,实现搜索。当用户在搜索结果页点击具体的搜索结果的时候,就自动跳转到在线文档的页面

模块划分

索引模块

  1. 扫描下载到的文档,分析文档的内容,构件出正排索引+倒排索引,并且把索引内容保存到文件中
  2. 加载制作好的索引,并提供一些 API,实现查正排和查倒排这样的功能

搜索模块

调用索引模块,实现一个搜索的完整过程

  • 输入:用户的查询词
  • 输出:完整的搜索结果(包含很多条记录,每个记录就有标题、描述、展示 URL,并且点击能够跳转)

Web 模块

需要实现一个简单的 Web 程序,能工通过这种网页的形式来和用户进行交互

  • 包含了后端和前端

分词

用户在搜索引擎中,输入的查询词,不一定真的就是一个词,也可能是一句话。分词就是把一个完整的句子,给切分成多个词:

  • 天天/在/学校/当/牛马
  • 对于分词这个操作,人是很容易完成的。但是我们是要通过代码进行分词,这就会困难很多,尤其是中文(太博大精深)
    • 我一把把车把把住
    • 我也想过过过儿过过的生活
    • 下雨天留客,天留我不留

我们可以基于一些现成的第三方库来实现分词


http://www.kler.cn/a/411111.html

相关文章:

  • 跨部门文件共享安全:平衡协作与风险的关键策略
  • 突破内存限制:Mac Mini M2 服务器化实践指南
  • 国土安全部发布关键基础设施安全人工智能框架
  • 【Python】构建事件驱动架构:用Python实现实时应用的高效系统
  • 非root用户安装CUDA
  • 离散化 C++
  • server向浏览器发送信息-SseEmitter使用
  • 【第三方云音乐播放器SPlayer本地安装结合内网穿透打造个性化远程音乐库】
  • Rust赋能前端: 纯血前端将 Table 导出 Excel
  • 【算法】欧几里得与拓展欧几里得算法
  • 算法笔记:滑动窗口
  • 从Full-Text Search全文检索到RAG检索增强
  • 【python】数据可视化之图像处理
  • TailwindCss 总结
  • 【纪念365天】我的创作纪念日
  • CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标
  • 【Linux系统】—— 基本指令(四)
  • Kotlin DSL Gradle 指南
  • MYSQL 表的增删改查(上)
  • qt ubuntu i386 系统
  • 【MySQL系列】通过创建新表备份`password`字段
  • c++:面向对象三大特性--继承
  • 数据结构 【二叉树(上)】
  • c++学习:json库例子
  • Spark SQL大数据分析快速上手-Hive安装
  • 【设计模式】【行为型模式(Behavioral Patterns)】之命令模式(Command Pattern)