本番環境への Elasticsearch のデプロイ: ベスト プラクティスとトラブルシューティングのヒント - 集約と検索 (3)

序文

ここに画像の説明を挿入
「作者のホームページ」Sprite Youbai Bubbles
「個人サイト」スプライトの個人サイト
「おすすめコラム」

Java ワンストップ サービス
入門から習熟まで対応
クールなフロントエンド コード共有
0 からヒーロー、Vue が神になるまでの道
uniapp-構築からプロモーションまで
0 からヒーロー、 Vueが神になる道
アルゴリズムは1カラムで解ける
0からアーキテクチャを語ろう
データの循環の絶妙なやり方
先進的なバックエンドへの道

画像の説明を追加してください

ここに画像の説明を挿入

集計と分析

Elasticsearch で集計と測定の操作を実行すると、データをより詳細に分析するのに役立ちます。この記事では、集計とメジャーを使用して、カウント、平均、パーセンタイル、グループ化などの複雑なデータ分析操作を実行する方法について説明します。

集計操作を実行する

1. Java API を使用して集計操作を実行する

Java API を使用して、さまざまな集計操作を実行できます。以下は、RestHighLevelClient オブジェクトを使用して、my_index という名前のインデックス内の用語の集計を実行するコード例です。

SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder aggregation =
    AggregationBuilders.terms("by_age").field("age");
sourceBuilder.aggregation(aggregation);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

上記のコードは、SearchRequest オブジェクトと SearchSourceBuilder オブジェクトを使用して、用語の集計操作を実行し、年齢フィールドごとにグループ化します。

2. CURL コマンドを使用して集計操作を実行します。

CURL コマンドを使用して、さまざまな集計操作を実行することもできます。以下は、my_index という名前のインデックスで用語集計操作を使用してすべてのドキュメントを取得する例です。

curl -XGET 'localhost:9200/my_index/_search?pretty' -H 'Content-Type: application/json' -d'
{
    "aggs" : {
        "by_age" : {
            "terms" : { "field" : "age" }
        }
    }
}
'

測定操作の実行

1. Java APIを使用して測定操作を実行する

Java API を使用して、さまざまなメトリック操作を実行できます。以下は、RestHighLevelClient オブジェクトを使用して、my_index という名前のインデックスで avg メトリック操作を実行するコード例です。

SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
AvgAggregationBuilder aggregation =
    AggregationBuilders.avg("avg_age").field("age");
sourceBuilder.aggregation(aggregation);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

上記のコードは、SearchRequest オブジェクトと SearchSourceBuilder オブジェクトを使用して avg 測定操作を実行し、年齢フィールドの平均値を返します。

2. CURL コマンドを使用して測定操作を実行します。

CURL コマンドを使用して、さまざまなメトリック操作を実行することもできます。以下は、my_index という名前のインデックスで avg metric 操作を使用してすべてのドキュメントを取得する例です。

curl -XGET 'localhost:9200/my_index/_search?pretty' -H 'Content-Type: application/json' -d'
{
    "aggs" : {
        "avg_age" : {
            "avg" : { "field" : "age" }
        }
    }
}
'

結論は

この記事では、集計とメジャーを使用して、カウント、平均、パーセンタイル、グループ化などの複雑なデータ分析操作を実行する方法について説明します。Elasticsearch インデックス内のデータは、Java API または CURL コマンドを使用して集計および測定することができ、データの理解と分析が向上します。実際のアプリケーションでは、特定のニーズに応じて、適切な集計および測定操作を選択して使用する必要があります。

検索パフォーマンスの最適化

Elasticsearch の検索パフォーマンスの最適化は、アプリケーションの非常に重要な部分です。この記事では、キャッシュの使用、シャードのサイズと数の調整、検索候補の使用によって Elasticsearch の検索パフォーマンスを最適化する方法について説明します。

キャッシュを使用する

Elasticsearch には、クエリ キャッシュとフィルター キャッシュの 2 種類のキャッシュがあります。クエリ キャッシュは同じクエリ結果に対して高速な応答を提供し、フィルター キャッシュは後続の検索ですぐに使用できるようにフィルター結果をキャッシュします。Java API を使用してフィルター キャッシュを有効にするコード例を次に示します。

SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("age", 30));
sourceBuilder.postFilter(QueryBuilders.termQuery("city", "New York"));
sourceBuilder.size(0);
sourceBuilder.aggregation(AggregationBuilders.avg("avg_age").field("age"));
sourceBuilder.aggregation(AggregationBuilders.terms("by_city").field("city"));
sourceBuilder.profile(true);
sourceBuilder.cache(true);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

上記のコードは、SearchSourceBuilder オブジェクトを使用してフィルター キャッシュを有効にします。

