開發準備:java
Win10apache
IDEAmaven
JDK1.8工具
<dependencies> <!-- Junit單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- lucene核心庫 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>7.4.0</version> </dependency> <!-- Lucene的查詢解析器 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>7.4.0</version> </dependency> <!-- lucene的默認分詞器庫 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>7.4.0</version> </dependency> <!-- lucene的高亮顯示 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-highlighter</artifactId> <version>7.4.0</version> </dependency> </dependencies>
步驟:單元測試
2.1.1 建立索引庫對象,指定索引庫的位置測試
2.1.2 建立IndexWriterConfig對象並制定分詞對象spa
2.1.3 建立一個IndexWriter對象3d
1)指定索引庫的位置code
2)指定一個IndexWriterConfig對象。對象
2.1.4 建立document對象。
2.1.5 建立field對象,將field添加到document對象中。
2.1.6 使用indexwriter對象將document對象寫入索引庫中。
2.1.7 關閉indexwriter對象。
import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.*; import org.apache.lucene.index.*; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.FSDirectory; import org.junit.Test; import java.io.File; import java.io.IOException; import java.nio.file.Path; /** * @author PC-Black * @version v1.0 * @date 2019/7/19 10:00 * @description TODO **/ public class LuceneTest { @Test public void addOneDoc() throws IOException { // 1 建立索引庫對象,指定索引庫的位置 //1.1 建立索引庫位置 Path path = new File("D:\\lucene").toPath(); //1.2 建立索引庫對象,關聯索引庫位置 FSDirectory directory = FSDirectory.open(path); // 2 建立IndexWriterConfig對象並指定分詞器對象 //2.1 建立分詞器對象用於指定分詞規則 StandardAnalyzer standardAnalyzer = new StandardAnalyzer();//標準分詞器,分詞規則:單字分詞 //2.2 建立寫出器配置對象,關聯分詞器對象 IndexWriterConfig indexWriterConfig = new IndexWriterConfig(standardAnalyzer); // 3 建立一個IndexWriter對象 &指定索引庫的位置&指定一個IndexWriterConfig對象。 IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig); // 4 建立document對象。 Document document = new Document(); // 5 建立field對象,將field添加到document對象中。 // 5.1 建立field對象 StringField docIdField = new StringField("docId", "1", Field.Store.YES); TextField titleField = new TextField("title", "個人祖國", Field.Store.YES); TextField contentField = new TextField("content", "個人祖國是一個偉大的國家", Field.Store.YES); StringField scoreField = new StringField("score", "100", Field.Store.YES); //5.1 將field添加到document對象中。 document.add(docIdField); document.add(titleField); document.add(contentField); document.add(scoreField); // 6 使用indexwriter對象將document對象寫入索引庫中。 indexWriter.addDocument(document); // 7 關閉indexwriter對象。 indexWriter.close(); } }
注意:咱們使用的luke版本是luke-7.4.0,跟Lucene的版本是對應的。因此能夠打開7.4.0版本的Lucene建立的索引庫。而且此版本的luke是jdk9編譯的,因此要想運行此工具還須要jdk9才能夠
步驟:
3.1.1 建立索引庫對象,指定索引庫位置。
3.1.2 建立索引讀取對象(IndexReader),指定索引庫對象。
3.1.3 建立索引查詢器對象(IndexSearcher),指定索引讀取對象。
3.1.4 建立TermQuery對象,指定查詢的域和查詢的關鍵詞。
3.1.5 使用索引查詢器對象執行查詢方法。
3.1.6 返回查詢結果。遍歷查詢結果並輸出。
3.1.7 關閉IndexReader對象。
@Test public void queryDoc() throws IOException { // 1 建立索引庫對象&指定索引庫位置。 FSDirectory fsDirectory = FSDirectory.open(new File("D:\\lucene").toPath()); // 2 建立索引讀取對象(IndexReader),指定索引庫對象。 // DirectoryReader open = DirectoryReader.open(fsDirectory); //2.1 使用子類建立,父類引用 IndexReader indexReader = DirectoryReader.open(fsDirectory); // 3 建立索引查詢器對象(IndexSearcher),指定索引讀取對象。 IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 4 建立分詞查詢對象(TermQuery),指定查詢的域和查詢的關鍵詞。 TermQuery termQuery = new TermQuery(new Term("title", "我")); // 5 使用索引查詢器對象執行查詢方法。 參數一:查詢條件 參數二:搜索的記錄條數 TopDocs topDocs = indexSearcher.search(termQuery, 10); // 6 返回查詢結果。遍歷查詢結果並輸出。 //6.1 獲取查詢到的結果 ScoreDoc[] scoreDocs = topDocs.scoreDocs; //6.2 遍歷查詢結果 for (ScoreDoc scoreDoc : scoreDocs) { //6.3 獲取文檔id,即docId int docId = scoreDoc.doc; //6.4 使用indexSearcher對象,根據docId獲取document對象 Document document = indexSearcher.doc(docId); //6.5 獲取每一個字段的值 if (null != document) { String title = document.get("title"); String content = document.get("content"); String score = document.get("score"); System.out.println("docId=" + docId); System.out.println("title=" + title); System.out.println("content=" + content); System.out.println("score=" + score); } } // 7 關閉IndexReader對象。 indexReader.close(); }
查看控制檯,咱們發現沒有查到數據。
由於建立索引庫寫入文檔時,咱們使用的是標準的分詞規則:即按照單字分詞的。而咱們查詢的時候,查詢的字段是title,查詢的關鍵詞是「個人」。title中並無這個分詞,因此找不到。
將關鍵詞修改爲「我」,再執行查詢下: