ν˜„μž¬ 쑰직의 μ£Όμš” μ†”λ£¨μ…˜μ€ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ 1.6을 기반으둜 λ™μž‘ν•˜λ©° μ—¬λŸ¬κ°œμ˜ λ…Έλ“œλ‘œ κ΅¬μ„±λ˜λŠ” μ—˜λΌμŠ€ν‹±μ„œμΉ˜ ν΄λŸ¬μŠ€ν„°λ‘œ μš΄μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, μ œκ°€ λ‹΄λ‹Ήν•˜μ—¬ κ°œλ°œμ€‘μΈ μ‹ κ·œ μ‹œμŠ€ν…œμ€ μ‹œκ³„μ—΄ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©μ€‘μ΄λ―€λ‘œ μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ— μ‹œκ³„μ—΄ 데이터와 같은 λŒ€κ·œλͺ¨ 데이터 및 μ•ˆμ „ν•˜κ²Œ μš΄μš©λ˜μ–΄μ•Όν•˜λŠ” κ°€μš©μ„±μ΄ μš”κ΅¬λ˜μ§€ μ•ŠμœΌλ―€λ‘œ 단일 λ…Έλ“œ ν΄λŸ¬μŠ€ν„°λ‘œ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ‹±κΈ€ λ…Έλ“œ ν΄λŸ¬μŠ€ν„°λ‘œ μš΄μš©λ˜λŠ” μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ—λŠ” μ‹œμŠ€ν…œμ—μ„œ λ°œμƒν•˜λŠ” νŠΉμ • 정보에 λŒ€ν•œ 둜그 데이터λ₯Ό κ°œλ³„ 단일 μΈλ±μŠ€μ— μ €μž₯ν•˜κ³  있으며 μ—˜λΌμŠ€ν‹±μ„œμΉ˜λ‘œλΆ€ν„° 정해진 μΈλ±μŠ€μ— μ €μž₯λ˜λŠ” λ„νλ¨ΌνŠΈλ₯Ό μ‘°νšŒν•˜κΈ° λ•Œλ¬Έμ— μ—˜λΌμŠ€ν‹±μ„œμΉ˜κ°€ μ§€μ›ν•˜λŠ” μ—¬λŸ¬κ°€μ§€ 쿼리λ₯Ό ν™œμš©ν•  κ²½ν—˜μ€ λ§Žμ§€ μ•Šμ€ 것은 μ•„μ‰¬μš΄ 뢀뢄이긴 ν•©λ‹ˆλ‹€.

μ‹œκ³„μ—΄ λ°μ΄ν„°λŠ” μ—˜λΌμŠ€ν‹±μ„œμΉ˜κ°€ μ•„λ‹Œ λ³„λ„μ˜ μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜κ³  톡계 정보λ₯Ό μΏΌλ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

인덱슀 κ΄€λ ¨ νŠΈλŸ¬λΈ”μŠˆνŒ…

λŒ€κ·œλͺ¨ λ…Έλ“œλ‘œ κ΅¬μ„±λœ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ ν΄λŸ¬μŠ€ν„°λ₯Ό μš΄μš©ν•˜μ§€ μ•Šλ”λΌλ„ μΈλ±μŠ€μ™€ κ΄€λ ¨λœ μ—¬λŸ¬κ°€μ§€ λ¬Έμ œλ“€μ„ κ°„κ°„νžˆ κ²½ν—˜ν•΄λ³΄κΈ΄ ν–ˆμŠ΅λ‹ˆλ‹€. 였히렀 μ—˜λΌμŠ€ν‹±μ„œμΉ˜κ°€ κ³  κ°€μš©μ„±μœΌλ‘œ μš΄μ˜λ˜μ§€ μ•Šμ•„μ„œ λ°œμƒν•˜λŠ” 문제둜 봐야할 것 κ°™μŠ΅λ‹ˆλ‹€.

동적 맀핑 ν•„λ“œ μ œν•œ

