| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Java项目之搜索引擎 -> 正文阅读 |
|
[Java知识库]Java项目之搜索引擎 |
搜索引擎的核心功能,就是查找到一组和用户输入的词/一句话 相关联的网页 关键字:搜索词;搜索结果的标题,搜索结果的描述,展示URL,跳转过去的目标页面,称为“落地页”; 对于一个搜索引擎来说,首先,需要获取到很多很多的网页;然后再根据用户输入的查询词,在这些网页中进行查找。
此处主要是涉及到“爬虫”这样的程序(Http客户端)
假设当前已经爬取到了一亿个网页,用户输入了一个"蛋糕"这样的查询词。这样的暴力搜索,是非常低效的,而搜索引擎需要能够让用户非常高效的获取到结果。 这时候就需要一种特殊的数据结构,倒排索引。
先介绍几个概念
举个例子
倒排索引:
在本地基于离线文档来制作索引。实现搜索,当用户在搜索结果页点击具体的搜索结果的时候,就自动跳转到在线文档的页面。
创建 Maven 项目
分词的原理
使用现成的第三方库 ansj 来实现分词。
代码运行的警告是因为没有配置字典。
解析出 HTML 对应的 URL 说明 Java API 文档有两份:
线上: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html 期望达到的结果是,用户点击搜索结果,能够跳转到对应的线上文档的页面。
倒排索引,词 => 文档 id 之间的映射关系 首先就需要先知道当前这个文档,里面都有那些词 因此就需要针对当前文档也进行分词
因此就可以先针对当前文档进行分词,然后根据每个分词结果;去倒排索引中,找到对应的 value,然后把当前文档 id 给加入到对应的 value列表中即可。 如何来确定权重的值? 这个值描述了 词 和 文档 之间的“相关性” 此处单纯的通过 词 出现的次数,来表示相关性。 权重计算公式:标题中出现的次数+10 + 正文中出现的次数 保存索引结构到磁盘中 索引当前是存储在 内存 中的。构建索引的过程是比较耗时的。 需要把内存中的索引结构,变成一个“字符串”,然后写文件即可。 对应的,把特定结构的字符串,反向解析成一些结构化数据(类/对象/基础数据结构) (反序列化) 通过 json库 来实现序列化和反序列化。ObjectMapper对象
创建一个匿名内部类,这个类实现了 TypeReference.同时再创建一个这个匿名内部类的实例。创建这个实例最主要的目的,就是为了把 ArrayList 这个类型信息,告诉 readValue 方法。 关于 Parser 和 Index 之间的关系 Parser 相当于制作索引的入口 => 对应到一个 “可执行” 程序 Index 类就要给 Parser 进行调用,才能完成整个制作索引的功能 性能优化 通过测试,发现当前主要的性能瓶颈,在循环便利文件上。 单个线程的情况,任务都是串行执行的。 线程池之保证所有文档处理完毕再保存索引 CountDownLatch 类似于跑步比赛的裁判 给制作索引代码加锁 如果直接把 synchronized 加到 parseHTML 或者 addDoc 这样的方法上,是不科学的,这样做锁的粒度太粗了,并发程度不高,提高的效率有限。因此要把枷锁的粒度搞细一点。 解决进程不退出的问题 关于守护线程 前面学过的线程创建的手段,默认创建出来的都是非守护线程,需要通过 setDaemon 方法手动设置,才能成为守护线程。 通过线程池创建的线程,并不是守护线程。 开机之后,首次制作索引特别慢的问题 是由于缓存,parseContent的核心操作,就是读取文件。从磁盘进行访问,操作系统就会对“经常读取的文件”进行缓存。
正则里面主要就是有很多特殊符号 去除script标签和内容 去除 普通 的标签(不去掉内容) ? 表示“非贪婪匹配”,匹配到一个符合条件的最短结果 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:59:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |