text, keyword 타입이란?
Elasticsearch에서 지원하는 데이터타입 요소로써
text, keyword 모두 문자열을 나타내기 위한 타입이다.
하지만, text 타입은 Full-text search를 위해 토큰이 생성되지만,
keyword 타입은 Exact Matching을 위한 토큰이 생성된다.
여기서 Full-text search 이란,
문서의 전체 텍스트에 키워드나 구문을 일치시켜
관련 문서를 검색할 수 있는 기술이다.
Exact Matching 은
검색 중인 정확한 용어 또는 구문과 일치하는 문서만 반환하는 검색 기술이다.
그럼 직접 analyzer를 지정하여
Full-text search, Exact Matching 가 어떤 식으로 다른지 확인해 보자.
1. Full-text search
GET /_analyze
{
"analyzer": "standard",
"text" : "Let it be"
}
Full-text search는 text 가
사용자가 "it"만 검색해도
토큰에 "it" 정보가 있기 때문에
"Let it be" 전체를 찾을 수 있다.
2. Exact Matching
Exact matchin 은 sql에서 = 과 같은 의미라고 보면 된다.
GET /_analyze
{
"analyzer": "keyword",
"text" : "Let it be"
}
사용자가 "Let it be"라고 정확하게 입력을 해야
"Let it be"라는 text 가 리턴된다.
만약, "Let"이나 "be" 같은 단어만 검색한다면,
해당 단어로 된 토큰이 없으므로 "Let it be"를 찾을 수 없다.
위의 그림을 보면 text와 keyword 타입이 어떤 차이가 있는지
확실히 와닿을 것이다.
text, keyword 타입 중에 어떤 데이터 타입이 색인 성능이 더 좋을까?
text는 문자열에서 공백을 제거하고,
의미 없는 단어를 지우고... 등등의 과정을 진행하지만,
keyword 타입은 그런 과정을 생략한다.
즉, text 타입보단 keyword 타입이 색인 속도가 훨씬 빠르다.
동적매핑(Dynamic Mapping)의 문제
그럼 위에서 text, keyword의 차이점을 왜 알아본 것일까?
인덱스를 동적으로 생성할 때에,
해당 인덱스가 속하는 index template을 따로 지정해주지 않는다면,
문자열 필드가 맵핑되었을 때 text, keyword 타입 모두 생성된다.
POST /zoo-index/_doc
{
"name" : "Lion",
"age" : 11,
"location" : "Africa"
}
동적 매핑을 통해서 zoo-index를 생성하였다.
name 은 문자열 필드이다.
인덱스를 생성할 때 매핑 정보 선언 없이, 동적으로 생성하였으므로
해당 필드의 type 이 text, keyword 모두 지정된 것을 볼 수 있다.
내부적으로 name.keyword 가 필드가 생성되는 것이다.
하나의 문자열에 두 개의 필드가 생성되는 모습을 볼 수 있다.
즉, 동적 매핑으로 인덱스를 생성하게 되면,
문자열 필드에 text, keyword 필드 두개 모두 생기기 때문에 비효율이 발생하게 된다.
그러므로 문자열에 특성에 따라서
text, keyword를 정적 매핑 해준다면 성능에 큰 도움이 된다.
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] Nori 분석기 적용 (0) | 2023.05.14 |
---|---|
[Elasticsearch] Disk-based shard allocation (1) | 2023.03.02 |
[Elasticsearch] 검색(Search) (0) | 2023.02.28 |
[Elasticsearch] 색인 (Indexing) (0) | 2023.02.27 |
[Elasticsearch] Shard 란? (0) | 2023.02.22 |