쑰직의 κΈ°μ‘΄ μ†”λ£¨μ…˜μ΄ μ—˜λΌμŠ€ν‹±μ„œμΉ˜λ₯Ό μ£Όμš” λ°μ΄ν„°λ² μ΄μŠ€λ‘œ ν™œμš©ν–ˆλ”λΌλ„ μ£Ό κ°œλ°œμžλ“€μ΄ ν˜„μž¬ κ°œλ°œμ€‘μΈ μ‹œμŠ€ν…œμ— μ°Έμ—¬ν•œ 것은 μ•„λ‹ˆκ³  μ €λŠ” 쑰직의 μ‹ μž…μΌ λ•Œ μ°Έμ—¬ν–ˆμœΌλ―€λ‘œ μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ— λŒ€ν•΄ λŒ€λž΅μ μΈ κ°œλ…μ‘°μ°¨ λͺ¨λ₯΄λ˜ μ‹œκΈ°μ˜€μŠ΅λ‹ˆλ‹€. μ‹œμŠ€ν…œμ˜ μš”κ΅¬ 사항과 섀계가 λͺ…ν™•ν•˜μ§€ μ•Šμ•˜κΈ°μ— μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” 동적 ν•„λ“œ 맀핑을 톡해 κ°œλ°œμžκ°€ λ³„λ„λ‘œ κ΄€λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λ„νλ¨ΌνŠΈμ— λŒ€ν•œ 각 ν•„λ“œλ“€μ„ μžλ™μœΌλ‘œ λ§€ν•‘ν•˜λŠ” μƒνƒœλ‘œ μ‹œμŠ€ν…œμ—μ„œ λ°œμƒν•˜λŠ” 일뢀 μ •λ³΄μ˜ 변화듀을 둜그둜 μ €μž₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

limit of total fields 1000 has been exceeded

μœ„ λ¬Έμ œλŠ” 동적 ν•„λ“œ λ§€ν•‘μœΌλ‘œ λ§Œλ“€μ–΄μ§€λŠ” μΈλ±μŠ€μ— μ—¬λŸ¬κ°€μ§€ ν•„λ“œκ°€ μ €μž₯λ˜μ–΄μ§ˆλ•Œ 확인할 수 μžˆλŠ” 였λ₯˜μž…λ‹ˆλ‹€. μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ— μ €μž₯λ˜λ„λ‘ν•œ 둜그 μ€‘μ—μ„œ λ‹€μ–‘ν•˜κ²Œ ν•„λ“œκ°€ 변경될 수 μžˆλŠ” 메타데이터 μ˜€λΈŒμ νŠΈκ°€ ν¬ν•¨λ˜μ—ˆκ³  점점 λ‹€μ–‘ν•œ ν‚€ 값이 μΆ”κ°€λ˜λ©΄μ„œ μ—˜λΌμŠ€ν‹±μ„œμΉ˜λŠ” 동적 맀핑에 μ˜ν•΄ 메타데이터 킀에 λŒ€ν•œ ν•„λ“œ 맀핑을 μΆ”κ°€ν•˜μ—¬ 맀핑 정보가 점차 λŠ˜μ–΄λ‚˜μ„œ μ œν•œλŸ‰κΉŒμ§€ λ„˜μ–΄μ„œκ²Œ λ˜λŠ” 상황이 λ°œμƒν•œ 것 μž…λ‹ˆλ‹€.

이 λ¬Έμ œμ— λŒ€ν•΄μ„œλŠ” μž„μ‹œμ μœΌλ‘œ μΈλ±μŠ€μ— λŒ€ν•΄ ν•„λ“œ μ œν•œ 수λ₯Ό μ‘°μ •ν•˜μ—¬ μ‘°μΉ˜ν•  수 μžˆμœΌλ‚˜ 메타데이터 μ˜€λΈŒμ νŠΈκ°€ λ‹€μ–‘ν•˜κ²Œ μΆ”κ°€λ˜λ©΄ λ‹€μ‹œ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ 근본적인 해결책은 μ•„λ‹™λ‹ˆλ‹€. κ·Έλž˜μ„œ ν•΄λ‹Ή ν˜„μƒμ΄ λ°œκ²¬λ˜λŠ” μΈλ±μŠ€μ— λŒ€ν•΄μ„œλŠ” 동적 맀핑에 μ˜ν•΄ μΆ”κ°€λœ 맀핑 정보λ₯Ό ν™•μΈν•˜μ—¬ κ³„μ†ν•΄μ„œ 맀핑 정보가 λ§Œλ“€μ–΄μ§ˆ 수 μžˆλŠ” ν•„λ“œλ₯Ό λ‹¨μˆœνžˆ μ €μž₯λ§Œν•˜λ„λ‘ 맀핑 정보λ₯Ό λΆ€μ—¬ν•˜κ³  재 인덱슀λ₯Ό μˆ˜ν–‰ν•΄μ•Όλ§Œ ν–ˆμŠ΅λ‹ˆλ‹€.

