Elasticsearch を始める前に学んだ 5つのこと


1. Elasticsearch は全文検索を行うソフトウェアである

検索システムは、検索対象のデータ本体に加えて、それらの「メタデータ」も合わせて格納する。
メタデータは、データ本体を探しやすくするために付加する属性、キーワード、頭文字などの索引データのこと。

全文検索の手法としては、以下のようなものがある。

1.逐次検索:

  検索対象を最初から最後まで順次走査を行い該当する箇所を探し出す。
  Unix の grep コマンドなどがこの方法で検索を行っている。

2.索引型検索:

  検索対象に予めインデックス(索引)を作成しておき、それを元に該当する箇所を探し出す。

Elasticsearch(多くの検索ソフトウェア)では、索引型検索により全文検索を行っている。

2. Elasticsearch は検索サーバレイアに該当するソフトウェアである

一般的な検索システムは、以下の3つの層(レイヤ)で構成される

1.検索ライブラリ レイヤ

インデクサ(indexer)とサーチャー(searcher)の機能を提供する。
インデクサ:ドキュメントからキーワードを抽出し、インデックスのデータベースを作成する役割。
サーチャー:インデックスから検索するための検索クエリの機能を提供する役割。
代表的なソフトウェアとして、"Apache Lucene" が挙げられる。
※"Apache Lucene" は、転置インデックス方式の検索機能を提供するソフトウェア。

2.検索サーバ レイア

検索ライブラリ単体で提供される機能を補完するために、インタフェースや管理機能を提供するレイヤ。
代表的なソフトウェアとして、"Apache Solr" や "Elasticsearch" が挙げられる。
※"Apache Solr" や "Elasticsearch"は、Lucene を補完するように、REST API のインタフェースを提供している。

3.検索システム レイヤ

クローラ(crawler)機能や Web ユーザインタフェースを提供する。
Webページ等から、最新のドキュメントを収集する役割で、通称「エンタープライズサーチ」呼ばれる。
代表的なソフトウェアとして、"namazu" や "Fess" などが挙げられる。

Elasticsearch は検索サーバとしての役割を持ち、内部では検索ライブラリである"Apache Lucene"を利用している。
※ "Apache Solr" も"Apache Lucene"を利用していて、基本的な機能に大差はない

3. Elasticsearch は1世代前までのメジャーリリースに対して、インデックスの後方性互換がある

Elasticsearch で作成したインデックスが利用できるのは、1つ先のメジャーリリースまでという制限がある。
例えば、Elasticsearch 6.x で作成したインデックスは、Elasticsearch 7.x にバージョンアップした後でも使えるが、Elasticsearch 8.x では使えない。
最近は Elasticsearch のバージョンアップが盛んであることから留意しておきたい。

4. Elasticsearch は複数ノードへのデータ分散配置により高速化と高可用性を実現している

Elasticsearch で作成したインデックスは、シャードと呼ばれる単位に分割されて格納される。
Elasticsearch 7.x のデフォルトでは、1インデックスに対するシャードの数は1だが、データを保持するノード数に応じて、シャードの数を調整する。
複数台のノードに分散して配置することで、1台当たりのリソース負荷を減らす狙いがある。
一般的にこの仕組みをシャーディング(パーティショニング)と呼ぶ。

メリット1:検索性能の向上

ノードを増やすことで、検索が分散処理で行われるため、その分検索性能が向上する。
Elasticsearchでは、ノードを追加した際のシャード再構成は自動で行われるため、ノードを追加するだけで性能がスケールされる。

メリット2:可用性の向上

各シャードに対して、レプリカを1つ以上持たせることが可能。
そのため、仮に1台のノードがダウンしたとしても、レプリカを元にデータを自動復旧することが可能。
デフォルトでは、各シャードに対して1つのレプリカが生成される。

5. Elasticsearch ではすべての操作を REST API 経由で行うことが可能

※厳密にすべてかどうかは分からないですが、定義されている
Elasticsearch にデータを入れる、あるいは入っているデータに対しての操作は、REST API が提供されている。

また、インデックスやクエリの対象となるドキュメントはすべて JSON フォーマットで表しています。
Elasticsearch では、1件のレコードのことを「ドキュメント」と呼びますが、JSON オブジェクトとして表現できさえすれば、そのドキュメントを格納するだけで、各項目にインデックスが作成されて、素早くデータ検索ができるようになっている。
※Elasticsearch が誕生する前、前身である "compass" というソフトウェアがあった。それを Elasticsearch として作り直した背景として、REST API をフルで提供することや、JSON がRFC4627として策定されたことがあったと思われる。