Lucene02--入門程序

Lucene02--入門程序

開發準備:java

Win10apache

IDEAmaven

JDK1.8工具

 

一、新建一個普通的maven工程

 

1.1 添加依賴

    <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>

1.2 建立測試類

 

二、往索引庫中寫入文檔

2.1 基本流程

 

步驟:單元測試

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

2.2 代碼實現

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();

    }
}

 

2.3 運行addOneDoc()方法

2.4 查看索引庫生成的位置

 

2.5 使用Luke工具查看索引

 

注意:咱們使用的luke版本是luke-7.4.0,跟Lucene的版本是對應的。因此能夠打開7.4.0版本的Lucene建立的索引庫。而且此版本的lukejdk9編譯的,因此要想運行此工具還須要jdk9才能夠

三、在索引庫中查詢文檔

3.1 查詢流程

 

步驟:

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

 

3.2 代碼實現

    @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();
    }

 

3.3 運行queryDoc方法

查看控制檯,咱們發現沒有查到數據。

 

由於建立索引庫寫入文檔時,咱們使用的是標準的分詞規則:即按照單字分詞的。而咱們查詢的時候,查詢的字段是title,查詢的關鍵詞是「個人」。title中並無這個分詞,因此找不到。

 

將關鍵詞修改爲「我」,再執行查詢下:

 

相關文章
相關標籤/搜索