λ„νλ¨ΌνŠΈ μ‚­μ œ

단일 λ…Έλ“œμ˜ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ ν΄λŸ¬μŠ€ν„°μ΄λ―€λ‘œ 단일 μΈλ±μŠ€μ— λ„ˆλ¬΄ λ§Žμ€ λ„νλ¨ΌνŠΈκ°€ μ €μž₯되면 μ„±λŠ₯에 λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹¬μ§€μ–΄λŠ” μ—˜λΌμŠ€ν‹±μ„œμΉ˜ 7λΆ€ν„° μΈλ±μŠ€μ— λŒ€ν•œ 프라이머리 μƒ€λ“œμ˜ 기본값이 1 μ΄μ—ˆλ˜ λΆ€λΆ„μœΌλ‘œ μΈν•˜μ—¬ 인덱슀의 ν•˜λ‚˜μ˜ μƒ€λ“œκ°€ λ„ˆλ¬΄ λ§Žμ€ λ„νλ¨ΌνŠΈλ₯Ό μ €μž₯ν•˜κ³  μžˆλŠ” ꡬ쑰가 λ˜μ–΄λ²„λ ΈμŠ΅λ‹ˆλ‹€.

νŠΉμ • μΈλ±μŠ€μ— μ €μž₯λ˜λŠ” λ„νλ¨ΌνŠΈκ°€ λ„ˆλ¬΄ λ§Žμ•„μ‘Œκ³  μ‹¬μ§€μ–΄λŠ” 였래된 λ„νλ¨ΌνŠΈκ°€ λΆˆν•„μš”ν•˜κ²Œ λ‚¨μ•„μžˆμ—ˆκΈ°μ— 일정 기간이 μ§€λ‚œ λ„νλ¨ΌνŠΈλŠ” μ§€μš°λ„λ‘ _delete_by_queryλ₯Ό μ‚¬μš©ν•΄μ„œ μŠ€μΌ€μ€„μ— μ˜ν•΄ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ ν΄λŸ¬μŠ€ν„°μ— μ§€μš°λ„λ‘ μš”μ²­ν•΄λ‘μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, Elasticsearch의 색인 별λͺ… ν™œμš© νŒμ— λ‚˜μ™€μžˆλŠ” κ²ƒμ²˜λŸΌ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ ν΄λŸ¬μŠ€ν„°μ—μ„œλŠ” λ„νλ¨ΌνŠΈλ₯Ό μ‹€μ œλ‘œ μ‚­μ œν•˜λŠ” 것은 μ•„λ‹Œ λΆ€λΆ„μœΌλ‘œ μΈν•˜μ—¬ 였히렀 μ—˜λΌμŠ€ν‹±μ„œμΉ˜ ν΄λŸ¬μŠ€ν„°μ˜ 인덱슀의 μš©λŸ‰μ΄ μΌμ‹œμ μœΌλ‘œ λŠ˜μ–΄λ‚˜κ²Œ λ˜λŠ” 문제λ₯Ό κ°€μ Έκ°€κ²Œ λ©λ‹ˆλ‹€.

λ””μŠ€ν¬ λ³Όλ₯¨μ„ 증섀할 수 μžˆλ‹€κ³  해도 μ„œλ²„ μš©λŸ‰μ— 민감할 수 밖에 μ—†μŠ΅λ‹ˆλ‹€.

μΌμžλ³„ 인덱슀 쑰회

λ„νλ¨ΌνŠΈ μ‚­μ œκ°€ μš©μ΄ν•˜μ§€ μ•Šμ€ 단일 인덱슀의 문제λ₯Ό ν•΄μ†Œν•˜κΈ° μœ„ν•΄μ„œ νŠΉμ • λ‘œκ·Έμ— λŒ€ν•΄μ„œλŠ” μΌμžλ³„λ‘œ μ €μž₯λ˜λ„λ‘ μ μš©ν•΄μ•Όν–ˆμŠ΅λ‹ˆλ‹€. 단일 인덱슀둜 μ €μž₯ν•˜λ˜κ±Έ μΌμžλ³„λ‘œ μ €μž₯ν•˜λŠ” 것은 인덱슀 λͺ…에 μ €μž₯λ˜λŠ” μ‹œμ μ˜ λ‚ μ§œ 포맷(yyyyMMdd)을 μΆ”κ°€ν•˜λ©΄ λ˜κΈ°μ— 어렀움은 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή μž‘μ—…μ— λŒ€ν•΄ κ²€ν† ν•˜λ˜ 쀑 μΈλ±μŠ€μ— λŒ€ν•œ 쑰회 κΈ°λŠ₯에 일뢀 μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ λ°œμƒν•  수 μžˆμŒμ„ ν™•μΈν•˜μ˜€μŠ΅λ‹ˆλ‹€.

