搜索引擎的設計與實現(三)

目錄

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.pswp.cn/diannao/12315.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12315.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12315.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git-刪除workspace.xml的跟蹤

問題描述 .gitignore 文件內容如下: .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

NARUTO 復現記錄

1 環境配置 下載項目,一定要 git 下載全項目,下載完后要檢查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 環境配置 注意 bash scripts/installation/conda…

番外篇 | 利用PyQt5+YOLOv5來搭建目標檢測系統(附可視化界面+功能介紹+源代碼)

前言:Hello大家好,我是小哥談。PyQt5是一個Python綁定的Qt庫,是用于創建圖形用戶界面(GUI)和其他應用程序組件的工具包。PyQt5提供了許多GUI元素,如按鈕、文本框、標簽等,也提供了許多Qt的功能,如網絡、數據庫、XML等。通過PyQt5可以在Python中使用Qt的豐富功能和強大的工…

克服虧損的負面影響 學學現貨白銀止損的方法

一個多月以前,現貨黃金的上漲還十分強勁,一度還逼近歷史的高位30大關。但是我們看近半個月以來,現貨白銀價格出現了調整。很多在高位買入的投資者都承受了較大的虧損,這時候就凸顯出了現貨白銀止損的作用。如果投資者能夠通過近期…

Git 基礎使用(2) 分支管理

文章目錄 分支概念分支使用查看分支分支創建分支切換分支合并合并沖突分支刪除 分支管理快進模式分支策略內容保存錯誤處理 分支概念 (1)分支概念 Git分支是指在版本控制系統Git中,用來表示項目的不同工作流程或開發路徑的一個重要概念。通過…

【cmake】Windows 環境下編譯第三方依賴源碼(以編譯Xerces庫為例)

第三方依賴源碼的編譯分為兩種,一種是使用 Configure 腳本編譯,另一種是使用 CMakeLists.txt 編譯。Xerces 3.2.3 的編譯方式是 CMakeLists.txt 腳本編譯。 必要軟件: CMake (CMake | Download)Visual Studio 2019&a…

前端AJAX講解

目錄 1.AJAX是什么? 2.異步交互和同步交互 3.AJAX常見應用情景和優缺點 4.AJAX的優缺點 5.AJAX發送異步請求(四步操作) 6.經典案例 1.AJAX是什么? AJAX即“Asynchronous JavaScript and XML”(異步的JavaScript與…

指針基礎實踐

文章目錄 1.聲明指針2.初始化指針3.指針地址和大小,值4.指針解引用,修改值5.指針指向堆內存,修改值6.申請堆內存并釋放7.數組釋放8.指針運算9.指針遞增10.指針遞減11.指針常量12.常量指針13.常量指針指向常量 1.聲明指針 2.初始化指針 3.指針地址和大小…

【數據結構】二叉樹(Binary Tree)

文章目錄 一、樹的概念及結構二、二叉樹的概念及結構1.二叉樹的概念2.特殊的二叉樹3.二叉樹的性質 三、二叉樹的存儲順序存儲鏈式存儲 四、二叉樹的實現1.創建二叉樹2.二叉樹的遍歷前序遍歷中序遍歷后序遍歷層序遍歷根據遍歷順序創建二叉樹 3.二叉樹的基本操作1.總結點個數2.二…

ctfshow之_萌新web9至web10

一、訪問在線靶場ctfshow 1、web9 如下圖所示,進入_萌新賽的web9問題,題目提醒flag在config.php中: 如上圖所示,可以get傳參,且傳入的參數需要正則匹配system、exec、highlight,且不區分大小寫&#xff0…

C++設計模式|創建型 5.原型模式

1.什么是原型模式? 原型模式?種創建型設計模式,該模式的核?思想是基于現有的對象創建新的對象,?不是從頭開始創建。 在原型模式中,通常有?個原型對象,它被?作創建新對象的模板。新對象通過復制原型對象的屬性和狀…

Mac IDEA 自動補全mybatis sql語句

導航 Mac IDEA 自動補全mybatis sql語句一、點擊IDEA 右側Database選項二、選擇添加對應數據庫三、輸入數據庫信息和方案四、輸入數據庫信息和方案五、成功 Mac IDEA 自動補全mybatis sql語句 背景: 想在Mapper中,能夠實現自動檢索數據庫表和對應的字段…

QT日志類SimpleQtLogger的簡單記錄

在現代軟件開發中,日志記錄是必不可少的部分。它不僅幫助開發者在調試和維護軟件時了解程序的運行狀態,還能提供關鍵的錯誤信息。對于使用Qt框架開發應用程序的開發者來說,選擇一個合適的日志庫至關重要。本文將詳細介紹Qt日志庫SimpleQtLogg…

web前端之sass中的顏色函數、active按鈕激活、hover鼠標懸浮、disabled禁用、scss循環、css

MENU 效果圖htmlsassscss編譯后的css頁面css 效果圖 注意查看藍色按鈕。 html <div class"box"><button class"btn type_1">按鈕</button><button class"btn type_2">按鈕</button><button class"btn ty…

一文讀懂通用漏洞評分系統CVSS4.0:順帶理清CVE、CWE及其與CVSS之間的關系

事件響應和安全團隊論壇 (FIRST&#xff0c;Forum of Incident Response and Security Teams) 于 2023 年 11 月 1 日正式推出第四版通用漏洞評分系統 (CVSS 4.0&#xff0c;Common Vulnerability Scoring System version 4.0)。CVSS 4.0 是評估計算機系統安全漏洞嚴重性的行業…

C++ 多態性

一 多態性的分類 編譯時的多態 函數重載 運算符重載 運行時的多態 虛函數 1 運算符重載的引入 使用C編寫程序時&#xff0c;我們不僅要使用基本數據類型&#xff0c;還要設計新的數據類型-------類類型。 一般情況下&#xff0c;基本數據類型的運算都是運算符來表達&#x…

【C++】詳解C++的模板

目錄 概念 ?編輯 語法 函數模板 類模板 非類型模板參數 模板的特化 函數模板特化 類模板特化 全特化 偏特化 分離編譯 概念 模板是C中非常厲害的設計&#xff0c;模板把通用的邏輯剝離出來&#xff0c;讓不同的數據類型可以復用同一種模板的邏輯&#xff0c;甚至可以…

Flutter 中的 DataTable 小部件:全面指南

Flutter 中的 DataTable 小部件&#xff1a;全面指南 在Flutter的Material組件庫中&#xff0c;DataTable是一個用于展示數據的表格組件&#xff0c;它允許開發者以一種結構化和可滾動的方式展示數據集。DataTable非常適合展示詳細信息&#xff0c;如表格數據、統計數據或配置…

PHP黑魔法之md5繞過

php本身是一種弱語言,這個特性決定了它的兩個特點: 輸入的參數都是當作字符串處理變量類型不需要聲明,大部分時候都是通過函數進行類型轉化php中的判斷有兩種: 松散比較:只需要值相同即可,類型不必相同,不通類型比較會先轉化為同類型,比如全數字字符串和數字比較,會比…

凸優化理論學習三|凸優化問題(一)

系列文章目錄 凸優化理論學習一|最優化及凸集的基本概念 凸優化理論學習二|凸函數及其相關概念 文章目錄 系列文章目錄一、優化問題&#xff08;一&#xff09;標準形式的優化問題&#xff08;二&#xff09;可行點和最優點&#xff08;三&#xff09;局部最優點&#xff08;四…