快速學習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();      }