Elasticsearchの基本的ですが非常に便利な機能の1つ:エイリアス

0、キャプション

この記事はシリーズの最初の記事です。Elasticsearchの非常に基本的ですが非常に役立つ技術的なポイントをいくつか紹介します。これらの技術的なポイントを理解することで、より保守しやすいデータインデックスを設計し、PBレベルのビッグデータインデックスの実際の戦いの落とし穴を事前に把握し、作業効率を向上させることができます。

この記事では、エイリアスの分類、インデックスエイリアスの実践、インデックスエイリアスの利点、インデックスエイリアスの一般的な問題とピットの解釈、およびフィールドエイリアスの実践の5つの側面から詳細な解釈を提供します。

1.エイリアスの分類

Elasticsearchには2つのエイリアスのカテゴリがあります。

1.1インデックスエイリアス

公式の解釈:インデックスエイリアスは1つ以上のインデックスを指すことができ、インデックス名を必要とする任意のAPIで使用できます。エイリアスは私たちに大きな柔軟性を提供します。それらにより、次のことが可能になります。

1)実行中のクラスター上の1つのインデックスと別のインデックスを透過的に切り替えます。

2)複数のインデックスをグループ化して結合します(たとえば、過去3か月のインデックスエイリアス:過去3か月のlogstash201903、logstash201904、logstash_201905の組み合わせです)。

3)インデックス内のドキュメントのサブセットに「ビュー」を作成します(ビジネスシナリオと組み合わせると、取得効率が向上します)。

一般的な説明:インデックスエイリアスは似ています:Windowsショートカット、Linuxソフトリンク、mysqlビュー。

  • 前提条件:Elasitcsearchがインデックスを作成した後は、インデックス名を変更できません。多くのビジネスシナリオでは、単一のインデックスが要件を満たさない場合があります。

  • シナリオ1:ロールオーバーapiを使用して実現されるPBレベルの増分データは、日付に基づくn個のインデックスで構成されます。明らかに、外部サービスにエイリアスを使用すると非常に便利です。

  • シナリオ2:オンラインサービスのインデックスに問題があると想像してください。たとえば、特定のフィールドの定義が正確ではありません。外部サービスが停止しないようにし(ビジネスコードを変更せずに)、インデックスを置き換える方法。明らかに、エイリアスの方が適しています。 。

注:実際のビジネスシナリオでエイリアスを使用すると、非常に便利で、柔軟性があり、高速で、緩く結合されます。

1.2フィールドエイリアス

ElasticsearchMappingで定義されたバージョン6.4以降でのみ使用可能なフィールドタイプ。

人気のある説明:

ビジネスシナリオを想像してみてください。たとえば、実際のビジネス開発では、FacebookとTwitterを収集する必要があり、収集と保存は2つのビジネスチームです。

彼らはコンテンツに2つのフィールドを使用しました。それらの1つはコンテンツです。もう1つは続きです。現時点では、elasticsearchに2つのフィールドが保存されます。

では、ビジネスコードを検索して作成する場合、処理用に2つの異なるフィールドを作成する必要がありますか?フィールドとして記述できる場合、コードはビジネスカップリングを回避します。これは非常に便利です。

これがフィールドエイリアスの起源だと思います。

2.インデックスエイリアスの練習

2.1エイリアスがないと仮定して、マルチインデックス検索をどのように処理しますか?

  • 方法1:マルチインデックスのコンマ区切り検索。
POST visitor_logs_2017,visitor_logs_2018/_search
  • 方法2:ワイルドカードインデックス検索。
POST visitor_logs_*/_search

2.2エイリアスを使用すると、操作が簡単になります

実際の戦闘では、操作の実際のインデックス名を知る必要はありません。エイリアスを使用するユーザーに影響を与えることなく、エイリアスによって参照されるインデックスを透過的に変更できます。

  • ステップ1:エイリアスは既存のインデックスに関連付けられます。
POST /_aliases?pretty
{
  "actions": [
    {
      "add": {
        "index": "visitor_logs_2017",
        "alias": "visitor_logs"
      }
    },
    {
      "add": {
        "index": "visitor_logs_2018",
        "alias": "visitor_logs"
      }
    }
  ]
}
  • ステップ2:エイリアス検索を使用する
GET /visitor_logs/_search

3.インデックスエイリアスの利点

3.1大量のデータの管理

シナリオ:実際の戦闘では、時間ベースのデータ保持戦略(ロールオーバーメカニズムを使用して実装)が必要になる場合があり、古いデータがシステムから削除される場合があります。インデックスエイリアスを使用します。

  • 利点1:Elasticsearchからデータを削除するプロセスを簡素化する。

  • 利点2:ダウンタイムなし、クエリの中断なし、クライアントの変更なしで、Elasticsearchから最も古いデータを削除します。

時間インデックスに基づく実装メカニズムは次のとおりです。
Elasticsearchの基本的ですが非常に便利な機能の1つ:エイリアス
推奨される読み物:

考えてみてください。時間ベースのインデックスの代わりに大きなインデックスを使用する場合、履歴データを削除するとどうなりますか?

回答:

  • 1.インデックスデータの削除のみを使用できます。deletebyqueryは、インデックスの削除と比較して、論理的にのみデータを削除します。

  • 2.実際の削除は、実際には、セグメントがマージされた後のセグメントの物理的な削除です。つまり、deletebyqueryの後、ディスク領域は減少せず、一定期間増加します。このときの検索効率は非常に低くなります。

3.2ユーザーの認識なしにインデックスを再構築する

