본문 바로가기
Elasticsearch/Elasticsearch - Experience

[Elasticsearch] Elasticsearch match vs term, text vs keyword 타입과 분석기

by ymkim 2025. 1. 7.

Elasticsearch match vs term, text vs keyword 타입과 분석기

match 와 term 쿼리 모두 특정 필드의 내용이 질의어와 일치하는 문서를 찾는데 사용.
하지만 일치의 여부를 어떻게 찾는지에 대한 세부사항은 다름

match

GET test_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "this is something"
      }
    }
  }
}
  1. 필드에 커스텀 분석기(analyzer) or search_analyzer가 존재하는 경우

1번에 해당 하지 않으면 기본적으로 standard 분석기를 사용

match query의 경우 질의 대상으로 지정된 필드에 analyzer(커스텀 분석기)가 존재하거나, search_analyzer가
존재하는 경우 질의어(검색어) 또한 analyzing(분석) 과정을 거친다.

 

test_indextitle 필드가 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 분석을 거치기에 검색이 안될 가능성이 존재

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."
}

참고 자료