Lucene全文檢索--實戰篇
阿新 • • 發佈:2019-01-10
一、配置開發環境
版本:lucene4.10.3
Jdk要求:1.7以上
IDE:Eclipse
jar包:
Lucene包:
lucene-core-4.10.3.jar
lucene-analyzers-common-4.10.3.jar
lucene-queryparser-4.10.3.jar
其它:
commons-io-2.4.jar
junit-4.9.jar
二、建立索引庫
第一步:建立一個java工程,並匯入jar包。
第二步:建立一個indexwriter物件。
- 指定索引庫的存放位置Directory物件
- 指定一個分析器,對文件內容進行分析。
第二步:建立document物件。
第三步:建立field物件,將field新增到document物件中。
第四步:使用indexwriter物件將document物件寫入索引庫,此過程進行索引建立。並將索引和document物件寫入索引庫。
第五步:關閉IndexWriter物件。
//建立索引 @Test public void createIndex() throws Exception { //指定索引庫存放的路徑 Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index")); //建立一個標準分析器(分析器有很多種) Analyzer analyzer = new StandardAnalyzer(); //建立indexwriterCofig物件 //第一個引數: Lucene的版本資訊,可以選擇對應的lucene版本也可以使用LATEST //第二根引數:分析器物件 IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer); //建立indexwriter物件 IndexWriter indexWriter = new IndexWriter(directory, config); //原始文件的路徑 File dir = new File("D:\\04.lucene\\01.參考資料\\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, Store.YES); //檔案內容域 Field fileContentField = new TextField("content", fileContent, Store.YES); //檔案路徑域(不分析、不索引、只儲存) Field filePathField = new StoredField("path", filePath); //檔案大小域 Field fileSizeField = new LongField("size", fileSize, 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(); }
【注意】Field域的屬性
三、查詢索引庫
生成的索引檔案,可以使用Luke進行檢視!使用很簡單,這裡面就不做介紹了!
四、 查詢索引
第一步:建立一個Directory物件,也就是索引庫存放的位置。
第二步:建立一個indexReader物件,需要指定Directory物件。
第三步:建立一個indexsearcher物件,需要指定IndexReader物件
第四步:建立一個TermQuery物件,指定查詢的域和查詢的關鍵詞。
第五步:執行查詢。
第六步:返回查詢結果。遍歷查詢結果並輸出。
第七步:關閉IndexReader物件
//查詢索引庫
@Test
public void searchIndex() throws Exception {
//指定索引庫存放的路徑
Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index"));
//建立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"));
}
//關閉indexreader物件
indexReader.close();
}
【注意】
IndexSearcher搜尋方法
TopDocs
該部分介紹的查詢比較簡單,後面會介紹複雜查詢!
五、索引庫刪除
//刪除全部索引
@Test
public void deleteAllIndex() throws Exception {
//getIndexWriter 詳見上文
IndexWriter indexWriter = getIndexWriter();
//刪除全部索引
indexWriter.deleteAll();
//關閉indexwriter
indexWriter.close();
}
//根據查詢條件刪除索引
@Test
public void deleteIndexByQuery() throws Exception {
IndexWriter indexWriter = getIndexWriter();
//建立一個查詢條件
Query query = new TermQuery(new Term("filename", "apache"));
//根據查詢條件刪除
indexWriter.deleteDocuments(query);
//關閉indexwriter
indexWriter.close();
}
六、索引庫的修改
//修改索引庫
@Test
public void updateIndex() throws Exception {
IndexWriter indexWriter = getIndexWriter();
//建立一個Document物件
Document document = new Document();
//向document物件中新增域。
document.add(new TextField("filename", "要更新的文件", Store.YES));
document.add(new TextField("content", "2013年11月18日 - Lucene 簡介", Store.YES));
indexWriter.updateDocument(new Term("content", "java"), document);
//關閉indexWriter
indexWriter.close();
}