【Elasticsearch 初級】検索システム Elasticsearch 基礎知識

# 概要
この記事では、初めて検索システム Elasticsearch を学習する方向けに基本的な考え方、導入方法を記載しております。
私のエンジニア歴は浅いですが、少しでも自身の復習と見ている方の力になればと思っております。

# 検索システムとは
情報検索をするためのシステムである検索システム。

```:検索システムの流れ
ユーザー　→ 　検索ワード　→  WEBサービス　→　検索　→　検索エンジン
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　   ↓
ユーザー  ←　検索結果　←  WEBサービス　 ←  結果　 ←  検索エンジン
```

# 全文検索

文書の集合から、検索ワードにマッチする文書を探すこと。
全文検索には大きく２つに分かれます。

①逐次検索（インクリメンタルサーチ）
②インデックス検索

### ①逐次検索（インクリメンタルサーチ）
逐次検索とは、キーワード検索を行う際に、利用者が文字を入力するたびに検索を実行する方式。
検索語全体を入力する前に検索を開始し、一文字進むごとに検索結果が更新されていく。

```:逐次検索

服１　　服２　　服３　　服４　　服５
 ↑      ↑      ↑      ↑     ↑
　　　　　　　ユーザー

＃ユーザーは青い服が欲しいとするとそれぞれに「青い服」と検索をかけて全てのデータから探さなければならない。

```

【特徴】
・事前にインデックス構築しなくて良い
・高速な検索を行うことができない

### ②インデックス検索
検索エンジン内のデータベースが持つ「索引」のことです。 
Webページに出現する語句がすべて登録されており、検索結果はインデックス情報を参考にして出力されます。 
その数は膨大で、Googleは数千億のWebページを検索インデックスとして保持している。

```
ロングTシャツ  半袖Tシャツ　ポロシャツ　ノースリーブ
　　  ↑          ↑          ↑          ↑    
 　　　　　　　      ユーザー
```

【特徴】
・インデックス構築の手間がかかる
・高速な検索を行うことができる

# 検索システムの全体像
検索システムでは、システムの構成要素は、データの登録に関わるものと検索に関わるものに分類されます。

```:検索システムの全体像

（検索に関わるもの）　　         FE/APP　→  Search API  →  Search Engine
                                                             ↓
（登録に関わるもの）　　Date Source 　← crawler　← Datebase 　← indexer
　
```

# クローラー（Crawler）

** 定期的にデータを収集するプロセスのこと。**
**またはウェブ上のリンクをたどるようにプログラムされたロボットのことです。**
サービスに検索機能を実装する場合、サービスで利用している様々なデータを収集する必要があります。
WEBショッピングの場合、商品の情報や在庫などは検索システムに反映させたり、WEBサイトをスクレイピングしてデータの情報を収集する必要があります。
収集したデータはディスクに保存するのではなく、データベースなどに保存することで複数のサーバーからアクセスしやすくなります。

# インデクサー（indexer）
**インデクサーは収集したデータを実際に検索エンジンに登録するまでのプロセスのことです。**
インデックスを利用した検索は事前にインデックスを作成する必要があります。
具体的には、データを整形し、検索エンジンにPOSTを送ります。
このプロセスを常時稼働させることでリアルタイムで検索エンジンにデータ更新を行います。

# 検索エンジン
ElasticsearchやSlorなどの検索エンジンです。
大規模な検索システムを作ろうとする場合、
１台の構成ではデータが乗り切らない。十分なパフォーマンスが出せない。ダウンすると検索システムが停止する。などの
可能性があるため、通常は複数台の構成にします。

ElasticsearchやSlorを利用すると、分散検索、分散インデックス機能を利用することができるため、システム可用性を高めることができます。

# 検索API（search API）

検索システムを運用していくとサービスに応じたビジネスロジックを記載したくなることがあります。
検索APIを使用することで、検索システムが扱いやすくなります。

# 検索エンジンの構成図

検索エンジンとはいえ、ElasticsearchやSlorは検索エンジン以外にも様々な機能を持っています。

```:検索エンジン

ーー検索エンジンーーーーーーーーーーーーーーーーーー
|【サーバー】　　　　　　Elasticsearch / Slor  ｜
|【検索コアライブラリ】　Apache Lucene         ｜
ーーーーーーーーーーーーーーーーーーーーーーーーーー
```

Luceneはjavaで記載されており、高速に全文検索を行うことができる。
Luceneを利用する場合には、javaでプログラムを記載し、Luceneのクラスを利用する形になる。

検索機能をREST APIで利用するためには、ElasticsearchやSlorを用いる必要がある。
どちらもJavaで作成されており、内部的にはLuceneの検索機能を利用します。
単にサーバー化するだけでなく、実際のプロダクションで必要になるシャーディングやレプリケーションなどの
機能も持っています。他にも色々な機能が利用できます。

# Elasticsearch

### ドキュメント(document)

ドキュメントはElasticsearchに格納されるデータの単位のことです。
RDBでの **「レコード」** に対応します。ドキュメントはJSON形式のオブジェクトで表されます。
ドキュメントは内部的にIDによって管理されており、ドキュメントを登録する際は、IDを明示的に与えるか、
与えなかった場合は自動でIDが割り振られます。

### フィールド（fields）
フィールドとはJSON形式のキー、バリューのことを指します。
RDBでの **「カラム」** に対応します。

```
{
   "key1": "value1",
   "key2": "value2"
}
```

上記のJSONでは"key1": "value1"が「フィールド」となります。

# Elasticsearchで利用可能なデータ型

### text型

文字列の型。形態素解析。文章が単語に分割され、その単語ごとにインデックスが構築されます。

### keyword型

text型と同様に文字列ですが、**形態素解析が行われない。**
分割せずにインデックスを作成したい場合は、keywordを使用する。

### 数値型

long/short/integer/float　などが利用可能。数値の大小比較で検索を行うことができる。

### 真偽型

true,falseの指定ができる。

### オブジェクト型

JSONオブジェクト自体をデータとして扱うことができる。

### 配列型

各要素が同じ型を持つ、配列型を定義することができます。

## インデックスについて

ドキュメントは **インデックス** に保持されます。
Elasticsearchは、複数のサーバー（ノード）で起動し、それぞれのノードは分割されたインデックスを持ちます。
この時分割される単位を **「シャード(shard)」** と呼びます。

ドキュメントがどのような構成になっているか表す構造を **「ドキュメントタイプ」** と呼びます。
→ 例) 商品名、商品価格、在庫の有無のこと

ドキュメントタイプを実際に記述したものは **「マッピング（mapping）」** と呼ばれます。
Elasticsearchではドキュメントタイプを明示的に記載しなくても、型を自動的に予測してドキュメントを格納します。
text型とkeyword型のように区別がつかない場合は明示的に指定する必要があります。

![スクリーンショット 2021-08-02 11.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/8260b914-2d1f-f32a-7cad-db655cf4e3c1.png)

## クラスタについて

Elasticsearchは複数のノードで起動します。
１つのJVMにつき１つElasticsearchが立ち上がり、これが１ノードとなります。
複数のノードで起動した場合、それぞれのノードが強調して動作します。このノードのグループの単位を **「クラスタ」** と呼びます。

Elasticsearchは簡単な設定を行うだけで、
複数のノードで構成することができます。クラスタ構成にすることで、検索のドキュメント数の増大や、負荷の対策を行うことができます。また、 **「レプリケーション」** を行うことで、シャードが複製して配置されるようになります。

# Elasticsearch with Docker

実際にこれからDockerを使用して開発を進めます。

こちら以降はDockerの開発が終了したら更新して載せます。

ここまではElasticsearchの基礎編を記載しております。

# 参考文献

・[初めてのElasticsearch with Docker](https://qiita.com/kiyokiyo_kzsby/items/344fb2e9aead158a5545)
・[elastisearch-railsを使ってRailsでElasticsearchを動かす【初心者向け】]
(https://qiita.com/katsuhisa__/items/264f0c0c2085e6c27bd2)