Apache Lucene

作成日:
Lucene search-engine full-text-search Java

Apache Lucene(ルーシーン)は、Javaで開発されたオープンソースの高性能な全文検索エンジンライブラリです。多くの検索アプリケーションの基盤として使用されており、ElasticsearchやApache Solrなどの検索プラットフォームもLuceneをベースにしています。

概要

Luceneとは

Luceneは、Apache Software Foundationが管理する全文検索のためのコアライブラリです。以下の特徴があります:

  • 高性能: 大量のテキストデータを高速にインデックス化・検索
  • スケーラブル: 数百万〜数十億のドキュメントを処理可能
  • 多言語対応: 日本語を含む多くの言語のテキスト解析をサポート
  • 柔軟なクエリ: ブール検索、フレーズ検索、ワイルドカード検索など多様な検索方法

名前の由来

Luceneという名前は、開発者であるDoug Cutting氏の妻のミドルネームから取られています。Doug Cutting氏は後にHadoopの開発者としても有名になりました(Hadoopは彼の息子のおもちゃの象の名前に由来)。

歴史

出来事
1999年Doug CuttingがLuceneを開発
2001年Apache Software Foundationに寄贈
2005年Apache Solrがサブプロジェクトとして誕生
2010年Elasticsearch登場(Luceneベース)
現在検索エンジンのデファクトスタンダードとして広く使用

基本概念

転置インデックス(Inverted Index)

Luceneの核心は転置インデックスです。通常のインデックス(ドキュメント→単語)とは逆に、単語からドキュメントへのマッピングを保持します。

通常のインデックス:
  Document 1 → ["Apache", "Lucene", "検索"]
  Document 2 → ["Apache", "Solr", "検索"]

転置インデックス:
  "Apache" → [Document 1, Document 2]
  "Lucene" → [Document 1]
  "Solr"   → [Document 2]
  "検索"   → [Document 1, Document 2]

この構造により、キーワードから関連するドキュメントを高速に特定できます。

主要コンポーネント

Luceneは以下の主要コンポーネントで構成されています:

コンポーネント役割
Analyzerテキストを解析可能なトークンに分解する
Tokenizerテキストを単語(トークン)に分割する
TokenFilterトークンの正規化(小文字化、ステミング等)を行う
IndexWriterインデックスへのドキュメント追加・更新・削除を行う
Documentインデックス対象のデータ単位
Fieldドキュメント内の個別フィールド(タイトル、本文など)
IndexSearcherインデックスに対する検索を実行する
Query検索条件を表現する
Scorer検索結果のスコアリング(関連度計算)を行う

処理の流れ

インデックス作成時

  1. ドキュメント作成: 検索対象のデータをDocument/Field形式で準備
  2. テキスト解析: Analyzerがテキストをトークンに分解
  3. インデックス書き込み: IndexWriterが転置インデックスを構築・保存

検索時

  1. クエリ解析: 検索キーワードをQuery形式に変換
  2. インデックス検索: IndexSearcherが転置インデックスを参照
  3. スコアリング: Scorerが関連度を計算し、結果をランキング

日本語検索

形態素解析

日本語は単語間にスペースがないため、テキストを単語に分割する形態素解析が必要です。LuceneではKuromojiという形態素解析器が提供されています。

形態素解析の例

入力: "東京都渋谷区で開催されるイベント"

解析結果:
  東京都   → 名詞-固有名詞-地域
  渋谷区   → 名詞-固有名詞-地域
  で       → 助詞
  開催     → 名詞
  される   → 動詞
  イベント → 名詞

形態素解析により、「東京」で検索した際に「東京都」を含むドキュメントがヒットするようになります。

N-gram方式との比較

方式メリットデメリット
形態素解析意味のある単語単位で分割、精度が高い辞書に依存、未知語に弱い
N-gram辞書不要、未知語にも対応インデックスサイズが大きい、ノイズが多い

クエリの種類

Luceneは多様な検索方法をサポートしています。

