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

news2024/11/19 9:39:14

目录

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 后台登录界面 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vaspkit 画 Charge-Density Difference

(echo 314;echo $(cat 1))|vaspkit 文件1提前写好使用的CHGCAR路径 SPIN_DW.vasp ../ML2scf/SPIN_DW.vasp ../ML1scf/SPIN_DW.vasp POSite and negative 默认为blue,and 青色 (RGB 30 245 245) 正值:blue 。负值:青色 RGB 30 245 245。 提示&…

(四十二)第 6 章 树和二叉树(树的二叉链表(孩子-兄弟)存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

Nodejs笔记2

模块化 模块化初体验 模块暴露数据 导入模块 fs 写绝对路径 require写相对路径不会受到影响 ./../不能省略 js 和json文件后缀可以省略 如果存在 命名相同的js和json文件&#xff0c;优先导入js文件 导入文件夹时的情况 require导入模块的基本流程 commonJS模块…

大数据可视化实验(四):Excel数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;excel函数应用.. 1 2&#xff09;数据透视图绘制... 3 四、总结与心得体会... 5 一、实验目的 1&#xff09;掌握函数和公式的原理 2&#xff09;掌握在单元格或编辑栏中直接输入带函数的公式…

react18【系列实用教程】react-router-dom —— 路由管理 (2024最新版)

类似 vue-router 安装 npm i react-router-domreact-router 中包含 native 的开发&#xff0c;仅网站开发&#xff0c;使用更轻量的 react-router-dom 即可 路由模式 history 模式需要后端支持&#xff0c;使用 createBrowserRouter 函数实现hash 模式无需后端支持&#xff0c;…

TypeScript学习日志-第二十六天(weakMap,weakSet,set,map)

weakMap,weakSet,set,map 一、set set 的基本用法如下&#xff1a; 二、map map 与 set 的 区别 就是 map 的 key 可以是引用类型 object array , map 的添加时使用 set 三、weakmap weakset weakmap和weakset 都是弱项 弱引用 其键必须是引用类型&#xff0c;不能是其它类…

RT Thread + CLion环境搭建

RT Thread CLion环境搭建 0.前言一、准备工具1. Env RT Thread v5.12.CLion安装3.编译及下载工具 二、新建Env工程三、CLion配置四、运行测试 0.前言 事情的起因是最近在使用RT Thread Studio时&#xff0c;发现默认的 rtt 内核版本及交叉编译链版本都过于陈旧&#xff0c;于…

【基本数据结构】链表

文章目录 前言链表简介头节点与尾节点特性 分类单向链表双向链表循环链表 单链表基本操作定义并初始化单链表读取节点插入节点删除节点修改节点 参考资料写在最后 前言 本系列专注更新基本数据结构&#xff0c;现有以下文章&#xff1a; 【算法与数据结构】数组. 【算法与数…

软件工程期末复习(6)需求分析的任务

需求分析 需求分析的任务 “建造一个软件系统的最困难的部分是决定要建造什么……没有别的工作在做错时会如此影响最终系统&#xff0c;没有别的工作比以后矫正更困难。” —— Fred Brooks 需求难以建立的原因&#x…

CAN模块开发问题概述

问题一 问题描述 工作环境&#xff1a;ECU外接canoe 操作&#xff1a;使用CANoe模拟发送NM报文&#xff0c;然后停发或者断开CANoe 现象&#xff1a;程序跑死&#xff0c;调用call stack查看压栈情况如下图所示 定位代码如下图所示。可见是由于CAN模块在设置Controller状态时…

tomcat--目录结构和文件组成

目录结构 目录说明bin服务启动&#xff0c;停止等相关程序和文件conf配置文件lib库目录logs日志记录webapps应用程序&#xff0c;应用部署目录workjsp编译后的结果文件&#xff0c;建议提前预热访问 /usr/local/apache-tomcat-8.5.100/work/Catalina/localhost/ROOT/org/apac…

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

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

Hadoop 3.4.0+HBase2.5.8+ZooKeeper3.8.4+Hive+Sqoop 分布式高可用集群部署安装 大数据系列二

创建服务器,参考 虚拟机创建服务器 节点名字节点IP系统版本master11192.168.50.11centos 8.5slave12192.168.50.12centos 8.5slave13192.168.50.13centos 8.5 1 下载组件 Hadoop:官网地址 Hbase:官网地址 ZooKeeper:官网下载 Hive:官网下载 Sqoop:官网下载 为方便同学…

【已解决】力扣打不开

表现&#xff1a; 1.访问国内其他网站都没有问题 2.访问github也能成功 3.wifi没有问题 4.连接同网络的其他主机能打开 唯独力扣打不开&#xff0c;可能是DNS解析错误 》自己网络配置问题 解决办法【亲测可行】 找可用的hosts 打开站长之家&#xff0c;进行DNS查询&#xff…

FreeRTOS事件标志组

目录 一、事件标志组的概念 1、事件标志位 2、事件标志组 二、事件标志组相关API 1、创建事件标志组 2、设置事件标志位 3、清除事件标志位 4、等待事件标志位 三、事件标志组实操 1、实验需求 2、CubeMX配置 3、代码实现 一、事件标志组的概念 1、事件标志位 表…

128.Mit6.S081-实验1-Xv6 and Unix utilities(下)

今天我们继续实验一接下来的内容。 一、pingpong(难度easy) 1.需求 编写一个程序&#xff0c;使用 UNIX 系统调用通过一对管道(每个方向一个管道)在两个进程之间 "ping-pong" 传递一个字节。父进程应该向子进程发送一个字节; 子进程应该打印<pid>: received p…

短视频语音合成:成都鼎茂宏升文化传媒公司

短视频语音合成&#xff1a;技术革新与创意融合的新篇章 随着科技的飞速发展&#xff0c;短视频已经成为人们生活中不可或缺的一部分。在这个快速变化的时代&#xff0c;短视频语音合成技术正逐渐崭露头角&#xff0c;以其独特的魅力和广泛的应用前景&#xff0c;吸引了众多创…

R语言:ROC分析

> install.packages("pROC") > library(pROC) > inputFile"结果.txt" > rtread.table(inputFile, headerT, sep"\t", check.namesF, row.names1) > head(rt) con treat TCGA-E2-A1L7-11A-con…

6. 第K小的和-二分

6.第K小的和 - 蓝桥云课 (lanqiao.cn) #include <bits/stdc.h> #define int long long #define endl \n using namespace std; int n,m,k,an[100005],bm[100005]; int check(int x){int res0;//序列C中<x的数的个数for(int i0;i<n;i){//遍历数组A&#xff0c;对于每…

怎么得到所有大写字母/小写字母组成的字符串

有时候&#xff0c;可能需要获取a~z、A~Z组成的26个字母的字符串&#xff0c;这篇文章介绍一种简单的方法。 只需要几句简单到不能再简单的代码&#xff01;你不会还在傻傻地一个个字母敲吧~ /*** author heyunlin* version 1.0*/ public class Example {/*** 小写字母*/priv…