目录

一、垂直搜索引擎概述

二、项目概述

三、关键技术

3.1 Lucene

3.2 全文检索

四、系统设计

4.1 实现全文检索

4.1.1.Lucene 实现全文检索的流程

4.2 可视化界面设计

4.2.1 VUE 和 Element UI

4.2.2 路由设计

4.2.3 界面设计

五、系统实现

5.1 数据搜集和处理

5.2 建立索引

5.3 查询交互界面

5.4 关键词高亮

5.5 分页功能

六、总结

项目代码:https://github.com/Barnes3255/-Lucene-


一、垂直搜索引擎概述

垂直搜索是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是
对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行
处理后再以某种形式返回给用户。
垂直搜索引擎和普通的网页搜索引擎的最大区别是对网页信息进行了结构
化信息抽取,也就是将网页的非结构化数据抽取成特定的结构化信息数据,好比
网页搜索是以网页为最小单位,基于视觉的网页块分析是以网页块为最小单位,
而垂直搜索是以结构化数据为最小单位。然后将这些数据存储到数据库,进行进
一步的加工处理,如:去重、分类等,最后分词、索引再以搜索的方式满足用户
的需求。
整个过程中,数据由非结构化数据抽取成结构化数据,经过深度加工处理后
以非结构化的方式和结构化的方式返回给用户。

二、项目概述

本实验项目基于 lucene 的进行垂直搜索引擎开发,后端使用 springboot
框架,使用 maven 进行项目管理,前端使用 vue 框架及 element-ui 组件开发可
视化界面。
本项目实现的垂直搜索引擎功能如下:
(1)对文本数据进行分词处理、建立索引
(2)支持分词查询
(3)支持全文搜索
(4)能够高亮显示搜索关键字
(5)具有分页功能 (6)支持分类查询

三、关键技术

3.1 Lucene

Apache Lucene 是完全用 Java 编写的高性能,功能齐全的,全文检索引擎
工具包,通过 lucene 可以让程序员快速开发一个全文检索功能。

3.2 全文检索

全文检索首先将要查询的目标数据中的词提取出来,组成索引,通过查询索
引达到搜索目标数据的目的。这种先建立索引,再对索引进行搜索的过程就叫全
文检索(
Full-text Search)。
数据总体分为两种:结构化数据和非结构化数据。
结构化数据:具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:不定长或无固定格式的数据,如邮件,word 文档等。非结
构化数据又叫全文数据。
全文检索的基本思路:即将非结构化数据中的一部分信息提取出来,重新组
织,使其变得有一定结构,然后对有一定结构的数据进行搜索,从而达到快速搜
索非结构化数据的目的。这部分从非结构化数据中提取出来,然后重新组织的信
息,我们称之索引。
全文检索的应用场景:对于数据量大、数据结构不固定的数据可采用全文检
索方式搜索,比如百度、Google 等搜索引擎、论坛站内搜索、电商网站站内搜
索等。

四、系统设计

4.1 实现全文检索

可以使用 Lucene 实现全文检索。Lucene 是 apache 下的一个开放源代码的
全文检索引擎工具包,它可以为应用程序提供多个 api 接口去调用,可以简单理
解为是一套实现全文检索的类库。

4.1.1.Lucene 实现全文检索的流程

