点击关注公众号,利用碎片时间学习

咋们如果用我们的小服务器去搞百度,搜狗那种引擎肯定是不行的,内属于全站搜索,我们这里做一个站内搜索。这个还是可以的,就类似于我们对网站里的资源进行搜索。

一.搜索引擎怎么搜索

搜索引擎就像一个小蜜蜂每天不停的采摘蜂蜜,就是去爬虫各个网页,然后通过爬取之后建立索引,以供于我们去搜索。

这里我们可以使用Python,或者下载文档压缩包。这里我们下包把,快多了。本来想搞一个英雄联盟的,实在找不见,要是后续有老铁找到可以分享一下。

建议大家别爬虫(要不然被告了,不过我们学校的官网倒是可以随便爬,我们当时就是拿这个练手的)

为什么要用索引呢?

因为爬的数据太多了,不索引,难道我去遍历吗?时间复杂度太大了。

这里我们需要建立索引,索引分别为正排索引,和倒排索引。

拿LOL举个例子吧,正排就相当于,我们提到无极剑圣的技能就可以联想到

  • Q技能 阿尔法突袭

  • W技能 冥想

  • E技能 无双

  • R技能 高原血统

故根据名字选技能

倒排索引就是LOL里面谁有剑

  1. 蛮王

  2. 无极剑圣

  3. 剑姬

故根据特点选择英雄

二.模块划分

1.索引模块

1)扫描下载到的文档,分析内容,构建出,正排索引和倒排索引。并且把索引内容保存到文件中。

2)加载制作i好的索引。并提供一些API实现查正排和查倒排这样的功能。

2.搜索模块

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

  • 输入:用户的查询词

  • 输出:完整的搜索结果

3.web模块

需要实现一个简单的web程序,能够通过网页的形式和用户进行交互。

包含了前端和后端。

三. 怎么实现分词

分词的原理

1.基于词库

尝试把所有的词都进行穷举,把这些结果放到词典文件中。

2.基于统计

收集到很多的语料库,进行人工标注,知道了那些字在一起的概率比较大~

java中能够实现分词的第三方工具也是有很多的

比如ansj(听说唱的兄弟可能听过ansj,哈哈)这个就是一个maven中央仓库的分词第三方库。

我们直接下载最新版本然后放入pom.xml里面

test包里直接操作:我们使用这个测试代码直接搞。试一下这个包咋用。

import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;
import java.util.List;
public class TastAnsj {public static void main(String[] args) {String str = "易大师是一个有超高机动性的刺客、战士型英雄,擅长利用快速的打击迅速击溃对手,易大师一般打野和走单人路,作为无极剑道的最后传人,易可以迅速砍出大量伤害,同时还能利用技能躲避猛烈的攻击,避开敌人的集火。";List<Term> terms = ToAnalysis.parse(str).getTerms();for (Term term : terms) {System.out.println(term.getName());}}
}

四.文件读取

把刚刚下载好的文档的路径复制到String中并且用常量标记。

这一步是为了用遍历的方法把所有html文件搞出来,我们这里用了一个递归,如果是绝对路径,就填加到文件链表,如果不是就递归,继续添加里面的值。

