해당 글은 엘라스틱 스택 개발부터 운영까지라는 책 중 3장을 정리하여 쓴 글입니다.
벌크 데이터
POST _bulk
{"index":{"_index":"test", "_id":"1"}}
{"field":"value one"}
{"index":{"_index":"test", "_id":"2"}}
{"field":"value two"}
{"delete":{"_index":"test", "_id":"2"}}
{"create":{"_index":"test", "_id":"3"}}
{"field":"value three"}
{"update":{"_index":"test", "_id":"1"}}
{"doc":{"field":"value two"}}
- 여러개의 Document를 각각 API를 불러서 요청하는 것보다 Bulk로 한 번에 요청하는 것이 효율적이다.
- 벌크 Insert는 JSON의 형태지만, NDJSON 형태로 적어야하기 때문에, 라인 사이의 공백이 있으면 안된다.
- 벌크 Insert시 실패하면 롤백이 안되기 때문에 다시 Indexing 해야할 수도 있음.
매핑
- 관계형 데이터 베이스는 테이블을 만들 때 스키마 설계가 필요하다. 이를 엘라스틱 서치에서는 매핑이라고 한다.
- 매핑은 1. 데이터에 대해서 자동으로 만들면 다이나믹 매핑이 되고, 2. 사용자가 직접 설정하면 명시적 매핑이 된다. 그리고 3. 전문 검색을 활용하려면 문자열에 대한 text, keyword 타입을 이해해야 한다.
다이내믹 매핑
엘라스틱 서치는 유연한 활용을 위해 인덱스 생성 시 매핑 정의를 강제하지 않는다. 다이내믹 매핑을 사용하면 자동으로 데이터타입을 정해준다.
다이내믹 매핑 기준은 아래와 같다.
원본 소스 데이터 타입 | 다이내믹 매핑으로 변환된 데이터 타입 |
null | 필드를 추가하지 않음 |
boolean | boolean |
float | float |
integer | long |
object | object |
string | string 데이터 형태에 따라 date, text/keyword 필드 |
다이내믹 매핑은 무척 편리하지만, 인덱스 규모가 커진다면 효율이 떨어지기 때문에, 추후에는 사용자가 직접 설정하여 매핑해야한다.
명시적 매핑
인덱스 매핑을 직접 정의하는 것
PUT <인덱스명>
{
"mappings": {
"properties": {
"<필드명>":{
"type": "<필드 타입>"
… <필드 설정>
}
…
}
}
}
-- 인덱스 매핑 추가
PUT <인덱스명>/_mapping
{
"properties": {
"<추가할 필드명>": {
"type": "<필드 타입>"
… <필드 설정>
}
}
}
- 명시적 매핑은 새로운 필드를 추가할 수 있지만, 이미 정의된 필드를 수정하거나 삭제할 수는 없다.
- 필드 이름을 변경하거나 데이터 타입을 변경하기 위해서는 새로운 인덱스를 만들거나 reindex API를 이용해야 한다.
- 그리고 정의되지 않은 필드를 입력하게 되면 자동적으로 매핑이 되어 필드가 추가된다.
매핑 타입
인덱스의 매핑 타입은 아래와 같다.
데이터 형태 | 데이터 형태 | 설명 |
텍스트 | text | 전문 검색이 필요한 데이터 |
keyword | 원문을 통쨰로 인덱싱한다 | |
날짜 | date | 날짜/시간 데이터 |
정수 | byte, short, integer, long | 비트 데이터 |
실수 | scaled_float, half_float, double, float | 부동소수점 실수 데이터 |
불린 | boolean | 참/거짓 데이터 true/false |
IP 주소 | ip | ipv4, ipv6 IP 주소 입력 |
위치 정보 | geo-point, geo-shape | geo-point : 위도 경도 / geo-shape : 하나의 위치 포인트가 아닌 임의의 지형 |
범위 값 | integer_range, long_range, float_range, double_range, ip_range, date_range | 범위 |
객체형 | object | 계층 구조를 갖는 형태 |
배열형 | nested | 배열형 객체 저장 |
join | 부모/자식 관계 표현 |
멀티 필드를 활용한 문자열 처리
엘라스틱서치 5.x버전부터 문자열 타입이 텍스트와 키워드 라는 두가지 타입으로 분리 되었다.
텍스트 타입
- 문장을 저장하는 매핑 타입.
- 텍스트 타입으로 지정된 문자열은 분석기에 의해 토큰으로 분리되고, 이러한 분리된 토큰들은 인덱싱되는데 이를 역인덱싱이라고 한다.
- 텍스트 타입은 집계나 정렬을 지원하지 않는다.
- 매핑 파라미터로 집계나 정렬을 지원할 수 있으나 메모리를 많이 사용하는 단점이 있다.
키워드 타입
- 카테고리나 사람 이름, 브랜드 등 규칙성이 있거나 유의미한 값들의 집합, 즉 범주형 데이터에 주로 사용된다.
- 완전 일치 검색을 위해 사용할 수 있으며 집계나 정렬에 사용할 수 있다.
멀티 필드
단일 필드 입력에 대해 여러 하위 필드를 정의하는 기능. fields라는 매핑 파라미터가 사용 된다.
문자열의 경우 전문 검색이 필요하면서 정렬도 필요한 경우가 있기 때문에 사용한다.
PUT my_index
{
"mappings": {
"properties": {
"<필드명1>": {
"type": "text",
"fields": {
"<필드명2>": {
"type": "<타입>"
}
}
}
}
}
}
인덱스 템플릿
인덱스 템플릿은 주로 설정이 동일한 복수의 인덱스를 만들 때 사용한다.
다이나믹 템플릿
매핑을 다이내믹하게 지정하는 템플릿 기술, 매핑을 정확하게 정할 수 없거나 대략적인 데이터 구조만 알고 있을 때 사용할 수 있는 방법이다.
조건문 | 설명 |
match_mapping_type | 데이터 타입을 확인하고 타입들 중 일부를 지정한 매핑 타입으로 변경한다. |
match, unmatch | match : 필드명이 패턴과 일치할 경우 매핑 타입으로 변경 / unmatch : 필드명이 패턴과 일치하지 않은 경우 제외 |
match_pattern | match 패턴에서 사용할 수 있는 파라미터를 조정 |
path_match, path_unmatch | match, unmatch와 비슷하지만 점이 들어가는 필드명에서 사용한다. |
분석기
엘라스틱 서치는 전문 검색을 지원하기 위해 역인덱싱 기술을 사용한다. 역인덱싱은 문자열을 분석해 작은 단위로 쪼개어 인덱싱하는 기술이다. 이렇게 문자열을 쪼개기 위해 캐릭터 필터, 토크나이저, 토큰 필터로 구성되어진 것이 바로 분석기이다.
분석기에는 하나의 토크나이저가 반드시 포함돼야하며, 캐릭터 필터와, 토큰 필터는 옵션이므로 없어도 되고 여러 개를 함께 사용해도 된다.
분석기 구성
분석기는 캐릭터 필터, 토크나이저, 토큰 필터로 이루어져있다.
분석기는 standard, simple, whitespace, stop, 한국어 분석기인 nori 등이 있다.
구성요소 | 설명 |
캐릭터필터 | 입력받은 문자열을 변경하거나 불필요한 문자들을 제거 대부분의 분석기는 캐릭터 필터가 포함되어 있지 않다. 캐릭터 필터를 사용하기 위해서는 커스텀 분석기를 만들어 사용하는 것이 좋다. |
토크나이저 | 문자열을 토큰으로 분리한다. 분리할 때 토큰의 순서나 시작, 끝 위치도 기록한다. standard, lowercase, ngram, uax_url_email 등이 있다. |
토큰 필터 | 분리된 토큰들의 필터 작업을 한다. 대소문자 구분, 형태소 분석 등의 작업이 가능하다. lowercase, stemmer, stop을 대표적으로 사용한다. |
역인덱싱
역인덱싱은 단어들을 역인덱싱하여, 단어가 들어간 자료가 어디에 인덱싱이 되어있는지 확인할 수 있도록 한다.
분석기 API
엘라스틱서치는 필터와 토크나이저를 테스트해볼 수 있는 _anlyze라는 이름의 REST API를 제공한다.
커스텀 분석기
엘라스틱서치에서 제공하는 내장 분석기들 중 원하는 기능을 만족하는 분석기가 없을 때 사용자가 직접 토크나이저, 필터 등을 조합해 사용할 수 있는 분석기이다. 이럴때 토크나이저, 필터 등의 순서를 직접 정의해야하므로 주의해야 한다.
회고
2편에 나눠서 3장을 정리해봤는데, 너무 많은 내용이 포함되어 있어서, 깊게 공부하려고 들면 진도가 안나가는 경험을 하게 되네요. 그래도 알아가면서 3장을 깊고 얇게 정리를 해봤는데, 생각보다 나중에 키워드 하나하나가 기억날 것 같은 느낌이 듭니다.
'ELK > ELK 개발부터 운영까지' 카테고리의 다른 글
엘라스틱서치(elasticsearch) 집계 (0) | 2022.03.09 |
---|---|
엘라스틱서치(elasticSearch) 검색 - 2부 (0) | 2022.03.02 |
엘라스틱서치(elasticSearch) 검색 - 1부 (0) | 2022.03.01 |
엘라스틱서치(elasticSearch) 기본 - 1부 (0) | 2022.02.23 |
엘라스틱스택(ELK Stack) 이란? (0) | 2022.02.14 |