目錄
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 后臺登錄界面?