Lucene(四)入門程序

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對象。

  1. 指定索引庫的存放位置Directory對象
  2. 指定一個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();
    }
}

4.3 結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章