Search API에 λŒ€ν•΄μ„œλŠ” 인덱슀 νŒ¨ν„΄μ— λŒ€ν•΄μ„œ μ‘°νšŒν•  수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€λ§Œ, νŠΉμ • λ„νλ¨ΌνŠΈμ— λŒ€ν•œ 아이디λ₯Ό κΈ°μ€€μœΌλ‘œ Get APIλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 인덱슀 λͺ…을 μ•Œμ•„μ•Όλ§Œ ν•©λ‹ˆλ‹€. μ‹¬μ§€μ–΄λŠ” μ—¬λŸ¬κ°œμ˜ μΈλ±μŠ€μ— λŒ€ν•΄μ„œ μ‘°νšŒν•  수 μžˆλŠ” Mget API도 μ‘°νšŒν•˜κ³ μž ν•˜λŠ” μΈλ±μŠ€λ“€μ˜ 이름을 λ‚˜μ—΄ν•΄μ•Όν–ˆκΈ°μ— 인덱슀 νŒ¨ν„΄μ— λŒ€ν•΄ 인덱슀 λͺ©λ‘μ„ μ‘°νšŒν•˜κ³  μ—¬λŸ¬κ°œμ˜ μΈλ±μŠ€μ— 걸쳐 병렬 μ‘°νšŒν•  수 μžˆλ„λ‘ μ•„λž˜μ™€ 같이 λ³€κ²½ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

// NOTE: 인덱슀 νŒ¨ν„΄μ— μ˜ν•œ μ‹€μ œ 인덱슀 λͺ©λ‘ 쑰회
GetIndexRequest getIndexRequest = new GetIndexRequest("oauth_log*");
GetIndexResponse getIndexResponse = highLevelClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);
String[] indices = getIndexResponse.getIndices();

// NOTE: μ—¬λŸ¬κ°œμ˜ μΈλ±μŠ€μ— 걸쳐 병렬 쑰회
MultiGetRequest multiGetRequest = new MultiGetRequest();
for (String index : indices) {
    multiGetRequest.add(index, "c70e49fa-d0f4-4278-a271-a46f688349f6");
}

MultiGetResponse multiGetResponse = highLevelClient.mget(multiGetRequest, RequestOptions.DEFAULT);
MultiGetItemResponse[] responses = multiGetResponse.getResponses();
for (MultiGetItemResponse response : responses) {
    if (!response.isFailed() && response.getResponse().isExists()) {
        String index = response.getIndex();
        String id = response.getId();

        log.info("{} in {}, {}", id, index, response.getResponse().getSource());
    }
}

μΌμžλ³„ μΈλ±μŠ€μ— μžˆλŠ” λ„νλ¨ΌνŠΈμ˜ 아이디가 μΆ©λŒν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 보μž₯ν•  λ•Œλ₯Ό κΈ°μ€€μœΌλ‘œ ν•©λ‹ˆλ‹€.

졜근 μΈλ±μŠ€μ™€ κ΄€λ ¨λœ μž‘μ—…μ„ ν•˜κ³  μžˆμ–΄μ„œ μ—¬νƒœκΉŒμ§€ κ²½ν—˜ν–ˆλ˜ λ¬Έμ œμ— λŒ€ν•΄μ„œ μž‘μ„±ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 인덱슀 관리와 κ΄€λ ¨ν•΄μ„œ μ‚¬μš©μ€‘μ΄λ˜ μ—˜λΌμŠ€ν‹±μ„œμΉ˜ 버전을 7.3.2μ—μ„œ 7.12.1둜 λ³€κ²½ν•˜λŠ” μž‘μ—…μ„ μ§„ν–‰ν•˜κ³  있으며 이와 λ”λΆˆμ–΄ μ—˜λΌμŠ€ν‹±μ„œμΉ˜μ™€ ν•¨κ»˜ ν‚€λ°”λ‚˜λ₯Ό ν™œμš©ν•΄μ„œ 더 효율적으둜 인덱슀λ₯Ό 관리할 수 μžˆλŠ” λ°©μ•ˆμ— λŒ€ν•΄μ„œ 곡뢀해보고 μžˆμŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€.