Elasticsearch match vs term, text vs keyword 타입과 분석기
match 와 term 쿼리 모두 특정 필드의 내용이 질의어와 일치하는 문서를 찾는데 사용.
하지만 일치의 여부를 어떻게 찾는지에 대한 세부사항은 다름
match
GET test_index/_search
{
"query": {
"match": {
"title": {
"query": "this is something"
}
}
}
}
- 필드에 커스텀 분석기(analyzer) or search_analyzer가 존재하는 경우
1번에 해당 하지 않으면 기본적으로 standard 분석기를 사용
match query의 경우 질의 대상으로 지정된 필드에 analyzer
(커스텀 분석기)가 존재하거나, search_analyzer가
존재하는 경우 질의어(검색어) 또한 analyzing(분석) 과정을 거친다.
test_index
의 title
필드가 text
type이고 standard analyzer
를 사용한다면
질의어인 “this is something” 텍스트는 “this”, “is”, “something” 이라는 3개의
텀으로 분리되어 역색인 검색이 수행 된다.
주의할 부분은 match
query의 경우 기본적으로 OR
로 동작을 한다. 그렇기에 문서 상에 “this”, “is”, “something” 3개의 텀으로 각각 검색을 수행한 후에 셋 중 하나라도 문서에 포함이 되어 있는 경우 해당 _doc(문서)를 결과로 반환 한다.
물론 위 쿼리와 다르게, 아래와 같이 문서 검색 시 operator 옵션을 AND
로 지정할 수 있다.
GET test_index/_search
{
"query": {
"match": {
"title": {
"query": "this is something",
"operator": "and" # and 조건 추가
}
}
}
}
term
term query는 analyzer(분석) 과정은 거치지 않는다?
"PUT text_and_keyword"{
"settings":{ # es 설정 지정
"analysis":{
"normalizer":{
"my_normalizer":{
"type":"custom",
"filter":[
"lowercase",
"asciifolding"
]
}
},
"analyzer":{
"my_analyzer":{
"type":"custom",
"tokenizer":"keyword",
"filter":[
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings":{ # es 필드 매핑 지정
"_doc":{
"properties":{
"keyword_normalizer":{
"type":"keyword",
"normalizer":"my_normalizer"
},
"text_keyword_tokenizer":{
"type":"text",
"analyzer":"my_analyzer"
}
}
}
}
}
term 쿼리는 지정한 필드가 질의어와 정확히 일치하는 문서
를 찾는 쿼리다. analyzer 처리 과정은 거치지 않으나
normalizer
가 적용되어 있으면 질의어도 동일하게 normalizer 과정
을 거친다.
즉, analyzer 처리 과정을 거치지 않고 말 그대로 질의어와 정확히 일치하는 값을 찾는데 사용한다. 하여 주로 keyword 타입
에 검색 시 사용이 되며, normalizer가 필드에 적용되어 있지 않으면 어떠한 analyzing(분석)을 수행하지 않는다.
정리
- 집계나 정렬이 필요하고 형태소 분석이 필요가 없다면 keyword 타입에 normalizer 파라미터를 적용하면 된다
- 형태소 분석이나 동의어 토큰 필터 등을 사용해야 한다면 text 타입에 analyzer를 사용하면 된다
매핑 파라미터
매핑 파라미터는 색인 시 필드의 데이터를 어떻게 저장할지에 대한 옵션을 뜻함
analyzer
해당 필드
를형태소 분석
하겠다는의미
색인
+검색
시지정한 분석기
로형태소 분석
을 수행text 데이터 타입 필드
는analyzer 매핑 파라미터
를기본
적으로사용
해야함- 별도의 분석기 미지정 시
standard analyzer
로 형태소 분석
normalizer
keyword 타입 필드
에 적용,대소문자
나악세트
(예: café vs cafe) 등을 정규화해 동일한 값으로 인식하게 해주는 간단한 분석 과정Tokenizer
는사용 불가
, 일부캐릭터 필터
와토큰 필터
만 사용 가능- lowercase, asciifolding 등은 가능하지만, stemming 같은 필터는 적용 불가
text
text 타입
인 경우형태소 기반
으로분석
/분리
수행전문 검색
(Full Text Search) 가능- 질의어 필드에 지정한
custom 분석기
나search_analyzer
를 통해 질의어도 분석 후 검색 - 만약 analyzer를 지정하지 않으면 standard analyzer를 사용
keyword
keyword 타입
인 경우형태소 기반
으로분석
/분리
수행 x- 전문 검색 불가능,
exact value
검색 가능 - 질의어 필드에 normalizer가 있는거 아니면,
형태소 분석없이 그대로 검색
- match 쿼리를 통해 keyword 타입에 요청하는 경우?
- keyword 필드는 Analyzer가 적용되지 안힉에, match 쿼리는 term 쿼리처럼 동작
- 즉, 단어 단위로 검색이 수행되지 않으면 전문 검색도 불가능함
- term 쿼리를 통해 text 타입에 요청하는 경우?
- text 타입의 필드(ex: title)는 색인시에도 분석기(analyzer)를 사용하기에
term 쿼리를 통해 정확히 매칭되는 단어를 찾으려는 경우 예상한 결과가 안 나올 수 있음 - 즉, text 타입은 분석기 없어도 standard 분석을 거치기에 검색이 안될 가능성이 존재
- text 타입의 필드(ex: title)는 색인시에도 분석기(analyzer)를 사용하기에
standard 분석기 흐름
Input Text -> Character Filter -> Filtered Text -> Tokenizer -> Tokens -> Token Filter -> Filtered Tokens -> Output Tokens
요약: Character Filter -> Tokenizer -> Token Filte
Standard Analyzer의 처리 순서
단계 | 처리 과정 | 설명 |
---|---|---|
1 | Character Filters (문자 필터) | 텍스트의 특정 문자를 변환 또는 제거 (기본적으로 없음) |
2 | Tokenizer (토크나이저) | 공백과 구두점을 기준으로 토큰을 분리 |
3 | Lowercase Filter (소문자 변환) | 모든 알파벳을 소문자로 변환하여 검색 일관성 유지 |
4 | Stopword Removal (불용어 제거) | 기본적으로 비활성화됨 (불용어 제거를 원하면 stop 필터 추가 필요) |
"analysis": {
"filter": { }, // 토큰 필터 (Token Filters)
"char_filter": { }, // 문자 필터 (Character Filters)
"analyzer": { }, // 분석기 정의 (Analyzer 설정)
"tokenizer": { } // 토크나이저 (Tokenizer)
}
✅ 문자열 검색 vs 전문 검색
구분 | Keyword 검색 | Text 검색 |
---|---|---|
사용 목적 | 통계, 정렬, 필터링 | 유사성 기반 검색, 전문 분석 |
검색 방식 | 입력된 값과 정확히 일치하는 문자열 검색 | 설정된 Analyzer(분석기)에 따른 검색 |
색인 방식 | 입력한 문자열 그대로(토큰화 없이) 색인 | 형태소 분석 등으로 토큰화하여 색인 |
Aggregation | 색인된 데이터로 집계 가능 | (일반적으로) 집계 불가능 |
분석기 테스트 시 사용할 쿼리
GET /_analyze
{
"analyzer": "standard",
"text": "Hello World, this is a test."
}
참고 자료
'Elasticsearch > Elasticsearch - Experience' 카테고리의 다른 글
[Elasticsearch] 검색엔진 Elasticsearch.yaml 파일 옵션 정리 (0) | 2025.01.07 |
---|---|
[Elasticsearch] Elastciearch 클러터에서 특정 Node 제외 시키기 (0) | 2024.08.09 |
[Elasticsearch] ES 운영중인 Live 서비스의 alias 교체 방법 (0) | 2024.08.09 |
[Elasticsearch] ES 클러스터 운영 중 노드 순차적 재시작(Rolling Restart) (0) | 2024.08.09 |
[Logstash] Linux 파일 삭제 후 용량 확보 안되는 경우 (feat. Logstash) (0) | 2024.08.09 |