搜索引擎的设计与实现(三)

目录

5 系统详细实现

5.1实现环境配置

5.2功能实现

5.2.1  建立索引

5.2.2  文件搜索实现

 5.2.3  数据库的连接配置

 5.2.4  数据库搜索实现

5.2.5  后台数据编辑实现


前面内容请移步

搜索引擎的设计与实现(二)

免费源代码&毕业设计论文

搜索引擎的设计与实现

5 系统详细实现

5.1实现环境配置

        因为我所选择的搜索引擎是基于Lucene的,所以需要利用Lucene的一些jar包,这样才能借助Lucene完成我们自己想要的搜索功能,并且为了实现分词,我们还需要引用分词组件的相关类库,具体的引用类库如图5-1所示:

图 5-1 Lucene配置

5.2功能实现

5.2.1  建立索引

        Lucene对数据的检索是在索引文件中查找的,可能会有人问为什么不直接在数据中检索呢?一个是数据库检索要实现全文检索,实现分词是相当困难的,而且,如果数据量小只有几百几千倒是可以考虑用数据库检索。把数据从数据库里读取出来,写入索引文件的时候是一条一条记录的写入的。

        由于Lucene只能替文本这一类型的数据组建索引,所以为了进行其他类型的数据进行检索,只能把其他的格式的数据用文本类型的替换,这样就可以进行索引、搜索了。如果需要对HTML文档进行索引的话,你就首先需要利用文本格式把 HTML文档替换,随后才可以将转化的结果输入 Lucene进行索引与检索,接着就会创建一份索引文件,我们需要把它保存到存储器里面,最终通过判断用户在UI界面输入的查询请求,从建立好的索引文件中查找。

        实现代码:

 

/**   
* 为数据库检索数据创建索引   
* @param rs   
* @throws Exception   
*/    
    private void createIndex(ResultSet rs) throws Exception {     
        Directory directory = null;     
        IndexWriter indexWriter = null;     
         
        try {     
            indexFile = new File(searchDir);     
            if(!indexFile.exists()) {     
                indexFile.mkdir();     
            }     
            directory = FSDirectory.open(indexFile);     
            analyzer = new IKAnalyzer();     
              
            indexWriter = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);     
            indexWriter.setMaxBufferedDocs(maxBufferedDocs);     
            Document doc = null;     
            while(rs.next()) {     
                doc = new Document();     
                Field id = new Field("id", String.valueOf(rs.getInt("id")), Field.Store.YES, Field.Index.NOT_ANALYZED, TermVector.NO);     
              
               // Field title = new Field("title", rs.getString("title") == null ? "" : rs.getString("title"), Field.Store.YES,Field.Index.ANALYZED, TermVector.NO);  
                Field content = new Field("content", rs.getString("content") == null ? "" : rs.getString("content"), Field.Store.YES,Field.Index.ANALYZED, TermVector.NO);   
                doc.add(id);     
            
                doc.add(content);     
                indexWriter.addDocument(doc);     
            }                              
            indexWriter.optimize();     
            indexWriter.close();     
        } catch(Exception e) {     
            e.printStackTrace();     
        }      
    }  

5.2.2  文件搜索实现

        文件搜索首先需在设置系统一个搜索文件夹,然后把待搜索的文件放到该文件夹下面,接着输入关键字即可搜索,本系统目前支持搜索的文件格式包括.txt、.doc、.xls和.ppt.

        在文件搜索之前需要建立索引,在建立索引的时候对性能影响最大的地方就是在将索引写入文件的时候, 所以在具体应用的时候就需要对此加以控制[4].

        在读取文件夹下的文件时,我们是通过FileInputStream对象来完成这一操作的,该对象只需要有一个参数就可以啦,这个参数就是文件的存储路径,如果我们使用FileInputStream来读取文件的话,我们还需要通过利用BufferedReader对象,把文件转换成Buffered的形式存放,最后我们通过IndexSearcher对象来实现文件的搜索:

        实现代码:

 

IndexWriter iwriter = new IndexWriter(directory, analyzer, true,
					IndexWriter.MaxFieldLength.LIMITED);
			iwriter.setMaxFieldLength(25000);
			// Lucene是不可以对除Document文件以外的文件建立索引的,Document只是一个假设文件
			while ((a = br.readLine()) != null) {
				Document doc = new Document();
				doc.add(new Field(fieldName, a, Field.Store.YES,
						Field.Index.ANALYZED));
				iwriter.addDocument(doc);
			}
			// Field.Store.YES:为该Field值创建索引
			// Field.Index.TOKENIZED:索引Field的值,使它能够被查到
			// Field 对象是用来描述一个文档的某个属性的
			iwriter.close();
			// 索引对象
			IndexSearcher isearcher = new IndexSearcher(directory, true);
			QueryParser parser = new QueryParser(Version.LUCENE_29, fieldName,analyzer);