创建索引和搜索流程图 全文检索的流程分为两大部分:索引流程、搜索流程。
索引流程:确定原始内容即要搜索的内容->采集原始内容数据->创建文档->
分析文档(分词)->创建索引
搜索流程:用户通过搜索界面->创建查询->执行搜索->从索引库搜索->渲染
搜索结果
①创建索引
将用户要搜索的数据内容进行索引,索引存储在索引库(
index)中的过程。
②创建文档对象
获取原始数据的目的是为了创建索引,在创建索引前需要将原始数据创建成文档
Document),文档中包括一个一个的域(
Field),域中存储原始数据的内容。
这里可以把 Document 理解为数据库表中的一条记录,可以把域理解为数据库中
的字段。
文档:对非结构化的数据统一格式为 document 文档格式,一个文档有多个 field
域,不同的文档其 field 的个数可以不同,建议相同类型的文档包括相同的 field。
本例子一个 Document 对应一个磁盘上的文件。
索引域:用于搜索程序从索引域中搜索一个一个词,根据词找到对应的文档。将
Document 中的 Field 的内容进行分词,将分好的词创建索引,索引=Field 域名:
词。
③分析文档(分词)
将原始内容创建为包含域(
Field)的文档(
document),需要再对域中的内容
进行分析,分析的过程是经过对原始文档提取单词、将字母转为小写、去除标点
符号、去除停用词等过程生成最终的语汇单元,可以将语汇单元理解为一个一个
的单词。
分词主要过程就是分词和过滤两步: 分词:就是将采集到的文档内容切分成一个一个的词,具体应该说是将 Document
中 Field 的 value 值切分成一个一个的词。
过滤:包括去除标点符号、去除停用词(的、是、a、an、the 等)等
停用词:为节省存储空间和提高搜索效率,搜索引擎在索引页面或处理搜索请求
时会自动忽略某些字或词,这些字或词即被称为 Stop Words(停用词)。比如语
气助词、副词、介词、连接词等,通常自身并无明确的意义,只有将其放入一个
完整的句子中才有一定作用,如常见的“的”、“在”、“是”、“啊”等。

4.2 可视化界面设计

4.2.1 VUE 和 Element UI

VUE 是一套前端框架,免除了原生 JavaScript 中的 DOM 操作,简化书写
VUE 基于 MVVM(
Model-View-ViewModel)思想,实现数据双向绑定
Element UI 是一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端
组件库,了解设计指南,帮助产品设计人员搭建逻辑清晰、结构合理且高效易用
的产品。

4.2.2 路由设计

路由是由 all-router.js 进行统一管理,实现页面间跳转。主页面加载时路由到
searchEngine 界面,在 searchEngine 界面的搜索结果中点击搜索结果,路由到
结果显示界面。

4.2.3 界面设计

①<el-form>表单组件提交数据请求。调用后端接口,获得后端传回的查询结果。
②<el-table>表格组件渲染查询结果数据,由于 VUE 数据双向绑定的特性,实现
了页面数据的异步更新。
③<el-pagination>分页器组件实现前端分页。

五、系统实现

5.1 数据搜集和处理

在数据的收集方面,我搜集了两个部分,一个部分是书籍查询,一个部分是
新闻查询,分别提供给搜索引擎的两个模块进行查询。
我将数据存放在本地文档中,使用 File.io 进行读入读出。 使用 IK 分词器来对文档进行分词处理,IK Analyzer 是一个开源的、基于
java 语言开发的轻量级中文分词工具包。已经推出了 4 个大版本。从 3.0 版本
开始,IK Analyzer 发展为面向 java 的公用分词组件,独立于 lucene 项目,同
时提供了对 lucene 的默认优化实现。在 2012 版本中,IK Analyzer 实现了简单
的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。
支持细粒度 ik_max_word 和智能分词 ik_smart 两种切分模式。
需要注意的是,IK Analyzer 和 lucene 的版本兼容问题。当版本不兼容时,
需要修改 IKAnalyzer 和 IKTokenizer。重写最新版本的 CreateComponents 方法;
重载 Analyzer 接口。
IK Analyzer 扩展停用词
1、在类目录下创建 IK 的配置文件:IKAnalyzer.cfg.xml
2、在配置文件中增加配置扩展停用词文件的节点:
<entry key=“ext_stopwords”>my_ext_stopword.dic</entry>
如有多个,以“;”间隔
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM
"http://java.sun.com/dtd/properties.dtd"
>
<properties>
<comment>IK Analyzer 扩展配置</comment>
<entry key="ext_stopwords">my_stopword.dic</entry>
</properties>
3、在类目录下创建我们的扩展停用词文件 my_stopword.dic,编辑该文件
加入停用词,一行一个

