天天看點

Lucene使用指南Lucene簡介1. Lucene環境2. Lucene和應用程式的關系3. Lucene API使用4. 附錄.

Lucene使用指南

Lucene簡介

Lucene是一個基于Java的、高性能的全文檢索工具包,它目前是著名的 Apache Jakarta 家族中的一個開源項目,也是目前最為流行的基于 Java 開源全文檢索工具包。但它不是一個完整的搜尋應用程式,而是為應用程式提供索引和搜尋功能。

Lucene 是為文本類型的資料建立索引的,是以隻要能把需要索引的資料格式轉化的文本的,Lucene 就能對文檔進行索引和搜尋。比如HTML、PDF,都可以轉換文本再交給Lucene進行索引。

1. Lucene環境

 1.1 Lucene版本

目前版本:取目前最新版本Lucene Core 3.4.0

下載下傳位址:http://lucene.apache.org/java/docs/index.html

linux版本: lucene-3.4.0.tgz

windows版本:lucene-3.4.0.zip

 1.2 IKAnalyzer中文分詞器

Lucene的分詞器以接口Analyzer的形式對外提供,外部根據業務需要實作該分詞器。Lucene本身提供了标準分詞器StandarAnalyzer,針對英文的分詞。

中文分詞器現在比較成熟的是開源項目的IKAnalyzer,是針對中文的分詞, 目前最新版本是IKAnalyzer3.2.8.jar

下載下傳位址: http://code.google.com/p/ik-analyzer/downloads/list

2. Lucene和應用程式的關系

Lucene使用指南Lucene簡介1. Lucene環境2. Lucene和應用程式的關系3. Lucene API使用4. 附錄.

3. Lucene API使用

 3.1 建立索引

為了對文檔進行索引,Lucene 提供了五個基礎的類,他們分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我們分别介紹一下這五個類的用途:

Document

Document 是用來描述文檔的,這裡的文檔可以指一個 HTML 頁面,一封電子郵件,或者是一個文本檔案。一個 Document對象由多個 Field 對象組成的。可以把一個 Document 對象想象成資料庫中的一個記錄,而每個 Field 對象就是記錄的一個字段。

Field

Field 對象是用來描述一個文檔的某個屬性的,比如一封電子郵件的标題和内容可以用兩個 Field 對象分别描述。

Analyzer

在一個文檔被索引之前,首先需要對文檔内容進行分詞處理,這部分工作就是由 Analyzer 來做的。Analyzer 類是一個抽象類,它有多個實作。針對不同的語言和應用需要選擇适合的 Analyzer。Analyzer 把分詞後的内容交給 IndexWriter 來建立索引。

IndexWriter

IndexWriter 是 Lucene 用來建立索引的一個核心的類,他的作用是把一個個的 Document 對象加到索引中來。

Directory

這個類代表了 Lucene 的索引的存儲的位置,這是一個抽象類,它目前有兩個實作,第一個是 FSDirectory,它表示一個存儲在檔案系統中的索引的位置。第二個是 RAMDirectory,它表示一個存儲在記憶體當中的索引的位置。

使用例子

public void createIndexs() throws Exception

{

    String indexDir = "d:\\Temp\\lucence\\indexDir";

    String dataDir = "d:\\Temp\\lucence\\dataDir";

    Analyzer  analyzer = new IKAnalyzer(true); // 使用中文分詞器

    File dir = new File(dataDir);

    File[] files = dir.listFiles();

    Directory fsDirectory = FSDirectory.open(new File(indexDir));

    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, analyzer);

    config.setOpenMode(OpenMode.CREATE_OR_APPEND);

    config.setMaxBufferedDocs(1000);

    IndexWriter indexWriter = new IndexWriter(fsDirectory, config);

    for(int i = 0; i < files.length; i++)

{

         String filePath = files[i].getAbsolutePath();

         if(filePath.endsWith(".html") || filePath.endsWith(".htm"))

        {

             HTMLDocParser htmlParser = new HTMLDocParser(filePath);

              String path    = htmlParser.getPath();

              String title   = htmlParser.getTitle();

              Reader content = htmlParser.getContent();

              Document document = new Document();

            document.add(new Field("path", path, Field.Store.YES,

                        Field.Index.NO, Field.TermVector.NO));

            document.add(new Field("title", title, Field.Store.YES,

                        Field.Index.ANALYZED,

                        Field.TermVector.WITH_POSITIONS_OFFSETS));

            document.add(new Field("content", content,

                        Field.TermVector.WITH_POSITIONS_OFFSETS));

              indexWriter.addDocument(document);

        }

    }

    indexWriter.commit();

    indexWriter.optimize();

    indexWriter.close();

}

 3.2 搜尋文檔

在上面一部分中,我們已經為一個目錄下的文本文檔建立好了索引,現在在這個索引上進行搜尋以找到包含某個關鍵詞或短語的文檔。Lucene 提供了幾個基礎的類來完成這個過程,它們分别是呢 IndexSearcher, Query, QueryParser,TopDocs. 下面我們分别介紹這幾個類的功能。

Query

這是一個抽象類,Lucene針對不同的類型提供了不同的實作,比如 TermQuery, BooleanQuery, PrefixQuery,

PhraseQuery

. 這個類的目的是把使用者輸入的查詢字元串封裝成 Lucene 能夠識别的 Query。

QueryParser

如果不樂意去了解諸如BooleanQuery,PhraseQuery等看上去複雜的查詢類型。希望的是輸入一個字元串,它就能夠了解使用者的搜尋意圖,然後轉換成lucene中合理的Query子類,提供給lucene進行搜尋,那這個就是QueryParser。QueryParser能夠根據使用者的輸入來進行解析,自動建構合适的Query對象。

IndexSearcher

IndexSearcher 是用來在建立好的索引上進行搜尋的。它隻能以隻讀的方式打開一個索引,是以可以有多個 IndexSearcher的執行個體在一個索引上進行操作。

TopDocs

TopDocs是用來儲存搜尋的結果。儲存前N條得分高的記錄。

使用例子

    public List search(String strQuery) throws Exception

    {

        List searchResult = new ArrayList();

        String indexDir = "d:\\Temp\\lucence\\indexDir";

        String field = "content";

         Analyzer  analyzer = new IKAnalyzer(true); // 使用中文分詞器

         Directory fsDirectory = FSDirectory.open(new File(indexDir));

        IndexSearcher indexSearcher = new IndexSearcher(fsDirectory, true);

        QueryParser queryParser = new QueryParser(Version.LUCENE_34, field, analyzer);

        Query query = queryParser.parse(strQuery);

        if (null != query && null != indexSearcher)

        {

            TopDocs hits = indexSearcher.search(query, 1000);

            int totalHits = hits.totalHits;

            int len = Math.min(1000, totalHits);

            ScoreDoc[] docs = hits.scoreDocs;

            for (int i = 0; i < len; i++)

            {

                SearchResultBean resultBean = new SearchResultBean();

                Document doc = indexSearcher.doc(docs[i].doc);

                resultBean.setHtmlPath(doc.get("path"));

                resultBean.setHtmlTitle(doc.get("title"));

                searchResult.add(resultBean);

            }

        }

        return searchResult;

    }

4. 附錄.

提供一個Lucene 工程。參考lucene-demo.rar。    點我下載下傳

繼續閱讀