개발/엘라스틱서치

elasticsearch. 문자열 타입 (텍스트 타입 / 키워드 타입 / 멀티 타입) [엘라스틱 스택 개발부터 운영까지]

ttoance 2023. 2. 19. 20:21

엘라스틱서치 5.x 버전부터 문자열 타입이 텍스트와 키워드라는 두 가지 타입으로 분리되었다.

>> 텍스트 타입

- 일반적으로 문장을 저장하는 매핑 타입으로 사용한다.

- 텍스트 타입으로 지정된 문자열은 분석기에 의해 토큰으로 분리되고, 이렇게 분리된 토큰들은 인덱싱되는데 이를 역인덱싱이라고 한다.

- 역인덱싱된 용어 중 하나라도 포함되면 도큐먼트를 찾는다.

- 텍스트 타입의 경우 기본적으로 집계나 정렬을 지원하지 않으며, 매핑 파라미터로 집계나 정렬을 지원할 수 는 있으나 메모리를 많이 사용한다는 단점이 있다.

- 텍스트 타입으로 지정된 필드를 정렬할 경우 문장의 첫 문자열이 아닌 분해된 용어를 기준으로 정렬을 수행하므로 예상과는 다른 결과를 얻게 된다.

# text 타입 가진 text_index 인덱스 생성 
PUT test_index
{
  "mappings": {
    "properties": {
      "contents" : {
        "type": "text"
      }
    }
  }
}

# text_index 인덱스에 도큐먼트 인덱싱
PUT test_index/_doc/1
{
  "contents": "a happy dog"
}

# text_index 인덱스 전문 쿼리 
GET test_index/_search 
{
  "query": {
    "match": {
      "contents": "dog"
    }
  }
}

text 타입으로 인덱싱되었을 때, 'dog'로 부분 검색한 결과값이 나온다.

 

 

>> 키워드 타입

- 카테고리나 사람, 이름, 브랜드 등 규칙성이 있거나 유의미한 값들의 집합, 즉 범주형 데이터에 주로 사용된다.

- 키워드 타입은 텍스트 타입과 다르게 분석기를 거치지 않고 문자열 전체가 하나의 용어로 인덱싱된다.

- 키워드 타입은 'a happy dog'라는 1개의 용어를 만든다. 따라서 부분 일치 검색은 어렵지만 대신 완전 일치 검색을 위해 사용할 수 있으며 집계나 정렬에 사용될 수 있음.

# keyword 타입 가진 keyword_index 인덱스 생성 
PUT keyword_index
{
  "mappings": {
    "properties": {
      "contents" : {
        "type": "keyword"
      }
    }
  }
}

# keyword_index 인덱스에 도큐먼트 인덱싱
PUT keyword_index/_doc/1
{
  "contents": "a happy dog"
}

# keyword_index 인덱스 전문 쿼리 
GET keyword_index/_search 
{
  "query": {
    "match": {
      "contents": "dog"
    }
  }
}


GET keyword_index/_search 
{
  "query": {
    "match": {
      "contents": "a happy dog"
    }
  }
}

keyword 타입으로 인덱싱되었을 때, 'dog'로 부분 검색한 결과값이 나오지 않는다.
대신 keyword 타입으로 인덱싱되었을 때, 'a happy dog'로 완전 일치 검색한 결과값이 나온다.

 

 

>> 멀티 필드

- 단일 필드 입력에 대해서 여러 하위 필드를 정의하는 기능이다.

- fields라는 매핑 파라미터가 사용된다.

- 사용되는 경우

  • 문자열의 경우 전문 검색이 필요하면서 정렬도 필요한 경우가 있다.
  • 처음 데이터 스키마를 잡는 시점에서는 키워드 타입으로 충분히 처리가 가능한 범주형 데이터였지만 데이터가 늘어나면서 전문 검색이 필요한 경우가 생긴다.
# 멀티 필드 갖는 multifield_index 인덱스 생성 
PUT multifield_index
{
  "mappings": {
    "properties": {
      "contents" : {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

# keyword 타입 가진 multifield_index 인덱스 생성 
PUT multifield_index/_doc/1
{
  "contents": "a happy dog"
}

PUT multifield_index/_doc/2
{
  "contents": "a happy dog"
}

PUT multifield_index/_doc/3
{
  "contents": "a smiley dog"
}

dog로 text 부분 검색 시 부분 일치한 3 도큐먼트가 나온다.

GET multifield_index/_search 
{
  "query": {
    "match": {
      "contents": "dog"
    }
  }
}

dog로 keyword 검색한 결과 값이 나오지 않는다.

GET multifield_index/_search 
{
  "query": {
    "match": {
      "contents.keyword": "a happy dog"
    }
  }
}

a happy dog로 keyword로 완전 일치 검색을 해야 결과값이 나온다.

 


아래 책 <엘라스틱 스택 개발부터 운영까지> 3.6.4절을 읽고 정리한 글입니다.

 

엘라스틱 스택 개발부터 운영까지 - YES24

데이터를 처리하는 데 서로 잘 맞지도 않는 오픈소스 기술들을 굳이 동원해야 할까? 제각각인 오픈소스들을 통합하고 운영하느라 지친 개발자와 운영자들을 위한 솔루션! 이제 엘라스틱 스택

www.yes24.com

 

반응형