5.2 建立索引

第一步:创建一个 indexwriter 对象
①指定索引库的存放位置 Directory 对象
②指定一个分析器,对文档内容进行分析。
第二步:通过 IO 读取磁盘上的文件信息
第三步:创建 document 对象, 并把文件信息添加到 document 对象中
第四步:使用 indexwriter 对象将 document 对象写入索引库,此过程进行索引创建。并将索引和 document 对象写入索引库。
第五步:关闭 IndexWriter 对象。

5.3 查询交互界面

在查询时使用组合查询,同时在 fileContent 和 fileName 两个域中查找关 键词,从而实现在标题和内容中对关键词的检索。
使用 BooleanQuery 来实现组合查询。
在查询界面中设置了两个模块,分别具有搜索书籍和搜索新闻的功能每一页显示十条内容可根据页码进行页面间的跳转。点击查询按钮时会调用后端接口,获得第一页查询结果,点击某一页面按钮可获得某一页的数据。详细信息在 5.5 分页功能中阐述

5.4 关键词高亮

关键词高亮功能有两种实现方式。
一种是使用 lucene 的 highlighter 插件来实现。
highlighter 包含了用于处理结果页查询内容高亮显示的功能,其中
Highlighter类highlighter包的核心组件,借助Fragmenter, fragment Scorer,
和 Formatter 等类来支持用户自定义高亮展示的功能;
另一种是在前端对需要渲染的数据进行处理。
对后台返回的数据进行操作,使用正则去匹配搜索关键词后,使用 replace 进
行字符串的替换;
html 部分使用 v-html 进行动态展示即可实现。
在后端传回内容数据的同时,传回查询语句的分词结果,循环遍历分词数组,
对每一个分词都要进行高亮处理。

5.5 分页功能

前端发起请求时,附带请求数据的页码n,设置每页显示数据量为 10 条,
则后端查询时查询第(n-1)*10 到第n*10 条数据,并返回给前端。
具体使用 PageInfo 类来实现这一功能。 PageInfo 类中包含了分页信息,向前端传回 PageInfo 类的 JSON 对象后,前端可获得数据总条数,总页数等信息。
前端获得分页信息后,使用<el-pagination>分页器组件实现前端分页。
当页码发生变化时,触发 handleCurrentChange 方法向后端请求新的数据。
这种分页加载数据的方式可以有效缩短用户进行查询的时间。

六、总结

课程设计是我们在学习阶段中一个重要的环节,是对所学基础知识和专业知
识的一种综合应用,是一种综合的再学习、再提高的过程,这一过程对学生的学
习能力和独立思考及工作能力也是一个培养,同时也是对我们自学能力和解决问
题能力的一次考验。

项目代码:https://github.com/Barnes3255/-Lucene-

