사용 환경은 ElasticSearch(이하 ES) 7.6.1
그리고 스프링 부트 2.4 환경에서 작업하였습니다.
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의 중요 필드 데이터 타입은 다음과 같습니다.
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"
}
}
elasticsearch:
serviceName: es
region: ap-northeast-2
aesEndpoint:
port: 9200
username:
password:
enabled: false
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'
}
@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();
}
}