프로덕션 환경에서 Elasticsearch 배포: 모범 사례 및 문제 해결 팁 - 집계 및 검색(3)

머리말

여기에 이미지 설명 삽입
"저자 홈페이지" : Sprite Youbai Bubbles
"개인 홈페이지" : Sprite 개인 홈페이지
"추천 칼럼" :

Java 원스톱 서비스
입문에서 숙달로 반응
멋진 프런트엔드 코드 공유
0에서 영웅으로, Vue가 신이 되는 길
uniapp-구축에서 승진까지
0에서 영웅으로, Vue가 신이 되어가는 길
하나의 컬럼으로 알고리즘을 풀 수 있다
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라는 인덱스에서 평균 메트릭 작업을 수행하는 코드 예제입니다.

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 측정 작업을 수행하고 age 필드의 평균 값을 반환합니다.

2. CURL 명령을 사용하여 측정 작업 수행

CURL 명령을 사용하여 다양한 메트릭 작업을 수행할 수도 있습니다. 다음은 my_index라는 인덱스에서 avg 메트릭 작업을 사용하여 모든 문서를 검색하는 예입니다.

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에는 쿼리 캐시와 필터 캐시라는 두 가지 유형의 캐시가 있습니다. 쿼리 캐싱은 동일한 쿼리 결과에 대한 빠른 응답을 제공하는 반면 필터 캐싱은 후속 검색에서 빠르게 사용할 수 있도록 필터 결과를 캐시합니다. 다음은 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를 이용하여 Load Balancing 기능을 추가하는 코드 예시입니다.

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>

위의 코드는 Java 프로젝트에 elasticsearch-rest-high-level-client 클라이언트 라이브러리를 추가합니다.

다음은 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