シャードのサイズと数を調整する

シャードは Elasticsearch のデータの基本単位であり、データを複数のシャードに分割することで、Elasticsearch は大規模なデータセットをより適切に処理できるようになります。ただし、シャードが大きすぎたり小さすぎたりすると、検索パフォーマンスに影響します。以下は、Java API を使用してインデックス シャードとバックアップの数を設定するコード例です。

CreateIndexRequest request = new CreateIndexRequest("my_index");
request.settings(Settings.builder()
        .put("index.number_of_shards", 5)
        .put("index.number_of_replicas", 1));

上記のコードは、CreateIndexRequest オブジェクトを使用して、my_index という名前のインデックスのシャード数を 5 に、バックアップ数を 1 に設定します。

検索候補を使用する

検索候補は、Elasticsearch における重要な検索最適化手法です。ユーザーが検索クエリを入力するときに、オートコンプリート、スペルチェック、関連性の提案などの機能を提供できます。Java API を使用して全文ベースの推奨検索候補を追加するコード サンプルを次に示します。

SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
SuggestionBuilder termSuggestionBuilder =
    SuggestBuilders.termSuggestion("name").text("jonh");
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("suggest_name", termSuggestionBuilder);
sourceBuilder.suggest(suggestBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

上記のコードは、SearchSourceBuilder オブジェクトを使用して、全文ベースの検索候補を追加します。

結論は

この記事では、キャッシュの使用、シャードのサイズと数の調整、検索候補の使用によって Elasticsearch の検索パフォーマンスを最適化する方法について説明します。これらのテクノロジーを使用すると、検索の応答性が向上し、ユーザー エクスペリエンスが向上します。実際のアプリケーションでは、特定の検索要件に応じて適切な最適化方法を選択する必要があります。

クラスタ管理

Elasticsearch クラスターの構成と管理は、大規模な Elasticsearch アプリケーションを正常に実行するための鍵となります。この記事では、ノード検出、負荷分散、フェイルオーバーなどの操作を実行して、Elasticsearch クラスターを構成および管理する方法を紹介します。

ノードの検出

ノード検出は Elasticsearch の重要な概念であり、これにより新しいノードが既存の Elasticsearch クラスターに参加できるようになります。以下は、Java API を使用してノード検出を有効にするコード例です。

Settings settings = Settings.builder()
    .put("discovery.seed_hosts", "host1:9300,host2:9300")
    .put("cluster.name", "my_cluster_name")
    .build();
TransportClient client = new PreBuiltTransportClient(settings);

上記のコードは、Settings オブジェクトを使用してノード検出を有効にし、ノード リストを host1 と host2 に設定します。

負荷分散

負荷分散は分散システムにおいて非常に重要な部分であり、システム内のすべてのノードが負荷を均等に運ぶことができます。以下は、Java API を使用して負荷分散機能を追加するコード例です。

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http"))
                .setHttpClientConfigCallback(httpClientBuilder -> 
                    httpClientBuilder.addInterceptorLast(new ElasticsearchInterceptor())));

上記のコードは、RestClient オブジェクトを使用して ElasticsearchInterceptor という名前のインターセプターを追加し、負荷分散を実現します。

フェイルオーバー

フェイルオーバーは、Elasticsearch クラスターで考慮する必要がある問題です。ノードに障害が発生した場合は、別のノードに置き換えるための即時措置が必要です。Java API を使用して自動フェイルオーバー機能を追加するコード例を次に示します。

Settings settings = Settings.builder()
    .put("cluster.routing.allocation.enable", "all")
    .put("cluster.routing.allocation.node_initial_primaries_recoveries", 20)
    .put("cluster.routing.allocation.node_concurrent_recoveries", 2)
    .put("indices.recovery.max_bytes_per_sec", "50mb")
    .build();

上記のコードは、自動フェイルオーバー機能を有効にし、インデックスの回復速度や同時回復の数などのいくつかの関連パラメーターを設定します。

結論は

この記事では、ノード検出、負荷分散、フェイルオーバーのために Elasticsearch クラスターを構成および管理する方法について説明します。これらの技術により、Elasticsearch アプリケーションの安定性、信頼性、効率性が向上します。実際のアプリケーションでは、特定のニーズを満たすために適切な構成オプションと管理ソリューションを選択する必要があります。

セキュリティとアクセス制御

Elasticsearch クラスターとデータを保護することは、本番アプリケーションにとって必須です。この記事では、アクセス制御、暗号化、認証などの技術を使用して Elasticsearch のセキュリティを向上させる方法について説明します。

アクセス制御

アクセス制御は Elasticsearch の非常に重要な概念であり、許可されたユーザーのみが Elasticsearch クラスターとデータにアクセスできるようにします。Java API を使用してユーザー名/パスワード ベースのアクセス制御を追加するコード サンプルを次に示します。

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http"))
                .setHttpClientConfigCallback(httpClientBuilder -> 
                    httpClientBuilder.setDefaultCredentialsProvider(
                        new BasicCredentialsProvider()))
                .setRequestConfigCallback(requestConfigBuilder -> 
                    requestConfigBuilder.setConnectTimeout(5000)
                                         .setSocketTimeout(60000)));

上記のコードは、RestClient オブジェクトを使用して、ユーザー名/パスワード ベースのアクセス制御を実装するデフォルトの資格情報プロバイダーとして BasicCredentialsProvider オブジェクトを追加します。

暗号化

暗号化により、Elasticsearch クラスター内およびデータ転送中のセキュリティが確保されます。以下は、Java API を使用して HTTPS 暗号化を有効にするコード サンプルです。

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "https")));

上記のコードは、RestClient オブジェクトを使用して HTTPS 暗号化プロトコルを有効にし、データ送信のセキュリティを確保します。

認証

認証は Elasticsearch の非常に重要な概念であり、許可されたユーザーのみが Elasticsearch クラスターとデータにアクセスして変更できるようにします。以下は、Java API を使用して X-Pack ベースの認証機能を追加するコード サンプルです。

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "https"))
                .setHttpClientConfigCallback(httpClientBuilder -> 
                    httpClientBuilder.setDefaultCredentialsProvider(
                        new BasicCredentialsProvider()))
                .setRequestConfigCallback(requestConfigBuilder -> 
                    requestConfigBuilder.setConnectTimeout(5000)
                                         .setSocketTimeout(60000))
                .setXpackBuilder(XPackClientBuilder.builder("username", "password")));

上記のコードは、RestClient オブジェクトを使用して X-Pack ベースの認証を有効にし、ユーザー名とパスワードを「username」と「password」に設定します。

結論は

この記事では、アクセス制御、暗号化、認証などの技術を使用して Elasticsearch のセキュリティを向上させる方法について説明します。これらのテクノロジーは、Elasticsearch クラスターとデータのセキュリティを確保し、不正なアクセスや攻撃から保護します。実際のアプリケーションでは、特定の要件に応じて適切なセキュリティ対策を選択する必要があります。

アプリケーションの統合

Elasticsearch をアプリケーションに統合することは、データの検索と分析を可能にする鍵となります。この記事では、REST API とさまざまなクライアント ライブラリを使用して Elasticsearch をアプリケーションに統合する方法を説明します。

REST API

Elasticsearch は、アプリケーションが HTTP プロトコルを通じて Elasticsearch と対話できるようにする REST API を提供します。Java コードを使用して Elasticsearch インデックスにドキュメントを追加する例を次に示します。

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));
IndexRequest request = new IndexRequest("my_index");
request.id("1");
String jsonString = "{" +
        "\"name\":\"John\"," +
        "\"age\":30," +
        "\"city\":\"New York\"" +
        "}";
request.source(jsonString, XContentType.JSON);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);

上記のコードは、RestHighLevelClient オブジェクトを使用して、ID 1 のドキュメントを「my_index」という名前のインデックスに追加します。

クライアントライブラリ

Elasticsearch は、アプリケーションが Elasticsearch とより簡単に対話できるように、さまざまな言語のクライアント ライブラリも提供します。以下は、Java API を使用して Elasticsearch クライアント ライブラリを追加するコード例です。

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
  <version>7.14.0</version>
</dependency>

上記のコードは、elasticsearch-rest-high-level-client クライアント ライブラリを Java プロジェクトに追加します。

Java コードを使用してドキュメントを Elasticsearch インデックスに追加するクライアント ライブラリの例を次に示します。

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));
IndexRequest request = new IndexRequest("my_index");
request.id("1");
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("name", "John");
jsonMap.put("age", 30);
jsonMap.put("city", "New York");
request.source(jsonMap);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);

上記のコードは、RestHighLevelClient オブジェクトと Elasticsearch クライアント ライブラリを使用して、ID 1 のドキュメントを「my_index」という名前のインデックスに追加します。

結論は

この記事では、REST API とさまざまな言語のクライアント ライブラリを使用して、Elasticsearch をアプリケーションに統合する方法について説明します。これらの方法により、アプリケーションは Elasticsearch とより効率的に対話できるようになり、データの検索や分析などの機能が可能になります。実際のアプリケーションでは、特定の要件に応じて適切な統合方法を選択する必要があります。

おすすめ

転載: blog.csdn.net/Why_does_it_work/article/details/132178277