
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 - Practice' 카테고리의 다른 글
| [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 |