実際の戦闘では、インデックスの設計が1つのステップで実施されない場合があります。ビジネスが拡大するにつれて、インデックスマッピング構造は、次のような開発の中期および後期段階で調整される可能性があります。

  • 1)効率的な単語セグメンテーションのためにiksmartをikmax_word単語セグメンテーションに変更します。

  • 2)検索効率を向上させるためにlongタイプをキーワードに変更します。

  • 3)インデックスフラグメントの数を変更して、マシンの水平方向の拡張を容易にします。

  • 4)パフォーマンスを向上させるために、インデックスはより細かいインデックスに分割されます。

通常の方法では、次の支援が必要です。インデックスの移行を完了するためのインデックスの再作成操作。オンライン環境の信頼性の高い操作とユーザーの無意識を保証したい場合(つまり、ユーザーに通知する必要がなく、ユーザーのビジネスに影響がない場合)、変更の前後にエイリアスを使用してインデックスを指すことは優れたソリューションです。

実用例:

POST /_aliases?pretty
{
  "actions": [
    {
      "remove": {
        "index": "visitor_logs_2018",
        "alias": "visitor_logs"
      }
    },
    {
      "add": {
        "index": "visitor_logs_2018_01",
        "alias": "visitor_logs"
      }
    }
  ]
}

想像してみてください。インデックスエイリアスがない場合はどうなりますか?

回答:

  • 1.クエリの継続性は保証できません。

  • 2.オンラインビジネスクエリの信頼性は保証できません(ビジネスが一定期間中断されることをユーザーに通知する必要があります)。

4.一般的な問題とインデックスエイリアスの解釈

質問1:ESバルクインサートはエイリアスインサートを使用できますか?

エラーを報告します:

alias [xxx] ...に書き込みインデックスが定義されていません。

注:インデックスエイリアスはユニバーサルではありません。データを書き込んだり更新したりするときは、物理インデックスを指定する必要があり、エイリアスにデータを書き込まないでください。

質問2:ESはどのようにしてすべてのエイリアス情報エイリアスを取得しますか?

または質問:インデックスエイリアスによって実際のインデックス名を見つける方法は?

GET _cat/aliases

返されたメッセージ:

visitor_logs visitor_logs_2017 - - -
.kibana      .kibana_1         - - -
visitor_logs visitor_logs_2018 - - 
`

質問3:エイリアスの使用はインデックスベースの効率と同じですか?

一貫しています。

前提条件:インデックスとエイリアスが同じデータと同じ検索条件を指している。

原則:インデックスエイリアスは、物理インデックスのソフトリンクの名前にすぎません。

質問4:エイリアスを使用して検索効率を向上させる方法は?

  • 方法1:時間に基づいてインデックスを作成し、複数のインデックスエイリアスを指定します。たとえば、過去1年間のインデックスエイリアス、過去3か月のインデックスエイリアス、過去1か月のインデックスエイリアス、過去1週間のインデックスエイリアス、過去3日間のインデックスエイリアスに分けられます。検索するときは、最初に時間範囲を決定してから、指定した範囲のエイリアスで検索します。

コア原則:時間に基づく物理的な分離と、ホットデータとコールドデータを分離するメカニズムを組み合わせることで、検索サンプルが大幅に削減されます。

  • 方法2:フィルターエイリアスまたはルーティングエイリアスメカニズムを使用して、効率を向上させます。フィルタエイリアスのコードは実際のビジネスでは見落とされがちですが、効率が大幅に向上します。
POST /_aliases
{
    "actions" : [
        {
            "add" : {
                 "index" : "test1",
                 "alias" : "alias2",
                 "filter" : { "term" : { "user" : "kimchy" } }
            }
        }
    ]
}

ルーティングメカニズムは、公式ドキュメントを参照できます。

5.フィールドエイリアスを練習する

スターフレンズの質問:

「Aliasdatatype、実際の作業でのこのデータタイプの使用シナリオは何ですか?公式ドキュメントを見て、よく理解していませんか?」

フィールドエイリアスの原則の最初の部分は詳細に説明されており、繰り返されません。ここで練習して、理解を深めてください。

PUT trips
{
  "mappings": {
    "_doc": {
      "properties": {
        "distance": {
          "type": "long"
        },
        "route_length_miles": {
          "type": "alias",
          "path": "distance"
        },
        "transit_mode": {
          "type": "keyword"
        }
      }
    }
  }
}

注:ユーザーが検索を使用する場合、実際には距離の代わりにroutelengthmileフィールドを使用して検索し、距離と同じ効果を得ることができます。

6.まとめ

  • 実際の戦闘では、インデックスエイリアスの美しさは、通常、開発の中期および後期に発見されます。記事で分析されているように:1。効率的なインデックス管理; 2。ユーザーはメンテナンスデータの変更や更新を認識しません。

  • 提案:同じインデックスエイリアスを持つ物理インデックスは、検索効率を向上させるために一貫したマッピングとデータ構造を持っています。

  • 注:検索でインデックスエイリアスを利用するには、書き込みと更新で物理インデックスを使用する必要があります。

実際のElasticsearchのビジネスシナリオでは、実際の開発に役立つ非常に基本的で有用な技術的ポイントは何ですか?メッセージを残し、あなたの考えを残すことを歓迎します、私たちは一緒に一生懸命働きましょう!

参照:

https://cambium.consulting/articles/2018/2/22/our-favorite-elasticsearch-features-part-2-index-aliases

推奨読書:

重い| Elasticsearch7.X学習ロードマップ

Elasticsearch 7.0が正式にリリースされました、彼を手放してください!

乾物| Elasticsearch7.1の無料セキュリティ機能パノラマ認識

Elasticsearchの基本的ですが非常に便利な機能の1つ:エイリアス

地球に参加して、より少ない時間とより速くより多くの乾物を学びましょう!

おすすめ

転載: blog.51cto.com/15050720/2562063