图5-2 文件搜索效果图

 5.2.3  数据库的连接配置

        相关代码:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			String	url=	"jdbc:sqlserver://localhost:1433; 				DatabaseName=LuceneDB2";
			String username = "qian";
			String password = "wqian";
			con = DriverManager.getConnection(url, username, password);

 5.2.4  数据库搜索实现

        本模块解决了数据库快速搜索的问题,这个问题其实与文件搜索的原理一样,第一步都是需要创建索引的,当文档的索引创建好之后,就能够进行搜索的任务了。

        相关代码:

// 执行sql语句增删改
	public int updateExecute(String sql) {
		int result = 0;
		try {
			Connection con = getConnection();
			Statement sta = con.createStatement();
			result = sta.executeUpdate(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}

	// 执行sql查询语句 返回一个ResultSet
	public  ResultSet queryExectue(String sql) {
		ResultSet rs = null;
		try {
			Connection con = getConnection();
			Statement sta = con.createStatement();
			rs = sta.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rs;
	}
	public  String executeScalar(String sql) {
		ResultSet rs = queryExectue(sql);
		String s = "";
		try {
			while (rs.next()) {
				s = rs.getString(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return s;
	}

        这个时候,在前端页面上的用户提交一个关键字的查询请求,而后这个请求将会被自动进行分析处理。最终,系统会将用户的查询指令传输到后台中,并且把检索到的信息资源进行返回,前台一般为显示器,会将检索到的信息进行显示: 

图5-3 检索结果显示图

5.2.5  后台数据编辑实现

管理员可以点击页面的“登录”链接到管理员登录页面,用户在登录页面输入账号和密码即可登录系统,登录后用户可以看到目前系统所有数据,同时也可以修改或者删除任何一条数据可以通过标题来搜索自己想看的数据,也可以通过添加按钮来添加新的数据:

 

图5-4 后台登录界面 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/626019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM基于DWT实现硬件延时(GD32)

软件延时的缺点 软件延时的精度差&#xff0c;受系统主频影响&#xff0c;调教困难 硬件延时 DWT数据跟踪监视点单元硬件延时 硬件延时实现代码 delay.c #include <stdint.h> #include "gd32f30x.h"/** *****************************************************…

搜索引擎的设计与实现(四)

目录 6 系统测试 6.1测试重要性 6.2测试用例 结 论 参 考 文 献 前面内容请移步 搜索引擎的设计与实现&#xff08;三&#xff09; 免费源代码&毕业设计论文 搜索引擎的设计与实现 6 系统测试 6.1测试重要性 该项目是在本地服务器上进行运行和调试&#xff0c;…

BOM部分

一&#xff0c;概述 二&#xff0c;Windows对象常见的事件 1.窗口加载事件 上面那个是会等页面都加载完了&#xff0c;在进行函数的调用或者触发事件&#xff0c;如&#xff08;图像&#xff0c;文本&#xff0c;css&#xff0c;js等&#xff09;&#xff0c;所以那个声明可以…

Llama 3 超级课堂 -笔记

课程文档&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频&#xff1a;https://space.bilibili.com/3546636263360696/channel/series 1 环境配置 1.1 创建虚拟环境,名为&#xff1a;llama3 conda create -n llama3 python3.10 1.2 下载、安装 pyt…

ASP.NET邮件收发程序的设计与开发

摘 要 《邮件收发程序的设计与开发》是一个综合性的程序设计&#xff0c;涉及到界面、系统、数据库、协议、编码等多个方面的内容。本设计前台采用.NET技术,后台数据库采用SQL Server 2000&#xff0c;语言采用C#&#xff0c;主要讲述了邮件系统的注册、登陆、管理、发送和…

C. Sort Zero

题目描述 思路分析: 记住他是要保证这个数列是不降的,也就是说如果某一个位置上的数变成了0,那么这个数前面的部分一定全都是0了,我们用map数组得到每一个数出现的最晚的位置,先从后向前遍历一遍,找出从哪开始出现了递减,然后标记下来结束即可,看看前面的每一个数都要用st标记是…

[笔试训练](二十二)064:添加字符065:数组变换066:装箱问题

目录 064:添加字符 065:数组变换 066:装箱问题 064:添加字符 添加字符_牛客笔试题_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 枚举所有A&#xff0c;B字符串可能的对应位置&#xff0c;得出对应位置不同字符数量的最小情况 两字符串的字符数量差n-m&…

【C++】string|迭代器iterator|getline|find

目录 ​编辑 string 1.string与char* 的区别 2.string的使用 字符串遍历 利用迭代器遍历 范围for遍历 反向迭代器 字符串capacity 字符串插入操作 push_back函数 append函数 运算符 ​编辑 insert函数 substr函数 字符串查找函数 find函数 rfind函数 …

Diffusion Inversion技术

Diffusion Inversion技术 在图像生成/编辑领域中&#xff0c;Inversion 技术是指将一张&#xff08;真实&#xff09;图片转换为生成模型对应的 latent&#xff0c;要求将这个 latent 输入到生成模型中之后&#xff0c;能够重构出原始图片。这项技术是进行图像编辑的重要基础。…

四川汇聚荣:拼多多开店流程分享

随着电商行业的蓬勃发展&#xff0c;越来趀多的创业者选择在线上平台开设店铺。其中&#xff0c;拼多多以其独特的团购模式和巨大的用户基数成为众多商家的新宠。但对于初次涉足的商家而言&#xff0c;如何正确高效地开设一家拼多多店铺&#xff0c;无疑是他们迫切需要解决的难…

Windows安装Linux子系统

WSL 是 Windows Subsystem for Linux 的简称&#xff0c;意思是 linux 版的 window 子系统。适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。 Linux 分发版可以在…

下单制造fpc的工艺参数

FPC工艺简介 - 百度文库 (baidu.com) FPC工艺参数 - 豆丁网 (docin.com) FPC柔性线路板的主要参数.ppt (book118.com) 捷多邦&#xff1a; 华秋&#xff1a; 背胶&#xff1a; FPC板背胶是可以粘接在光滑表面的一种薄型胶带&#xff0c;可以在狭小以及光滑的表面上用来提供高…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏&#xff0c;先jadx分析一波 没有什么关键信息&#xff0c;但找到了一个unity类&#xff0c;想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息&#xff0c;看wp&#xff1a; Asse…

深入理解K8S【安全认证机制kubectlconfig】

深入理解K8S【安全认证机制】 1 核心概念 1.1 安全体系 对于大型系统来说&#xff0c;对业务的权限、网络的安全认证是必不可少的。 对于linux系统来说&#xff0c;用户和组、文件权限、SELinux、防火墙、pam、sudo等&#xff0c;究其核心的目的都是为了保证系统是安全的。 …

Charger之三动态电源路径管理(DPPM)

-----本文简介----- 主要内容包括&#xff1a; 领资料&#xff1a;点下方↓名片关注回复&#xff1a;粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理&#xff08;DPPM&#xff09; 前篇内容&#xff1a;①电池管理IC&#xff08;Charger&#xff09;了解一下&…

过滤器Filter和拦截器Interceptor实现登录校验

一.过滤器 Filter过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些登录验证的功能 1.Filter的快速入门 1.定义Filter:定义一个类&#xff0c;实现Filter接口&#xff0c;并重写其所有方法。2.配置 public class dofilter implements Filter {Override //初始化只…

汇聚荣电商:拼多多开店需要多少费用?

想要在拼多多这个巨大的电商平台上开一家属于自己的店铺&#xff0c;很多创业者都会关心一个问题&#xff1a;开店需要多少费用?答案并不复杂&#xff0c;但背后的经营哲学和策略却值得深究。接下来&#xff0c;让我们从四个不同的方面来详细探讨这个问题。 一、开店成本分析 …

【教程】Linux/Jetson 安装X11VNC同步屏幕内容

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 目录 背景说明 实际效果 安装步骤 安装 x11vnc 配置 x11vnc 配置 x11vnc 作为系统服务 使用 VNC 客户端连接 背景说明 通常vnc-server是单…

汇昌联信电商:拼多多网店好做吗?

在电子商务的海洋中&#xff0c;拼多多以其独特的团购模式和亲民策略迅速崛起&#xff0c;吸引了大批消费者和商家的目光。对于“拼多多网店好做吗?”这个问题&#xff0c;答案并非简单的是与否&#xff0c;而是需要从多个维度进行深入分析。 一、市场定位与竞争环境 拼多多定…

基于STM32F401RET6智能锁项目(BS82166A_3触摸按键)

一、BS81x 特征 • 工作电压&#xff1a;2.2V~5.5V • 低待机电流 • 自动校准功能 • 可靠的触摸按键检测 • 自动切换待机 / 工作模式 • 最长按键输出时间检测 • 具备抗电压波动功能 • Level Hold&#xff0c;可选高有效或低有效 • NMOS 输出内建上拉电阻 /CMOS 直接 输出…