Apache Solr

作成日:
solr 検索エンジン 全文検索 Lucene

Apache Solrは、Apache Luceneをベースにしたオープンソースの全文検索プラットフォームです。大量のテキストデータに対して高速な検索を提供し、エンタープライズ向けの検索機能を構築するために広く使用されています。

概要

Solrとは

Solr(ソーラー、発音は”Solar”と同じ)は、Javaで書かれた検索サーバーです。以下の特徴があります:

  • 全文検索: テキストデータに対する高速な検索機能
  • ファセット検索: カテゴリ別の絞り込み検索
  • ハイライト: 検索結果内のマッチ箇所を強調表示
  • スケーラビリティ: SolrCloudによる分散検索

Apache Luceneとの関係

  • Lucene(ルシーン): 全文検索のコアライブラリ(Java)
  • Solr: Luceneの上に構築された検索サーバー・プラットフォーム

Luceneは低レベルのライブラリであり、直接使用するには専門知識が必要です。Solrは、Luceneの機能をHTTP API経由で利用できるようにし、管理UI、設定管理、分散検索などの機能を追加しています。

主な機能

全文検索

# 基本的な検索クエリ例
http://localhost:8983/solr/mycore/select?q=検索キーワード
  • 形態素解析: 日本語などの言語に対応した分かち書き
  • N-gram: 文字単位での検索
  • 同義語検索: シソーラスを使った検索拡張

ファセット検索

カテゴリ、価格帯、日付などによる絞り込み検索が可能です:

# ファセット検索の例
http://localhost:8983/solr/products/select?q=*:*&facet=true&facet.field=category

SolrCloud

分散検索・高可用性のためのクラスタリング機能:

  • シャーディング: データを複数のノードに分散
  • レプリケーション: データの冗長化
  • ZooKeeper連携: クラスタ管理と設定の同期

Elasticsearchとの比較

SolrとElasticsearchは、どちらもLuceneベースの検索エンジンですが、いくつかの違いがあります:

観点SolrElasticsearch
歴史2004年〜(より古い)2010年〜
管理Apache財団Elastic社
設定XMLベースJSONベース
クラスタリングSolrCloud(ZooKeeper必須)組み込み
リアルタイム検索対応(NRT)標準で高速
ユースケースエンタープライズ検索ログ分析、検索

選定の指針

  • Solr: 複雑なテキスト検索、エンタープライズ環境、既存Java環境との統合
  • Elasticsearch: ログ分析(ELKスタック)、リアルタイム分析、JSON-first環境

ユースケース

  1. ECサイトの商品検索: ファセット検索による絞り込み
  2. 社内文書検索: 大量のドキュメントからの情報検索
  3. ログ検索: アプリケーションログの検索・分析
  4. 地理空間検索: 位置情報を使った検索

Dockerでの使用

# docker-compose.yaml
services:
  solr:
    image: solr:9
    ports:
      - "8983:8983"
    volumes:
      - solr_data:/var/solr

volumes:
  solr_data:

基本操作

# コアの作成
docker exec -it solr solr create_core -c mycore

# データのインデックス
curl -X POST -H 'Content-Type: application/json' \
  'http://localhost:8983/solr/mycore/update?commit=true' \
  --data-binary '[{"id":"1","title":"サンプルドキュメント"}]'

# 検索
curl 'http://localhost:8983/solr/mycore/select?q=*:*'

日本語検索の設定

日本語の全文検索には、形態素解析器の設定が必要です:

Kuromoji(形態素解析)

<!-- managed-schema の設定例 -->
<fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
    <filter class="solr.JapaneseBaseFormFilterFactory"/>
    <filter class="solr.JapanesePartOfSpeechStopFilterFactory"/>
    <filter class="solr.CJKWidthFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

関連トピック