1. Lucene的下載java
Lucene是開發全文檢索功能的工具包,從官網下載Lucene4.10.3並解壓。spring
官網:http://lucene.apache.org/apache
版本:lucene7.7.0 (學習上不必最新的,由於企業中也不會升級太快)工具
Jdk要求:1.7以上學習
2.使用的jar包測試
核心包spa
其餘:code
3. 建立索引庫對象
(1) 實現步驟 (程序的編寫步驟與以前分析的理論步驟是顛倒過來的)blog
第一步:建立java工程,並導入jar包
第二步:建立一個indexwriter對象(建立索引)
1.指定索引庫的存放位置Directory對象
2.指定一個分析器,對文檔內容進行分析
第三步:建立document對象 (構建文檔對象)
第四步:建立field對象,將field添加到document
第五步:使用indexwriter對象將document對象寫到索引庫,此過程進行索引建立。並將索引和document對象寫入索引庫。
第六步:關閉IndexWriter對象
(2) Field域的屬性
是否分析:是否對域的內容進行分詞處理。前提是咱們要對域的內容進行查詢。
是否索引:將Field分析後的詞或整個Field值進行索引,只有索引方可搜索到。
好比:商品名稱,商品簡介分析後進行索引,訂單號,身份證號不用分析但也要索引,這些未來都要做爲查詢條件
是否存儲:將Field值存儲在文檔中,存儲在文檔中的Field才能夠從Document中獲取。
好比:商品名稱,訂單號,凡是未來要從Document中獲取的Field都要存儲
是否存儲的標準:是否將內容展現給用戶
測試代碼:
將下面的文件,建立成索引
代碼:
public class FirstLucene { @Test public void textIndex() throws Exception { // 第一步:建立java工程,並導入jar包 // 第二步:建立一個indexwriter對象(建立索引) // 1.指定索引庫的存放位置Directory對象 Directory directory = FSDirectory.open(Paths.get("E:\\temp\\index")); //文件系統目錄 file system directory // 2.指定一個分析器,對文檔內容進行分析 Analyzer analyzer = new StandardAnalyzer();//官方推薦分詞器 IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig); File f = new File("E:\\searchSource"); File[] listFiles = f.listFiles(); for (File file : listFiles) { // 第三步:建立document對象 (構建文檔對象) Document document = new Document(); // 第四步:建立field對象,將field添加到document //文件名稱 String file_name = file.getName(); Field fieldNameField = new TextField("fileName", file_name, Store.YES); //文件大小 long file_size = FileUtils.sizeOf(file); Field fileSizeField = new LongPoint("fileSize", file_size); Field fileSizeFieldStore = new StoredField("fileSize", file_size); //文件路徑 String file_path = file.getPath(); Field filePathField = new StoredField("filePath", file_path); //文件內容 String file_content = FileUtils.readFileToString(file); Field fileContentField = new TextField("fileContent", file_content, Store.NO); document.add(fieldNameField); document.add(fileSizeField); document.add(fileSizeFieldStore); document.add(filePathField); document.add(fileContentField); // 第五步:使用indexwriter對象將document對象寫到索引庫,此過程進行索引建立。並將索引和document對象寫入索引庫。 indexWriter.addDocument(document); } // 第六步:關閉IndexWriter對象 indexWriter.close(); } }
結果:
4.查詢索引
(1) 實現步驟:
第一步:建立一個Directory對象,也就是索引庫存放的位置
第二步:建立一個indexReader對象,須要制定Directory對象
第三步:建立一個indexsearcher對象,須要指定IndexReader對象
第四步:建立一個TermQuery對象,制定查詢的域和查詢的關鍵詞
第五步:執行查詢。
第六步:返回查詢結果,便利查詢結果並輸出
第七步:關閉IndexReader對象。
(2) IndexSearcher搜索方法
代碼:
@Test public void testSearch() throws Exception { // 第一步:建立一個Directory對象,也就是索引庫存放的位置 Directory directory = FSDirectory.open(Paths.get("E:\\temp\\index")); // 第二步:建立一個indexReader對象,須要指定Directory對象 IndexReader indexReader =DirectoryReader.open(directory); // 第三步:建立一個indexsearcher對象,須要指定IndexReader對象 IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 第四步:建立一個TermQuery對象,制定查詢的域和查詢的關鍵詞 Query query = new TermQuery(new Term("fileName", "spring")); // 第五步:執行查詢。 TopDocs topDocs = indexSearcher.search(query, 2); // 第六步:返回查詢結果,遍歷查詢結果並輸出 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDocs) { int doc = scoreDoc.doc; Document document = indexSearcher.doc(doc); //文件名稱 String fileName = document.get("fileName"); System.out.println(fileName); //文件內容 String fileContent = document.get("fileContent"); System.out.println(fileContent); //文件路徑 String fileSize = document.get("fileSize"); System.out.println(fileSize); //文件大小 String filePath = document.get("filePath"); System.out.println(filePath); System.out.println("---------"); } // 第七步:關閉IndexReader對象。 indexReader.close(); }
結果: