原作者:Ruan Yifeng
全文検索が最も一般的な要件です。現在、オープンソースの ElasticSearch (以下、Elasticと呼びます)が全文検索エンジンの最初の選択肢です。
大量のデータをすばやく保存、検索、分析できます。ウィキペディア、スタックオーバーフロー、Githubはすべてそれを採用しています。
Elasticの最下層は、オープンソースライブラリの Luceneです。ただし、Luceneを直接使用することはできません。そのインターフェースを呼び出すには、独自のコードを作成する必要があります。ElasticはLuceneのカプセル化であり、RESTAPIの操作インターフェースを提供します。これはそのまま使用できます。
1.ほぼリアルタイム
Elasticsearchは、ほぼリアルタイムのクエリを提供できる検索サービスエンジンです。つまり、ドキュメントのインデックス作成から実際の検索可能になるまでにわずかな遅延(約1秒)が発生します。
2. Node 与 Cluster
Elasticは基本的に、複数のサーバーが連携できる分散データベースであり、各サーバーは複数のElasticインスタンスを実行できます。単一のElasticインスタンスはノードと呼ばれます。ノードのグループはクラスター(クラスター)を構成します。
3.インデックス
Elasticは、すべてのフィールドにインデックスを付け、処理後に転置インデックス(Inverted Index)を書き込みます。データを検索するときは、インデックスを直接検索してください。したがって、Elasticデータ管理の最上位ユニットはインデックスと呼ばれ、単一のデータベースと同義です。各インデックス(つまりデータベース)の名前は小文字でなければなりません。
次のコマンドは、現在のノードのすべてのインデックスを表示できます。
$ curl -X GET 'http://localhost:9200/_cat/indices?v'3..4
4.文書化
インデックス内の単一のレコードはドキュメントと呼ばれます。多くのドキュメントがインデックスを構成します。ドキュメントはJSON形式で表現されています。以下に例を示します。
{ "user": "张三", "title": "工程师", "desc": "数据库管理" }
同じインデックス内のドキュメントは、同じ構造(スキーム)である必要はありませんが、同じ状態を維持することをお勧めします。これにより、検索効率が向上します。
5.タイプ
ドキュメントはグループ化できます。たとえば、weather
このインデックスでは、都市(北京と上海)または気候(晴れと雨)でグループ化できます。このグループ化はタイプと呼ばれ、ドキュメントのフィルタリングに使用される仮想論理グループ化です。異なるタイプは同様の構造(スキーマ)を持つ必要があります。たとえば、id
フィールドをこのグループの文字列にしたり、別のグループの数値にしたりすることはできません。これは、リレーショナルデータベーステーブルとの違いです。完全に異なるプロパティ(products
sumなどlogs
)を持つデータは、1つのインデックスに2つのタイプではなく、2つのインデックスとして格納する必要があります(ただし、格納することはできます)。
次のコマンドは、各インデックスに含まれるタイプを一覧表示できます。
$ curl 'localhost:9200/_mapping?pretty=true'
計画によれば、Elastic 6.xバージョンでは、各インデックスに1つのタイプのみを含めることができ、7.xバージョンではタイプが完全に削除されます。
6.断片化とレプリケーションの管理
理論的には、インデックスは可能な限り多くのデータを格納できますが、この場合、パフォーマンスが楽観的でないか、一般的なディスク容量の制限で許可されないことがよくあります。そのため、Elasticsearchは、MongoDBと同様のシャーディング機能を提供します。これにより、インデックスを複数のシャードに分割できます。各シャード自体は完全に機能する独立した「インデックス」であり、クラスター内の任意のノードでホストできます。
同様に、急速なデータ増加の問題に対処するためのシャーディングテクノロジーがあります。つまり、このプロセスでデータセキュリティの問題に対処するにはレプリケーションテクノロジーが必要です(実際、それはプロセスだけではなく、セキュリティの認識はどんな状況でも)。Elasticsearchを使用すると、インデックスシャードの1つ以上のコピーをいわゆるレプリカシャードに変換できます。レプリケーションテクノロジーは、データの高可用性と検索スループットのスケーラビリティを提供します。ただし、レプリカシャードは、コピー元の元のシャード/プライマリシャードと同じノードに割り当てられることはないことに注意してください。
全体として、各インデックスは複数のシャードに分割できます。インデックスは、ゼロ(コピーなしを意味する)またはそれ以上にコピーすることもできます。コピーされると、各インデックスにはプライマリシャード(インデックスからコピーされた元のシャード)とレプリカシャード(プライマリシャードのコピー)が含まれます。開発者は、インデックスを作成するときに、各インデックスのシャードとレプリカの数を定義できます。インデックスの作成後、レプリカの数はいつでも動的に変更できますが、このプロセスの直後にシャードの数を変更することはできません。