import java.io.File;
import java.util.ArrayList;//读取刚刚文档
public class Parser {private static final  String INPUT_PATH="D:/test/docs/api";public  void run(){//整个Parser类的入口//1.根据路径,去枚举出所有的文件.(html);ArrayList<File> fileList=new ArrayList<>();enumFile(INPUT_PATH,fileList);System.out.println(fileList);System.out.println(fileList.size());//2.针对上面罗列出的文件,打开文件,读取文件内容,并进行解析//3.把在内存中构造好的索引数据结构,保定到指定的文件中。}//第一个参数表示从哪里开始遍历 //第二个表示结果。private void enumFile(String inputPath,ArrayList<File>fileList){File rootPath=new File(inputPath);//listFiles 能够获取到一层目录下的文件File[] files= rootPath.listFiles();for(File f:files){//根据当前f的类型判断是否递归。//如果f是一个普通文件,就把f加入到fileList里面//如果不是就调用递归if(f.isDirectory()){enumFile(f.getAbsolutePath(),fileList);}else {fileList.add(f);}}}public static void main(String[] args) {//通过main方法来实现整个制作索引的过程Parser parser=new Parser();parser.run();}
}

我们尝试运行一下,这里的文件也太多了吧,而且无论是什么都打印出来了。所以我们下一步就是把这些文件进行筛选,选择有用的。

else {if(f.getAbsolutePath().endsWith(",html"))fileList.add(f);
}

这个代码就是只是针对末尾为html的文件,下图就是展示结果。

4.1 打开文件,解析内容。

这里分为三个分别是解析Title,解析Url,解析内容Content

4.1.1解析Title

f.getName()是直接读取文件名字的方法。

我们用的name.substring(0,f.getName().length()-5);为什么要用总的文件名字长度减去5呢,因为.HTML刚好就是五。

private  String parseTitle(File f) {String name= f.getName();return name.substring(0,f.getName().length()-5);}

4.1.2解析Url操作

这里的url就是我们平时去一个浏览器输入一个东西下面会有一个url,这个url就是我们的绝对路径经过截取获得出我们的相对的目录,然后与我们的http进行拼接,这样就可以直接得到一个页面。

private  String parseUrl(File f) {String part1="https://docs.oracle.com/javase/8/docs/api/";String part2=f.getAbsolutePath().substring(INPUT_PATH.length());return part1+part2;}

4.1.3解析内容

<>为开关进行对数据的读取,以int类型读取,为什么要用int而不是char呢因为int类型读完之后就变成-1可以判断一下是否读取完毕。

具体代码如下很容易理解。

private  String parseContent(File f) throws IOException {//先按照一个一个字符来读取,以<>作为开关try(FileReader fileReader=new FileReader(f)) {//加上一个是否拷贝的开关.boolean isCopy=true;//还需要准备一个结果保存StringBuilder content=new StringBuilder();while (true){//此处的read的返回值是int,不是char//如果读到文件末尾,就会返回-1,这是用int的好处;int  ret = 0;try {ret = fileReader.read();} catch (IOException e) {e.printStackTrace();}if(ret==-1) {break;}char c=(char) ret;if(isCopy){if(c=='<'){isCopy=false;continue;}//其他字符直接拷贝if(c=='\n'||c=='\r'){c=' ';}content.append(c);}else{if(c=='>'){isCopy=true;}}}return  content.toString();} catch (FileNotFoundException e) {e.printStackTrace();}return "";}

这一模块总的代码块如下:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;//读取刚刚文档
public class Parser {private static final  String INPUT_PATH="D:/test/docs/api";public  void run(){//整个Parser类的入口//1.根据路径,去枚举出所有的文件.(html);ArrayList<File> fileList=new ArrayList<>();enumFile(INPUT_PATH,fileList);System.out.println(fileList);System.out.println(fileList.size());//2.针对上面罗列出的文件,打开文件,读取文件内容,并进行解析for (File f:fileList){System.out.println("开始解析"+f.getAbsolutePath());parseHTML(f);}//3.把在内存中构造好的索引数据结构,保定到指定的文件中。}private  String parseTitle(File f) {String name= f.getName();return name.substring(0,f.getName().length()-5);}private  String parseUrl(File f) {String part1="https://docs.oracle.com/javase/8/docs/api/";String part2=f.getAbsolutePath().substring(INPUT_PATH.length());return part1+part2;}private  String parseContent(File f) throws IOException {//先按照一个一个字符来读取,以<>作为开关try(FileReader fileReader=new FileReader(f)) {//加上一个是否拷贝的开关.boolean isCopy=true;//还需要准备一个结果保存StringBuilder content=new StringBuilder();while (true){//此处的read的返回值是int,不是char//如果读到文件末尾,就会返回-1,这是用int的好处;int  ret = 0;try {ret = fileReader.read();} catch (IOException e) {e.printStackTrace();}if(ret==-1) {break;}char c=(char) ret;if(isCopy){if(c=='<'){isCopy=false;continue;}//其他字符直接拷贝if(c=='\n'||c=='\r'){c=' ';}content.append(c);}else{if(c=='>'){isCopy=true;}}}return  content.toString();} catch (FileNotFoundException e) {e.printStackTrace();}return "";}private void parseHTML (File f){//解析出标题String title=parseTitle(f);//解析出对应的urlString url=parseUrl(f);//解析出对应的正文try {String content=parseContent(f);} catch (IOException e) {e.printStackTrace();}}//第一个参数表示从哪里开始遍历 //第二个表示结果。private void enumFile(String inputPath,ArrayList<File>fileList){File rootPath=new File(inputPath);//listFiles 能够获取到一层目录下的文件File[] files= rootPath.listFiles();for(File f:files){//根据当前f的类型判断是否递归。//如果f是一个普通文件,就把f加入到fileList里面//如果不是就调用递归if(f.isDirectory()){enumFile(f.getAbsolutePath(),fileList);}else {if(f.getAbsolutePath().endsWith(".html"))fileList.add(f);}}}public static void main(String[] args) {//通过main方法来实现整个制作索引的过程Parser parser=new Parser();parser.run();}
}

来源:blog.csdn.net/m0_57315623/

article/details/123829698

推荐:

主流Java进阶技术(学习资料分享)

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

写一个搜索引擎系统(Java版)相关推荐

  1. Java入门知识,写一个最简单java程序

    本文目录 一.Java语言的简介 二.写一个最简单Java程序 1.Notepad配置 2.最简单的Java程序 3.代码分析 4.编译与编译常见错误 5.执行java程序 一.Java语言的简介 0 ...

  2. 用java做一个简单记事本_用记事本写一个简单的java程序

    用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...

  3. [html] 写一个搜索框,聚焦时搜索框向左拉长并有动画效果

    [html] 写一个搜索框,聚焦时搜索框向左拉长并有动画效果 为啥直接粘贴html发布以后就没有了呢 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 ...

  4. 写一个简单的Java界面程序

    写一个简单的Java界面程序 有时候未免想写一些有界面的java小程序练练手,那么如何写一个比较好看的界面话程序呢?下面小编就带你一步一步来搭建这个小洋房. 实现界面化编程要用到的一个主要包impor ...

  5. 用Java写了一个搜索引擎系统

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 7 分钟. 来自:https://blog.csdn.net/m0_57315623?type=blog 前言 咱们如果用我们 ...

  6. java 委托_java 能不能自己写一个类叫 java.lang.System/String 正确答案

    来自:一汪清水 | 责编:乐乐 链接:blog.csdn.net/tang9140/article/details/42738433    正文    最近学习了下java类加载相关的知识.然后看到网 ...

  7. 用Java写一个植物大战僵尸简易版!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/byeEj ...

  8. 用Java语言,写一个植物大战僵尸简易版!

    前言 有谁没玩过植物大战僵尸吗? 小灰的一位读者,用Java语言开发了自己的植物大战僵尸游戏.虽然系统相对简单,但是麻雀虽小五脏俱全,对游戏开发感兴趣的小伙伴可以学习一下哦~~ 游戏设计 植物大战僵尸 ...

  9. 用 Java 写一个植物大战僵尸简易版!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2 个月的面试亲身经历告诉大家,如何进入大厂? 有谁没玩过植物大战僵尸吗?一位读者用Java语言开发了自己的植物 ...

  10. 用 Java 写一个植物大战僵尸简易版

    转自:公众号:程序员小灰     作者:林Lychee 前言 有谁没玩过植物大战僵尸吗? 有一位读者,用Java语言开发了自己的植物大战僵尸游戏.虽然系统相对简单,但是麻雀虽小五脏俱全,对游戏开发感兴 ...

最新文章

  1. SpringBoot高级消-息-RabbitMQ基本概念简介
  2. 一行命令让ElasticSearch支持中文分词搜索
  3. springboot:记录jdbc
  4. IOS工程自动打包并发布脚本实现
  5. srtvlet filter
  6. Android的引用jar包
  7. javascript系统系列:浅析js中的浏览器循环事件(eventLoop)
  8. php设计模式之单例模式 1
  9. raspberry pi_如何在Raspberry Pi上使用LÖVE游戏引擎对游戏进行编程
  10. new relic_新的Relic的Centurion Docker部署工具,DIY大脑扫描仪等
  11. 华为Mate X 5G被黄牛炒出天价:这价格都能买辆车了!
  12. restTemplate设置访问超时
  13. 培训loadrunner感受
  14. FMEA-MSR步骤五:风险分析(三)
  15. CESM mpirun noticed that process rank 1 with PID 0 on node ubuntu exited on signal 11
  16. Matplotlib动图:FuncAnimation实现
  17. 冷酷仙境与世界尽头——《葫芦兄弟》人物赏析  作者:马伯庸
  18. 学习Python第5天
  19. ffmpeg命令行使用
  20. 中国互联网办公地变迁史:你的公司为什么也搬家了?

热门文章

  1. android ppt 转图片显示不全,ppt转pdf图片显示不全怎么办
  2. java从键盘上输入一位整数_当输入1到7时_从键盘上输入一位整数,当输入1~7时,显示对应的英文星期名称的缩写。...
  3. nodejs的桌面应用(electron)
  4. 2、一个向量乘它的转置,其几何意义是什么?
  5. 企业推进数字化转型零信任是必须?
  6. 浏览器被劫持怎么办,详细讲解浏览器DNS被劫持的解决方法
  7. 灰灰考研机试班 | 基础练习二 问题 B: 日历本 | 入门题-模拟 | 日期、星期相关计算
  8. java大作穿越arpg_动作与角色扮演完美结合 精品ARPG游戏盘点
  9. Appium +iOS 自动化测试全网最全教程(实践、总结 、踩坑)
  10. CSS 边框四个角效果