虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

全文検索エンジンについて調べてみた

こんにちは、虎の穴ラボのA.M.です。

とらのあなでは、Fantia等のサービスに全文検索エンジンの導入を検討しており、 その流れで使用する検索エンジンを選定するために各種全文検索エンジンについて調べてみました。

まず、全文検索エンジンとは、「全文検索を行うためのソフトウェア」です。 ソフトウェアといっても幅が広いですが、Webサービスに検索エンジンを導入する場合、一般的に下記図でいう「検索サーバ」を使用することが多いように思います。

※1/22のLTイベント資料より

なので、今回は主に世の中の「検索サーバ」について調べてみました。

大きく分けると、以下のような系統に分類できます。

  • Groonga系
  • Apache Lucene系
  • その他(MySQL等)

Groonga系

  • Groonga(読み方:ぐるんが)
    • 開発者が日本人で、日本語特化の機能(ローマ字検索等)がある
    • 検索サーバとしてだけではなく、C言語のライブラリとしても使用可能
    • N-Gramと形態素解析(Mecab)の両方が使用可能
    • 既存の製品と組合せて使うためのプラグインが豊富(Mroonga, PGroonga等)
  • Mroonga(読み方:むるんが)
    • GroongaベースのMySQLストレージエンジン
    • SQLコマンドでGroongaが使える(SQLだけで日本語の全文検索ができる)
    • MySQLの便利機能(レプリケーション等)も使える
    • Groongaを直接使用することもできる
    • MySQLのFULLTEXTインデックスよりも高速
    • ただし、CloudSQL(GCP)やRDS(AWS)では使えない(インストールできない)
  • PGroonga(読み方:ぴーじーるんが)
    • PostgreSQLの拡張機能
    • Groongaをインデックスとして使用可能
    • LIKE演算子をサポート(既存SQLを変更せずに全文検索可能)
    • ただし、CloudSQL(GCP)やRDS(AWS)では使えない(インストールできない)

Apache Lucene系

  • Apache Lucene(検索ライブラリ)
    • Apacheが開発しているJava製の全文検索エンジン(ライブラリ)
    • Javaのライブラリ(jar)が提供されている
    • 単体ではサーバ機能はない
  • Apache Solr
    • Apacheが開発しているLuceneベースの検索サーバ
    • 長年の実績があり、信頼性も高い。
    • Elasticsearchに比べるとクラスタ、スケーリングが面倒
    • N-Gramと形態素解析(kuromoji)の両方が使用可能
  • Elasticsearch
    • Elastic社が開発しているLuceneベースの検索サーバ
    • RESTful APIでCRUD操作可能(様々なシステムと連携しやすい)
    • 分析機能が豊富
    • クラスタ、スケーリングが簡単
    • N-Gramと形態素解析(kuromoji)の両方が使用可能
    • Apache Solrよりも後発な分ノウハウの蓄積が少ないと言われているが、近年は追い付いているように思う
    • 現在の一番人気(らしい)

MySQL

  • MySQLのFULLTEXTインデックス
    • MySQLの標準機能(v3.23.23以降)
    • v5.7から日本語に対応
    • N-Gramと形態素解析(Mecab)の両方が使用可能

まとめ

上記情報から、個人的な所感ですが、使用する検索エンジン(検索サーバ)を選ぶ際は以下のように選択できると思います。

  • データベースにMySQLを使用している場合
    • MySQLのバージョンが5.7以上
      • 開発コストを抑えたい ⇒ FULLTEXTインデックス
      • 高速に検索したい ⇒ Mroonga
    • MySQLのバージョンが5.6以下 ⇒ Mroonga
  • データベースにPostgreSQLを使用している場合 ⇒ PGroonga
  • データベースにMySQL, PostgreSQL以外を使用している場合
    • 高機能でかつ開発コストを抑えたい ⇒ Elasticsearch
    • 実績・信頼性が高い検索エンジンを採用したい ⇒ Apache Solr

※ただし、CloudSQL(GCP)やRDS(AWS)を使用している場合、MroongaやPGroongaのインストールができないので、別の手段を考える必要がありそうです。

次回はMySQLにフォーカスして、FULLTEXTインデックスとMroongaを実際に使ってみて検索速度の比較等をやってみたいと思います。Mroongaを使用して実際に全文検索をやってみたいと思います。
※検索速度の比較もそのうちやる予定です。

2020-03-31 追記

続編ができました。 toranoana-lab.hatenablog.com

P.S.
虎の穴ではJavaエンジニアをはじめとして一緒に働く仲間を絶賛募集中です! この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。 yumenosora.co.jp