1. 依賴
1.1 直接下載jar包
Lucene是開發全文檢索功能的工具包,從官方網站http://lucene.apache.org/ ,下載lucene-7.4.0,並解壓。
Jdk要求:1.8以上
1.2 方式二: pom.xml文件
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>compile</scope>
</dependency>
2. 需求
實現一個文件的搜索功能,通過關鍵字搜索文件,凡是文件名或文件內容包括關鍵字的文件都需要找出來。還可以根據中文詞語進行查詢,並且需要支持多個條件查詢。
本案例中的原始內容就是磁盤上的文件,如下圖:
3. 創建索引
3.1 實現步驟
第一步:創建一個java工程,並導入jar包。
第二步:創建一個indexwriter對象。
- 指定索引庫的存放位置Directory對象
- 指定一個IndexWriterConfig對象。
第二步:創建document對象。
第三步:創建field對象,將field添加到document對象中。
第四步:使用indexwriter對象將document對象寫入索引庫,此過程進行索引創建。並將索引和document對象寫入索引庫。
第五步:關閉IndexWriter對象。
3.2 代碼
import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
/**
* 創建索引
*/
public class TestCreateIndex {
@Test
public void testCreateIndex() throws IOException {
//1.創建Directory對象,指定索引庫的存放位置
//存放到磁盤中
Directory directory = FSDirectory.open(Paths.get("D:\\test\\lucene\\programme"));
//存放到內存中
//Directory directory = new RAMDirectory();
//2.指定一個標準分析器,對文檔內容進行分析
Analyzer analyzer = new StandardAnalyzer();
//3.基於分析器創建 IndexWriterConfig 對象
IndexWriterConfig config = new IndexWriterConfig(analyzer);
//4.創建一個 IndexWriter 對象
IndexWriter indexWriter = new IndexWriter(directory, config);
//5.讀取磁盤上的文件,對應每個文件創建一個文檔對象
File dir = new File("D:\\test\\lucene\\searchsource");
for (File f : dir.listFiles()) {
//文件名
String fileName = f.getName();
//文件內容
String fileContent = FileUtils.readFileToString(f);
//文件路徑
String filePath = f.getPath();
//文件的大小
long fileSize = FileUtils.sizeOf(f);
//6.創建文件名域
//第一個參數:域的名稱
//第二個參數:域的內容
//第三個參數:是否存儲
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);
//7.創建document對象,並將域添加到文檔對象中
Document document = new Document();
document.add(fileNameField);
document.add(fileContentField);
document.add(filePathField);
document.add(fileSizeField);
//8.把文檔對象寫入索引庫
indexWriter.addDocument(document);
}
//9.關閉indexwriter
indexWriter.close();
}
}
3.3 運行結果
3.4 使用Luke工具查看索引文件
luke-javafx-7.4.0-luke-release.zip
我們使用的luke的版本是luke-7.4.0,跟lucene的版本對應的。可以打開7.4.0版本的lucene創建的索引庫。需要注意的是此版本的Luke是jdk9編譯的,所以要想運行此工具還需要jdk9纔可以。
4. 查詢索引
4.1 步驟
第一步:創建一個Directory對象,也就是索引庫存放的位置。
第二步:創建一個indexReader對象,需要指定Directory對象。
第三步:創建一個indexsearcher對象,需要指定IndexReader對象
第四步:創建一個TermQuery對象,指定查詢的域和查詢的關鍵詞。
第五步:執行查詢。
第六步:返回查詢結果。遍歷查詢結果並輸出。
第七步:關閉IndexReader對象
4.2 代碼
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;
import java.nio.file.Paths;
/**
* 查詢索引
*/
public class TestSearchIndex {
@Test
public void testSearchIndex() throws Exception {
//1. 指定索引庫存放的路徑
Directory directory = FSDirectory.open(Paths.get("D:\\test\\lucene\\programme"));
//2. 創建indexReader對象
IndexReader indexReader = DirectoryReader.open(directory);
//3. 創建indexsearcher對象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//4. 創建查詢
Query query = new TermQuery(new Term("filename", "apache"));
//5. 執行查詢
//第一個參數是查詢對象,第二個參數是查詢結果返回的最大值
TopDocs topDocs = indexSearcher.search(query, 10);
//查詢結果的總條數
System.out.println("查詢結果的總條數:"+ topDocs.totalHits);
//6. 遍歷查詢結果
//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("-------------------------");
}
//7. 關閉indexreader對象
indexReader.close();
}
}