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

目录

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查询语句 返回一个ResultSetpublic  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.hqwc.cn/news/700879.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8.基于鱼鹰优化算法(OOA)优化VMD参数(OOA-VMD)

代码原理 鱼鹰优化算法(Osprey Optimization Algorithm, OOA)是一种基于仿生学原理的启发式优化算法,它模拟了鱼鹰觅食的行为,通过调整搜索空间中的个体位置来优化目标函数。 鱼鹰优化算法可参考:鱼鹰优化算法(Ospre…

企业运维背后的故事:TASKCTL带你了解日常工作与技术演进

今天,作为一名经验丰富、从业多年经常与运维人员打交道的人,我想与大家聊聊运维的日常工作、部门协调以及未来发展,希望能为即将转行或正在从事运维工作的你,提供一些新的视角和启发。 运维的日常工作:挑战与乐趣并存 …

ConfigError: Main class ‘XXX’ doesn’t exist in the workspace.Vscode

前言 唉,又是被Vscode折磨的一个晚上,本想好好写点代码的,却被一个个小问题搞得团团转,服了。 错误原因分析 正如标题所示,这是扩展“Java->debug”抛出的一个错误,意思是这个“XXX”主类不在工作区内…

【35分钟掌握金融风控策略27】贷中风控策略与客户运营体系

目录 贷中风控策略与客户运营体系 贷中风控日标 贷中风控数据源 贷中风控策略与客户运营体系 贷中是风控的第二道防线,贷中阶段风控的重点工作就是存量客户风控及运营。在当下,新客市场趋于饱和且获客成本越来越高,所以,在做好…

【Unity Shader入门精要 第7章】基础纹理补充内容:MipMap原理

1.纹理采样 我们对纹理采样进行显示的过程,可以理解为将屏幕上的一个像素(下文用像素表示)映射到纹理上的一个像素(下文用纹素表示),然后用纹理上的这个像素的颜色进行显示。 理想情况下,屏幕…

C++ 多态性

一 多态性的分类 编译时的多态 函数重载 运算符重载 运行时的多态 虚函数 1 运算符重载的引入 使用C编写程序时,我们不仅要使用基本数据类型,还要设计新的数据类型-------类类型。 一般情况下,基本数据类型的运算都是运算符来表达&#x…

弥合孤岛:克服构建 DevOps 文化的挑战

持续变革正在发生软件开发行业。DevOps 因其对自动化、协作和持续改进的关注而成为优化软件交付并弥合开发和运营团队之间鸿沟的重要方法。然而,过渡到真正的 DevOps 文化并非没有挑战。本文探讨了您在追求 DevOps 时可能面临的障碍并提供了解决方案。 01 了解 Dev…

听说SOLIDWORKS科研版可以节约研发成本?

近几年来,政府越来越重视科研带动产业,绩效优良的产业技术研究院对于国家和地区的学术成果转化、技术创新、产业发展等具有不可忽视的促进和带动作用。研究院会承担众多新产业的基础研究工作,而常规的基础研究需要长期的积累,每个…

探讨 cs2019 c++ 的STL 库中的模板 conjunction 与 disjunction

(1)在 STL 库源码中这俩模板经常出现,用来给源码编译中的条件选择,模板的版本选择等提供依据。先给出其定义: 以及: 可以得出结论: conj 是为了查找逻辑布尔型模板参数中的第一个 false &#x…

RK3566(泰山派):GP7101背光驱动

RK3566(泰山派):GP7101背光驱动 文章目录 RK3566(泰山派):GP7101背光驱动GP7101背光驱动电路配置i2c1设备树创建驱动编写Makefilegp7101_bl.c驱动触摸I2C驱动框架。驱动中的结构体probe函数devm_backlight_…

DHCP原理

什么是DHCP DHCP (Dynamic Host Configuration Protocol,动态主机配置协议)是由Internet工作任务小组设计开发的,专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议,是一个应用层协议,使用UDP的67和68端口。 DHCP的前身是B…

CUDA backend requires cuDNN. Please resolve dependency or disable的解决方法

先把 C:\Program Files\NVIDIA\CUDNN\v9.0里面的bin,include,lib文件夹中最里面的文件 复制到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4中的bin,include,lib文件夹 你的路径或许有点不一样,但大概就是这样 注意,复制完后,文…