엘라스틱 서치 개발 회고(2)

Caesars·2021년 8월 6일
1

Elasticsearch

목록 보기
3/4

사용 환경은 ElasticSearch(이하 ES) 7.6.1
그리고 스프링 부트 2.4 환경에서 작업하였습니다.

ES 설정

elasticsearch.yml

master node
node.master : true
data node
node.data : true

인덱스 템플릿

인덱스 템플릿은 설정이 동일한 복수의 인덱스를 만들때 사용됩니다. 이 문서에서는 인덱스명을 user-YYYY.MM.DD 의 형태로 생성. ES 에서 날짜 포맷을 YYYY.MM.DD 로 설정하는 것을 권장하기 때문입니다.
쿼리 속도를 빠르게 하기 위해 refresh_interval 은 3600s 으로 설정.
data가 insert되고 refresh 되어야 검색이 가능하지만 refresh가 빈번할수록 리소스 소모.
따로 형태소 분석기를 설정하지 않았기에 자동적으로 standard analayzer가 적용되었습니다.

템플릿 샘플

{
  "properties": {
      "goods": {
        "type": "nested",
        "properties": {
          "code": {
            "type": "keyword"
          },
          "category": {
            "type": "text"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "count": {
            "type": "integer"
          },
          "price": {
            "type": "long"
          },
        }
      },
      "loginId": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "date": {
        "format": "yyyy-MM-dd'T'HH:mm:ss.SSSX",
        "type": "date"
      },
      "userIp": {
        "index": true,
        "store": false,
        "type": "ip",
        "doc_values": true
      }
    }
}

Mapping 설정을 다 적을 수는 없기에 몇몇 중요 필드의 타입만 적었습니다. 한번 타입이 지정된 경우 수정할 방법이 없기에 상황에 맞게 설정해야 합니다. ES의 중요 필드 데이터 타입은 다음과 같습니다.

  • keyword, text : 문자열 데이터 타입
  • date, long, double, integer, boolean, ip : 일반적인 데이터 타입
  • nested : 객체 또는 중첩문과 같은 계층의 데이터 타입

버킷사이즈

default 사이즈는 1만. 버킷 사이즈가 작을 수록 응답이 빠르지만 result size가 클수록 여러 번 호출 해야 한다. 또한 사이즈가 클수록 리소스 사용으로 성능 문제를 야기할 수 있다.
버킷 사이즈 바꿔가며 테스트 한 결과 10만으로 설정.
변경 사항 적용되려면 ElasticSearch 재 시작 필요.

PUT _cluster/settings
{
  "persistent": { "search.max_buckets": 100000 } 
}

샤드리미트

default는 노드 당 1천개. 만약 샤드의 개수가 1천개를 넘어가면 index 생성이 되지 않으므로 수정이 필요.

PUT /_cluster/settings
{
  "persistent" : {
    "cluster.max_shards_per_node" : "3000"
  }
}

SpringBoot

application.yml

elasticsearch:
serviceName: es
region: ap-northeast-2
aesEndpoint:
port: 9200
username:
password:
enabled: false

build.gradle

dependencies {
implementation 'org.elasticsearch:elasticsearch:7.6.2'
implementation 'org.elasticsearch:elasticsearch-core:7.6.2'
implementation 'org.elasticsearch.client:elasticsearch-rest-client:7.6.2'
}

Config 등록

@Configuration
public class ElasticSearchConfig {

    @Value("${elasticsearch.serviceName}")
    private String serviceName;
    
    @Value("${elasticsearch.region}")
    private String region;
    
    @Value("${elasticsearch.aesEndpoint}")
    private String aesEndpoint;
    
    @Value("${elasticsearch.port}")
    private int port;

    @Value("${elasticsearch.username}")
    private String username;
    
    @Value("${elasticsearch.password}")
    private String password;

    @Bean
    public RestClient restClient() {
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));

        return RestClient.builder(HttpHost.create(aesEndpoint+":"+port)).setHttpClientConfigCallback(hacb -> hacb
                .disableAuthCaching().setDefaultCredentialsProvider(credentialsProvider))
                .build();
    }      
}
profile
잊기전에 저장

0개의 댓글