トップ 新規 編集 差分 一覧 ソース プレゼンテーション 検索 ヘルプ PDF RSS ログイン

Lucene

 Luceneとは?

  • LuceneはJava言語で開発されている全文検索エンジンのクラスライブラリである

Apache Lucene is a high-performance, full-featured text search engine library written entirely in Java. It is a technology suitable for nearly any application that requires full-text search, especially cross-platform.(公式サイトの紹介)

  • Apache Jakartaプロジェクト http://jakarta.apache.org/ の下で開発が始められ、現在はApacheのサブプロジェクトである
  • 標準では順位付け出力のためにベクトル空間モデルを用いる。

 Luceneの基本的な使い方

インデックスの作成の手順

  1. インデックスIndexWriterを開く
    • インデックスを作成するディレクトリを指定する
    • 英語の場合にはStarndardAnalyzer、日本語の場合にはCJKAnalyzerあるいはJapaneseAnalyzerを登録する
    • 新規か、追記かを指定する
  2. 文書Documentを作成する
  3. 文書DocumentにフィールドFieldを追加する
  4. インデックスIndexWriterに文書Documentを追加する

  • インデックス作成の例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package lucene;
import java.io.IOException;

import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

public class IndexBook {
    public static void main(String[] args) {
        try {
            IndexWriter writer = new IndexWriter("./index", new CJKAnalyzer(), true);
            indexBook(writer,"夏目漱石","吾輩は猫である","「吾輩は猫である。名前はまだない。どこで生れたかとんと見当がつかぬ。」から始まる有名な小説");
            indexBook(writer,"森鴎外","舞姫","『舞姫』(まいひめ)は、森鴎外の短編小説。1890年(明治23年)、「国民之友」に発表。(Wikipediaより)");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void indexBook(IndexWriter writer, String author, String title, String description) throws IOException {
        Document doc = new Document();
        doc.add(new Field("author", author,Field.Store.YES,Field.Index.UN_TOKENIZED));
        doc.add(new Field("title", title,Field.Store.YES,Field.Index.TOKENIZED));
        doc.add(new Field("description", description,Field.Store.YES,Field.Index.TOKENIZED));
        writer.addDocument(doc);
    }
}

インデックス検索の手順

  1. インデックスIndexを開く
  2. フィールド指定をし、クエリーQueryを作成する
  3. クエリーQueryでインデックスを検索し、検索結果Hitsを取得する
  4. Hitsのサイズ分だけループし、文書を取得する

  • インデックス検索の例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package lucene;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;

class SearchBook {
    public static void main(String[] args) {
        String index = "index";
        try {
              Searcher searcher = new IndexSearcher(index);
              BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
              while (true) {
                    System.out.print("タイトルから探します。検索語は?");
                    String line = in.readLine();
                    if (line.length() <=0) break;
                    QueryParser qparser = new QueryParser("title", new CJKAnalyzer());
                    Query query = qparser.parse(line);
                    Hits hits = searcher.search(query);
                    System.out.println(hits.length() + "件の文献がヒットしました。");
                    for (int i = 0; i<hits.length() ; i++) {
                        Document doc = hits.doc(i);
                        System.out.println("著者名:"+doc.get("author")+",タイトル:"+doc.get("title"));
                        System.out.println("説明:"+doc.get("description"));
                    }
              }
              searcher.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 JapaneseAnalyzer

  • Lucene自体にもCJKAnalyzerという日本語、中国語、韓国語を扱うことが可能なアナライザ(トークン化を行う部品)があるが、これはbigramの実装であるため、利用可能ではあるが、インデックスサイズの肥大化、予想外のノイズの混入につながることが多い。そこで、形態素解析を中心に実装されたJapaneseAnalyzerを用いることになる。

形態素解析システム Sen https://sen.dev.java.net/

形態素解析システム GoSen http://itadaki.org/wiki/index.php/GoSen

IndexBook.java SearchBook.java

最終更新時間:2007年10月20日 15時22分19秒