クエリタイプ説明
Term検索完全一致検索title:lucene
フレーズ検索連続する単語の検索"全文検索エンジン"
ワイルドカード検索パターンマッチングluc*luc?ne
前方一致検索指定文字列で始まる単語を検索Apache*
あいまい検索編集距離を許容した検索luceen~2
範囲検索数値や日付の範囲指定price:[100 TO 500]
ブール検索AND/OR/NOTの組み合わせlucene AND 検索

ブール演算子

演算子意味
AND / +両方を含む(必須)lucene AND 検索
ORいずれかを含むlucene OR solr
NOT / -含まない(除外)lucene NOT elasticsearch

スコアリング

検索結果は関連度スコアによってランキングされます。

TF-IDF

古典的なスコアリング手法で、以下の2つの要素を組み合わせます:

要素説明
TF(Term Frequency)ドキュメント内での単語の出現回数。多いほどスコアが高い
IDF(Inverse Document Frequency)全ドキュメント中でその単語がどれだけ稀少か。稀少なほどスコアが高い

例えば「the」のような頻出語は多くのドキュメントに現れるためIDFが低く、「Lucene」のような専門用語はIDFが高くなります。

BM25

Lucene 6以降で採用されている改良版アルゴリズムです。TF-IDFの問題点(長いドキュメントが有利になりやすい、TFの影響が大きすぎる等)を改善しています。

パラメータ役割
k1単語頻度の飽和度を制御(TFの影響を抑える)
b文書長の正規化度合い(長いドキュメントのペナルティ)

Luceneをベースにした製品

Luceneはライブラリであるため、直接使用するには専門知識が必要です。以下の製品はLuceneの機能をより使いやすい形で提供しています。

Apache Solr

  • 位置づけ: Luceneの上に構築された検索サーバー
  • 特徴: HTTP API、管理UI、SolrCloud(分散検索)
  • 用途: エンタープライズ検索

Elasticsearch

  • 位置づけ: Luceneをラップした分散検索・分析エンジン
  • 特徴: RESTful API、Kibana連携、クラスタリング
  • 用途: ログ分析(ELKスタック)、全文検索

OpenSearch

  • 位置づけ: ElasticsearchのAWSフォーク
  • 特徴: Apache 2.0ライセンス
  • 用途: AWS環境での検索・分析

その他の製品

製品説明
Hibernate SearchJavaのORMフレームワークHibernateとLucene/Elasticsearchの統合
Apache NutchLuceneベースのウェブクローラー
Neo4jグラフデータベース(全文検索機能にLuceneを使用)

Lucene vs Solr vs Elasticsearch

観点LuceneSolrElasticsearch
形態ライブラリサーバーサーバー
利用方法Javaコードから直接呼び出しHTTP APIHTTP API
難易度高い(低レベルAPI)中程度中程度
設定方式プログラムコードXMLJSON
分散処理自前で実装が必要SolrCloud組み込み
適用場面高度にカスタマイズした検索エンタープライズログ分析、汎用

選定の指針

  • Lucene: 完全にカスタマイズされた検索エンジンを構築したい場合
  • Solr: エンタープライズ環境、既存のJava/XML環境との親和性が重要な場合
  • Elasticsearch: JSON-first、モダンなスタック、ログ分析(ELKスタック)

パフォーマンスの考慮事項

インデックス設計

観点考慮事項
セグメント管理インデックスは複数のセグメントで構成される。定期的なマージで最適化
フィールド設計検索対象、ソート用、表示用でフィールドタイプを適切に選択
更新頻度頻繁な更新はパフォーマンスに影響。バッチ処理を検討

検索最適化

観点考慮事項
キャッシュ活用IndexSearcherの再利用、クエリキャッシュの活用
クエリ設計不要な機能(ハイライト等)を無効化、必要なフィールドのみ取得

ユースケース

  1. ECサイトの商品検索: 商品名、説明文からの全文検索、ファセット検索
  2. 社内文書検索: PDF、Word文書などのドキュメント検索
  3. ログ検索: アプリケーションログの検索・分析
  4. コード検索: ソースコードの検索(IDE統合)
  5. 地理空間検索: 位置情報を使った近傍検索

関連トピック