上一篇:字节跳动面试经验总结,已顺利拿到offer!

作者:爱编程的快乐人

来源:blog.csdn.net/m0_57315623/article/details/123829698

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

搜索引擎怎么搜索

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

这里我们可以使用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的文件。下图就是展示结果。

1. 打开文件,解析内容。

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

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);}

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;}

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();}
}

感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。

· END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.救救大龄码农!45岁程序员在国务院网站求助总理!央媒网评来了...

2.如何才能成为优秀的架构师?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

撸了个搜索引擎系统,爽!相关推荐

  1. 二改注册登录版素材代下载搜索引擎系统源码,自带火车头采集

    简介: 二改注册登录版/素材代下载搜索引擎系统/自带火车头采集接口/源码素材付费下载系统 程序原创开发,对接易,码,百度搜狗关键词:源码代下,代下源码,均在首页 缺点:这个用户登录必须对接QQ互联登录 ...

  2. PHP仿代下狗源码-素材代下载搜索引擎系统整站打包

    介绍: PHP仿代下狗源码-素材代下载搜索引擎系统多功能/自带火车头采集接口/源码素材付费下载系统/整站打包完美运营版本 缺点:这个用户登录必须对接QQ互联登录,有能力可以自己二开注册登录 1.采用p ...

  3. 如何基于知识图谱技术构建现代搜索引擎系统、智能问答系统、智能推荐系统?

    1.构建搜索引擎系统 下图中描述的体系结构包括三个部分:结合本体库的网络爬虫,索引及检索模块以及知识图谱模块.其中爬虫及索引模块主要负责从网络中爬取原始数据并通过解析得到实体相关信息以及建立索引:搜索 ...

  4. 搜索引擎系统学习与开发实践总结

    导读: 搜索引擎系统学习与开发实践总结 2006-07-23 20:14 一.搜索引擎概述 搜索引擎的发展历史 在互联网发展初期,网站相对较少,信息查找比较容易.然而伴随互联网爆炸性的发展,普通网络用 ...

  5. 20款开源搜索引擎系统

    20款开源搜索引擎系统 一些开源搜索引擎系统介绍,包含开源Web搜索引擎和开源桌面搜索引擎. Sphider Sphider是一个轻量级,采用PHP开发的web spider和搜索引擎,使用mysql ...

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

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

  7. 搜索引擎系统———引擎模块(ssm三剑客项目)

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

  8. 知识图谱实战(04):基于知识图谱的搜索引擎系统

    一.项目介绍 更多完整内容请关注:<知识图谱实战> 适用人群 知识图谱工程师.NLP工程师.搜索工程师,希望进入人工智能领域的同学 你将会学到 您将系统学习整个知识图谱框架体系.落地方法. ...

  9. constellio——基于solr的开源搜索引擎系统源码研究(五)

    插件工厂类PluginFactory.java /*** Constellio, Open Source Enterprise Search* Copyright (C) 2010 DocuLibre ...

  10. ajax+lucene pdf,基于Ajax/Lucene的站内搜索技术研究

    摘要: 站内搜索引擎是找出网站重要信息的必要工具,高效的站内搜索将有助于提升网站的价值,发挥网站应有的作用.虽然现在一些网络巨头已开始研究并应用这类工具,但整个互联网行业中,受制于技术的门槛,真正的站 ...

最新文章

  1. linux nfs 进程,【Linux】 nfs 故障处理
  2. ISA Server中基于L2TP实现远程拨入***
  3. libtorch调用模型
  4. vc6可编译的 linux 源码,Linux 下源码编译FFMEG
  5. apache部署https
  6. polkit 重新安装_不折腾,为U-NAS安装一个清爽的桌面,把小U打造成双面高手
  7. clipboard.js使用方法
  8. Android GridView 分页加载数据
  9. Ardunio开发实例-光敏电阻光线强度检测
  10. 带你从头到尾梳理大图片加载OOM处理问题
  11. su,su -,sudo
  12. Spring -从走火到入魔
  13. stm32 led屏控制卡_如何实现LED双面透明显示屏,双面LED透明屏
  14. 银河麒麟+WIN10双系统安装
  15. 电视上做独立音箱,小米的野望
  16. SAP FICO 成本估算解析
  17. flume1.9自定义hbaseSink(实际是自定义序列化类)
  18. 基于Hyper-V、centos、搭建宝塔Linux结合gitLab实现前端自动化部署
  19. EXCEL中的POWER QUERY功能简介
  20. (丘维声)高等代数课程笔记:映射的乘法,可逆映射

热门文章

  1. iOS底层探索之KVO(五)—FBKVOController分析
  2. Swift的函数嵌套和返回内部函数
  3. 20050909:女乘客钓男司机?
  4. 字节跳动(用户喜好)
  5. oracle 体系结构及内存管理 14_锁
  6. ES6入门---变量的解构赋值
  7. Bootstrap3 表单-输出内联表单
  8. 【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)
  9. 看了部电影——青春期
  10. 用于 Domino Web Access 的 Notes.ini 变量