快速學習Lucene-Lucene入門程式
- 2019 年 12 月 25 日
- 筆記
需求
實現一個文件的搜索功能,通過關鍵字搜索文件,凡是文件名或文件內容包括關鍵字的文件都需要找出來。還可以根據中文詞語進行查詢,並且需要支援多個條件查詢。 本案例中的原始內容就是磁碟上的文件,如下圖:

實現步驟
第一步:創建一個java工程,並導入jar包。 第二步:創建一個indexwriter對象。
- 1)指定索引庫的存放位置Directory對象
- 2)指定一個IndexWriterConfig對象。
第三步:創建document對象。 第四步:創建field對象,將field添加到document對象中。 第五步:使用indexwriter對象將document對象寫入索引庫,此過程進行索引創建。並將索引和document對象寫入索引庫。 第六步:關閉IndexWriter對象。
程式碼示例
@Test public void createIndex() throws Exception { //指定索引庫存放的路徑 //D:tempindex Directory directory = FSDirectory.open(new File("D:\temp\index").toPath()); //索引庫還可以存放到記憶體中 //Directory directory = new RAMDirectory(); //創建indexwriterCofig對象 IndexWriterConfig config = new IndexWriterConfig(); //創建indexwriter對象 IndexWriter indexWriter = new IndexWriter(directory, config); //原始文檔的路徑 File dir = new File("D:\temp\searchsource"); for (File f : dir.listFiles()) { //文件名 String fileName = f.getName(); //文件內容 String fileContent = FileUtils.readFileToString(f); //文件路徑 String filePath = f.getPath(); //文件的大小 long fileSize = FileUtils.sizeOf(f); //創建文件名域 //第一個參數:域的名稱 //第二個參數:域的內容 //第三個參數:是否存儲 Field fileNameField = new TextField("filename", fileName, Field.Store.YES); //文件內容域 Field fileContentField = new TextField("content", fileContent, Field.Store.YES); //文件路徑域(不分析、不索引、只存儲) Field filePathField = new TextField("path", filePath, Field.Store.YES); //文件大小域 Field fileSizeField = new TextField("size", fileSize + "", Field.Store.YES); //創建document對象 Document document = new Document(); document.add(fileNameField); document.add(fileContentField); document.add(filePathField); document.add(fileSizeField); //創建索引,並寫入索引庫 indexWriter.addDocument(document); } //關閉indexwriter indexWriter.close(); }
使用Luke工具查看索引文件

我們使用的luke的版本是luke-7.4.0,跟lucene的版本對應的。可以打開7.4.0版本的lucene創建的索引庫。需要注意的是此版本的Luke是jdk9編譯的,所以要想運行此工具還需要jdk9才可以。
實現步驟
第一步:創建一個Directory對象,也就是索引庫存放的位置。 第二步:創建一個indexReader對象,需要指定Directory對象。 第三步:創建一個indexsearcher對象,需要指定IndexReader對象 第四步:創建一個TermQuery對象,指定查詢的域和查詢的關鍵詞。 第五步:執行查詢。 第六步:返回查詢結果。遍歷查詢結果並輸出。 第七步:關閉IndexReader對象
//查詢索引庫 @Test public void searchIndex() throws Exception { //指定索引庫存放的路徑 //D:tempindex Directory directory = FSDirectory.open(new File("D:\temp\index").toPath()); //創建indexReader對象 IndexReader indexReader = DirectoryReader.open(directory); //創建indexsearcher對象 IndexSearcher indexSearcher = new IndexSearcher(indexReader); //創建查詢 Query query = new TermQuery(new Term("filename", "apache")); //執行查詢 //第一個參數是查詢對象,第二個參數是查詢結果返回的最大值 TopDocs topDocs = indexSearcher.search(query, 10); //查詢結果的總條數 System.out.println("查詢結果的總條數:"+ topDocs.totalHits); //遍歷查詢結果 //topDocs.scoreDocs存儲了document對象的id for (ScoreDoc scoreDoc : topDocs.scoreDocs) { //scoreDoc.doc屬性就是document對象的id //根據document的id找到document對象 Document document = indexSearcher.doc(scoreDoc.doc); System.out.println(document.get("filename")); //System.out.println(document.get("content")); System.out.println(document.get("path")); System.out.println(document.get("size")); System.out.println("-------------------------"); } //關閉indexreader對象 indexReader.close(); }