• 搜索引擎项目的详细介绍


    目录

    1.项目概述

    二、项目需求

    三、开发环境

    四、准备工作

    五、项目的详细实现

    第一个模块:生成正排和倒排索引

    第二个模块查询功能:


    1.项目概述

    项目名称:搜索引擎

    项目介绍:本系统把JDK8的安装包进行了文档解析生成了倒排索引和正派索引,保存在数据库中,并对数据可中保存的分词进行查询,通过js返回给界面。

    二、项目需求

    2.1功能需求

    (1)用户可以通过查询,得到相关的内容。

    (2)查询速度要快,响应时间在5秒之内

    (3)有良好的引导界面提示,增强用户体验。

    2.2总体设计

    设置了两个模块,一个用来建立索引,一个用来查询索引,使用了spring框架,直接通过注解的方式构造bean,用Mybatis批量插入sql,提高了效率,使用正则表达式的勉强模式去除标签,使用线程池以及建立索引提高查询的效率,有显著的优化效果。

    三、开发环境

    1.前端开发:

    技术:Html、Css、JavaScript

    工具:Intellij IDEA 2020.1.4

    2.后端开发:

    技术:IDEA2021、MySQL Workbench、JDK1.8、Spring、SpringMVC、Mybatis、 SpringBoot

    工具:Intellij IDEA 2020.1.4

    3.开发环境:Windows10 家庭版

    4.运行环境:Intellij IDEA 2020.1.4

    四、准备工作

    1.从官网下载JDK1.8的包,保存在确定的文档中。

    2.创建spring项目(添加相关的依赖),配置application.yml文件,连接数据库,规定日志的打印级别。

    3.创建两个模块index-refactor以及web。

    五、项目的详细实现

    本项目是利用spring框架对进行了搜索引擎的实现,搜索的内容是下载好的JDK包,实现通过关键词对JDK包的查询。


    1.此项目创建了两个project,一个用来生成正排索引和倒排索引,另外一个用来进行搜索引擎的查询功能。

     


    第一个模块:生成正排和倒排索引

    1.首先对文档进行解析返回符合条件的文档,保存在数据库中的正排索引表(保存了文档id、文档名、url、具体的content)。
    倒排索引表则是把(id、分词、文档id、权重)组合在一起的一张表。
    我们进行查询时,先根据浏览器输入的分词查询倒排索引表再根据该表的文档名查询正排索引表。

     

    2.正排索引表和倒排索引表使用了Mybatis的动态SQL的特性对分词进行批量插入,提高了索引生成的效率。


    开发过程中遇到的技术难点是单线程处理数据库的插入查询等操作还是很慢。


    解决办法:在AppConfig中定义了线程池,定义了几个变量,以及一个队列(容量为5000)
    8个正式员工,最多同时处理20个线程,存活时间30 ,然后在indexmanager(只负责提交给线程池)中excutorService.submit(task)把任务提交给线程池处理。
    indexmanager中写一个计数器latch,每次执行完了-1.等到为0,则所有线程执行完了,主线程提交完之后latch.await()等到所有的线程都指向完就结束了。


    技术难点:

    技术难点:构建索引的两个遗留的问题:


    没有删除干净。


    解决方法:把Document中正则表达式的贪婪模式改为勉强模式

    第二个模块查询功能:

    主要是通过html获取到用户输入的关键词,然后在数据库中查询,根据权重等把数据用js渲染到浏览器界面。

    性能问题:

    技术难点:索引有2百万条,平均查询时间1.8秒,性能很差。


    解决办法:向表中(针对word做索引)新建索引,实际上就是把word列作为key,docid作为value ,新建一颗搜索树(B+树)。从key查找value,时间复杂度则变为了O(log(n))21次远远小于O(n)200万次。


    建索引的速度很慢,而且会导致数据插入很慢,所以,表中的数据已经插入完成的情况下,添加索引。

     

  • 相关阅读:
    VUE3子表格嵌套分页查询互相干扰的问题解决
    Adobe XD文件转PDF、再转成一张大图的办法
    Apache ECharts数据可视化技术
    Redis分布式缓存
    (memcpy,memmove...)内存函数还不会??别怕,我来助你一臂之力
    java 高级面试题(借鉴)(中)
    智能AI创作系统ChatGPT商业运营版源码+AI绘画系统/支持GPT联网提问/支持Midjourney绘画+Prompt应用+支持国内AI提问模型
    虹科分享 | 带你全面认识“CAN总线错误”(二)——CAN错误类型
    Linux--互斥锁
    高德地图API-获取位置信息的经纬度
  • 原文地址:https://blog.csdn.net/wxx200008/article/details/126817101