java框架---->lucene的使用(一)


  Lucene是一個全文檢索的框架,apache組織提供了一個用Java實現的全文搜索引擎的開源項目。這里我們對apache的lucene的框架做一個簡單的介紹。心甘情願這四個字,透着一股卑微,但也有藏不住的勇敢。
 

lucene的第一個實例

一、maven中引入的依賴pom.xml

<properties>
    <lucene.version>6.6.0</lucene.version>
    <common-io.version>2.5</common-io.version>
</properties>

<dependencies>
    <!-- lucene core的依賴-->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>${lucene.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-queryparser</artifactId>
        <version>${lucene.version}</version>
    </dependency>

    <!-- commomsIO的依賴-->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${common-io.version}</version>
    </dependency>
</dependencies>

 

二、關於lucene的java代碼如下

package com.linux.huhx.lucene_1;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;

import java.io.File;
import java.io.IOException;

public class BaseLucene_1 {
    public static void main(String[] args) throws Exception {
        // 存放在內存中
        Directory dir = new RAMDirectory();
        new BaseLucene_1().createIndex(dir);
        new BaseLucene_1().search(dir);
    }

    /**
     * 創建索引
     */
    public void createIndex(Directory dir) throws IOException {
        IndexWriter indexWriter = null;
        // 1. 創建 Directory (索引存放位置),這里是參數dir

        // 2. 創建IndexWriter 寫索引
        Analyzer analyzer = new StandardAnalyzer();
        IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
        indexWriter = new IndexWriter(dir, iwc);

        // 3. 創建Document 對象 field
        Document document;
        File file = new File("file/example");
        for (File f : file.listFiles()) {
            document = new Document();

            // 4. 為Documen添加field
            document.add(new Field("content", FileUtils.readFileToString(f, "utf-8"), TextField.TYPE_STORED));
            document.add(new TextField("fileName", f.getName(), Field.Store.YES));
            document.add(new StringField("filePath", f.getAbsolutePath(), Field.Store.YES));
            // 5. 通過IndexWriter 添加文檔到索引中
            indexWriter.addDocument(document);
        }
        indexWriter.close();
    }

    /**
     * 根據內容搜索
     * @param dir
     * @throws Exception
     */
    public void search(Directory dir) throws Exception {
        IndexReader indexReader = null;
        // 1. 創建 Directory,這里通過參數傳遞過來的dir
        // Directory dir = FSDirectory.open(new File("file/index").toPath()); // 本地磁盤

        // 2. 創建 IndexReader
        indexReader = DirectoryReader.open(dir);

        // 3. 創建 IndexSearch
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);

        // 4. 創建搜索的Query
        // 創建parse確定搜索的內容,第二個參數為搜索的file
        QueryParser queryParser = new QueryParser("content", new StandardAnalyzer());

        // 創建Query,表示搜索域中的內容
        Query query = queryParser.parse("love");

        // 5. 搜索並返回 TopDocs
        TopDocs topDocs = indexSearcher.search(query, 10);

        // 6. 根據topDocs 獲得 scoreDocs
        ScoreDoc[] socreDocs = topDocs.scoreDocs;

        for (ScoreDoc doc : socreDocs) {
            // 獲取Document對象
            Document document = indexSearcher.doc(doc.doc);

            // 根據Document對象獲取需要的值
            System.out.println(document.get("fileName"));
            System.out.println(document.get("content"));
        }
        indexReader.close();
    }
}

 

 三、運行的結果如下

java1.txt
I love you, java.
java2.txt
I love you, linux.
java3.txt
I love you, huhx.

 

lucene的一些說明介紹

一、Lucene建立索引過程的幾個核心類

1、IndexWriter: 索引過程的核心組件,這個類負責創建新索引或者打開已有索引,以及向索引中添加、刪除或更新索引的信息。

2、Directory: 描述了Lucene索引的存放位置。它是一個抽象類,它的子類負責具體指定索引的存儲路徑。

3、Analyzer: 文本文件在被索引之前,需要經過Analyzer處理。Analyzer是由InderWriter的構造方法來指定的,它負責從被索引文本文件中提取語匯單元,交提出剩下的無用信息。

4、Document:代表一些域(Field)的集合,比如元數據(作者、標題、主題和修改日期)都可以作為文檔的不同域單獨存儲並被索引。Lucene的內核只處理java.lang.String、java.io.Reader對象和本地數字類型。

5、Field:索引中的每個文檔都包含一個或多個不同命名的域,這些域包含在Field類中。每個域都有一個域名和對應的域值,以及一組選項來精確控制Lucene索引操作各個域值。

 

二、Lucene搜索過程中的幾個核心類

1、InderSearcher: 用於搜索由IndexWriter類創建的索引,這個類公開了幾個搜索方法,它是連接索引的中心環節。

2、Term: 是搜索功能的基本單元,與Field對象類似,Term對象包含一對字符串元素:域名和單詞。它還與索引操作有着。

3、Query: 是查詢類的父類。子類例如:BooleanQuery、SpanQuery、PhraseQuery等等。

4、TermQuery: Lucene提供的最基本的查詢類型,它用來匹配指定域中包含特定項的文檔。

5、TopDocs: 一個簡單的指針容器,指針一般指向前N個排名的搜索結果,搜索結果即匹配查詢條件的文檔。

 

友情鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM