1. ホーム
  2. java

[解決済み] Elasticsearchのインデックスとは

2022-03-06 02:52:17

質問

Elasticsearchのインデックスとは何ですか?一つのアプリケーションは複数のインデックスを持つのでしょうか、それとも一つでしょうか?

例えば、どこかの自動車メーカーのシステムを作ったとします。人、車、スペアパーツなどを扱います。メーカーという名前のインデックスを1つ持つのか、それとも人、車、スペアパーツのインデックスを1つずつ持つのか?どなたか説明してください。

解決方法は?

良い質問ですね。その答えは、予想以上に微妙です。 インデックスはいくつかの異なる目的で使用することができます。

リレーションシップのためのインデックス

最も簡単で馴染みやすいレイアウトは、リレーショナル・データベースから期待されるものと同じです。 インデックスをデータベースのように(非常に大雑把に)考えることができます。

  • MySQL => データベース => テーブル => 行/カラム
  • ElasticSearch => インデックス => タイプ => プロパティ付きドキュメント

ElasticSearch クラスタには、複数の Indices (データベース) があり、そのデータベースには複数の Types (テーブル)です。 これらの型は、複数の Documents (行) があり、それぞれのドキュメントには Properties (列)です。

つまり、自動車製造のシナリオでは SubaruFactory インデックスを作成します。 このインデックスの中に、3種類のタイプがあります。

  • People
  • Cars
  • Spare_Parts

そして、それぞれのタイプには、そのタイプに対応するドキュメントが含まれます(例えば、Subaru Imprezzaのドキュメントは、Subaru Imprezzaのドキュメントに含まれる Cars タイプです。 このドキュメントには、その特定の車に関するすべての詳細が含まれています)。

検索や問い合わせは、以下のような形式をとります。 http://localhost:9200/[インデックス]/[タイプ]/[オペレーション]

では、すばるの文書を取り出すにはどうすればいいかというと、次のようになります。

  $ curl -XGET localhost:9200/SubaruFactory/Cars/SubaruImprezza

.

ロギング用インデックス

さて、現実には、インデックスやタイプは、RDBMで慣れ親しんだデータベースやテーブルの抽象化よりもはるかに柔軟である。 これらは便利なデータ整理の仕組みと考えることができ、データの設定次第では性能上のメリットもあります。

根本的に異なるアプローチとして、多くの人がロギングにElasticSearchを使用していることを紹介します。 標準的なフォーマットは、日ごとに新しいインデックスを割り当てることです。 インデックスの一覧はこのようになります。

  • ログ-2013-02-22
  • ログ-2013-02-21
  • ログ-2013-02-20

ElasticSearchでは複数のインデックスを同時にクエリできるので、やっても問題ないです。

  $ curl -XGET localhost:9200/logs-2013-02-22,logs-2013-02-21/Errors/_search=q:"Error Message"

これは、過去2日間のログを同時に検索するものです。 この形式はログの性質上、利点があります - ほとんどのログは一度も見られず、時間の直線的な流れで構成されています。 ログごとにインデックスを作る方が論理的であり、検索のパフォーマンスも良くなります。

.

ユーザー向けインデックス

もう一つの根本的に異なるアプローチは、ユーザーごとにインデックスを作成することである。 あるソーシャル・ネットワーキング・サイトがあり、各ユーザーが大量のランダムなデータを持っているとする。 各ユーザーに対して一つのインデックスを作成することができます。 構造は次のようになります。

  • Zachのインデックス
    • 趣味の種類
    • 友人タイプ
    • ピクチャーズタイプ
  • フレッド・インデックス
    • 趣味の種類
    • 友人タイプ
    • ピクチャーズタイプ

この設定は、伝統的なRDBM方式で簡単にできることに注目してほしい(たとえば、趣味・友人・写真を型とした "Users"インデックス)。 そうすれば、すべてのユーザが1つの巨大なインデックスに放り込まれることになる。

その代わり、データ整理やパフォーマンス上の理由から、データを分割することが理にかなっている場合があります。 このシナリオでは、各ユーザに たくさん のデータを分離したい。 ElasticSearchでは、ユーザーごとにインデックスを作成しても問題ありません。