基于Lucene垂直搜索引擎的研究与开发实践报告相关推荐

  1. 基于android记事本论文,基于android平台的记事本研究与开发 开题报告

    武汉理工大学本科学生毕业设计 (论文)开题报告 1.目的及意义(含国内外的研究现状分析) 这次课题的目的是在Android系统的手机开发平台之上,研究与开发一个记事本软件,提供适用手机的记事本功能服务 ...

  2. 计算机技术论文搜索引擎,垂直搜索引擎核心技术研究及展望论文

    垂直搜索引擎核心技术研究及展望论文 垂直搜索引擎与计算机领域多个方面的发展与应用息息相关,其关键技术更是促进计算机领域进一步发展的重要突破口.所以,对于垂直搜索引擎关键技术的研究具有十分重要的意义.我 ...

  3. 基于Lucene的搜索引擎的设计与实现

    我们处在一个大数据的时代,伴随着网络信息资源的庞大,人们越来越多地注重怎样才能快速有效地从海量的网络信息中,检索出自己需要的.潜在的.有价值的信息,从而可以有效地在日常工作和生活中发挥作用.因为搜索引 ...

  4. 基于HTML模拟系统自动报告生成技术的研究与开发[开题报告]

    开题报告   一.课题题目 基于 HTML 模拟系统自动报告生成技术的研究与开发 二.课题内容及任务要求 本课题的主要目的是自动生成HTML格式的分析报告文档: 1. 对华铸CAE数据可以自动获取 2 ...

  5. 基于java的搜索引擎系统设计与实现(项目报告+开题报告+答辩PPT+源代码+数据库+部署视频)

    项目报告 基于Java的搜索引擎的设计与实现 我们处在一个大数据的时代,伴随着网络信息资源的庞大,人们越来越多地注重怎样才能快速有效地从海量的网络信息中,检索出自己需要的.潜在的.有价值的信息,从而可 ...

  6. 基于飞桨与OpenVINO 的智能机器人开发实践 | 开发者实战

    谈到机器人,我们首先要知道什么是机器人 这是从百度百科截取的我国科学家对于机器人的定义 机器人是一种自动化的机器,这种机器人具备一些人或生物相似的智能能力,如感知能力.规划能力.动作能力.协同能力.是 ...

  7. 基于 React Native 的 58 同城 App 开发实践

    作者简介: 彭飞,58 同城 iOS 客户端架构师.专注于新技术的研发,主要负责 App 端组件化架构以及性能优化,并已推广 React Native 在 58 同城 App 中业务场景的应用.在 M ...

  8. 基于 Amazon CodeCommit 可规模化的敏捷开发实践

    GitHub和 GitLab 已经成为众多开发者非常熟悉的代码协作平台,大量企业正在通过它们参与开源项目或实施企业内部项目协作.目前被开发者广为熟知的 GitHub Pull Request协作流程是 ...

  9. 基于Android的聊天网络应用(安卓开发实验报告)

    ** 安卓开发实验及其报告(基于Android的聊天网络应用) ** 实验一 手机联系人管理 教学目标 了解安卓手机联系人的数据库:掌握安卓手机联系人信息的读取.添加.删除. 教学内容 手机通讯录管理 ...

最新文章

  1. 通俗理解条件熵-数学
  2. hive lock命令的使用
  3. reset_index(drop=True)
  4. 十三、面向对象程序设计
  5. mysql从库夯住_MySQL从库维护经验分享
  6. ip跳转跟踪命令_在跟踪命令(-T272)的帮助下学习避免身份跳转问题(IDENTITY_CACHE)
  7. Git1天打卡 day13-查看仓库文件改动状态
  8. Webbench学习笔记一:源码获取和使用
  9. 如何使用Movavi Slideshow Maker创建幻灯片
  10. 2018注册测绘师各地报名时间和注意事项!莫错过哦!
  11. 《Adobe Photoshop CS5中文版经典教程(全彩版)》—第1课1.1节开始在Adobe Photoshop中工作...
  12. 850是什么意思_850是什么意思
  13. 乔布斯2005的演讲
  14. html书写表单laber,laber(labelhood是什么意思)
  15. centos7是linux内核,在CentOS 7上用源代码编译最新的Linux内核
  16. Halide学习笔记----Halide tutorial源码阅读3
  17. 哪些APP需要做ASO优化?
  18. Android开发——如何解决三方库中的类名冲突问题
  19. python模拟银行存取款_python 模拟银行转账功能过程详解
  20. 这里需要一个高端大气上档次的开头

热门文章

  1. Ti IMGLIB库简介
  2. dhcp服务器响应慢,开机显示DHCP,速度很慢,为什么
  3. HTML5画布谐振子
  4. ERROR:Session/line number was not unique in database. History logging moved to new session.
  5. PHP ajax 远程下载PDF文件保存在本地服务器
  6. C - Survive the flood URAL - 2113
  7. JavaScript前世今生
  8. 2017 未来科学大奖揭晓:施一公、潘建伟、许晨阳获奖
  9. php asoft 排序,卓象科技:PHP算法之归并排序
  10. 用C++打开指定网址