摘自百科:Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此爲基礎創建起完整的全文檢索引擎。Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。Lucene提供了一個簡單卻強大的應用程式接口,可以作全文索引和搜尋。 java
建立Directory apache
建立IndexWriter 架構
建立Document對象 eclipse
爲Document添加Field maven
經過IndexWriter添加文檔到索引中 工具
關閉IndexWriter 測試
建立Directory spa
建立IndexReader 開放源代碼
根據IndexReader建立IndexSearcher code
建立搜索的Query
根據searcher搜索並返回TopDocs
根據topDocs獲取ScoreDoc對象
根據searcher和StoreDoc對象獲取具體的Document對象
根據Document對象獲取須要的值
關閉IndexReader
說明:該例子採用lucene5.3,主要功能就是在硬盤上的3個txt文件裏面找到你查詢的字符,並打印出文件名和文件路徑.
首先,在個人電腦D盤,建立一個文件夾,用來保存lucene檢索的文件的地方.而後建立3個文件用來存放字符串,a.txt,b.txt,c.txt,裏面分別錄入一些字符.下面是個人例子中的圖:
接着,咱們打開eclipse建立一個maven項目.加入lucene和junit的依賴jar
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>5.3.1</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>5.3.1</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>5.3.1</version> </dependency> </dependencies>
package com.kkrgwbj.demolucene; import java.io.File; import java.io.FileReader; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.NoLockFactory; public class HelloLucene { /** * 創建索引 */ public void index() { // 1.建立Directory Directory directory = null; try { directory = FSDirectory.open(new File("D:/workspace/lucene/index01").toPath(), NoLockFactory.INSTANCE);// 創建在硬盤 // directory = new RAMDirectory();//創建在內存中 } catch (IOException e1) { e1.printStackTrace(); } // 2.建立IndexWriter IndexWriterConfig ic = new IndexWriterConfig(new StandardAnalyzer()); IndexWriter iw = null; try { iw = new IndexWriter(directory, ic); } catch (IOException e1) { e1.printStackTrace(); } try { // 3.建立Document對象 Document doc = null; // 4.爲Document添加Field File f = new File("D:/workspace/lucene"); for (File item : f.listFiles()) { if (item.isDirectory()) { continue; } doc = new Document(); doc.getFields().add(new TextField("content", new FileReader(item))); doc.getFields().add(new TextField("filename", item.getName(), Field.Store.YES)); doc.getFields().add(new TextField("path", item.getAbsolutePath(), Field.Store.YES)); // 5.經過IndexWriter添加文檔到索引中 iw.addDocument(doc); } } catch (IOException e) { e.printStackTrace(); } finally { // 關閉 if (iw != null) try { iw.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 搜索 */ public void searcher() { // 1.建立Directory Directory directory = null; IndexReader ir = null; try { directory = FSDirectory.open(new File("D:/workspace/lucene/index01").toPath());// 創建在硬盤 // directory = new RAMDirectory();//創建在內存中 // 2.建立IndexReader ir = DirectoryReader.open(directory); // 3.根據IndexReader建立IndexSearcher IndexSearcher is = new IndexSearcher(ir); // 4.建立搜索的Query,建立parser來肯定搜索文件的內容,第一個參數表示搜索的域 QueryParser parser = new QueryParser("content", new StandardAnalyzer()); Query query = parser.parse("java");// 搜索含有java內容的文檔 // 5.根據searcher搜索並返回TopDocs TopDocs tds = is.search(query, 10); // 6.根據topDocs獲取ScoreDoc對象 ScoreDoc[] docs = tds.scoreDocs; for (ScoreDoc scoreDoc : docs) { // 7.根據searcher和StoreDoc對象獲取具體的Document對象 Document d = is.doc(scoreDoc.doc); // 8.根據Document對象獲取須要的值 System.out.println("文件名:" + d.get("filename") + "路徑:" + d.get("path")); } // 9.關閉reader ir.close(); } catch (Exception e1) { e1.printStackTrace(); } } }
package com.kkrgwbj.demolucene; import org.junit.Test; public class TestLucene { @Test public void testIndex() { HelloLucene hl = new HelloLucene(); hl.index(); } @Test public void testSearch(){ HelloLucene hl = new HelloLucene(); hl.searcher(); } }
首先,執行建立索引.執行完後,咱們會發如今index01目錄建立索引
接下來,咱們執行檢索,在控制檯打印輸出a,b,c3個文件中,java出如今哪一個文件中,和文件路徑