Text 필드 타입

Text 필드 타입

text 필드 타입은 분석되는 문자열을 담아요. 부분 일치를 허용하므로 전체 텍스트 검색에 사용돼요. 여러 용어에 대한 검색은 일부만 일치할 수 있어요. analyzer에 따라 결과는 대소문자 무시, 형태소 분석(stemming), 불용어 제거, 동의어 적용 등을 거칠 수 있어요.

필드를 정확한 값 검색에 사용해야 한다면 대신 keyword로 매핑하세요.

match_only_text 필드는 text 필드의 공간 최적화 버전이에요. 구문 쿼리나 위치(positional) 쿼리를 사용할 필요가 없다면 필드를 text 대신 match_only_text로 매핑하세요. 위치 쿼리는 구문에서 용어의 위치가 중요한 쿼리로, interval이나 span 쿼리 같은 것을 말해요.

출처: 문서

본문

예시

text 필드가 있는 매핑을 만들어 볼게요.

PUT movies
{
  "mappings" : {
    "properties" : {
      "title" : {
        "type" :  "text"
      }
    }
  }
}

파라미터 (Parameters)

text 필드 타입이 받는 파라미터는 다음 표와 같아요. 모든 파라미터는 선택 사항이에요.

파라미터 설명
analyzer 이 필드에 사용될 analyzer예요. 기본적으로 색인 시점과 검색 시점 모두에서 사용돼요. 검색 시점에 재정의하려면 search_analyzer 파라미터를 설정해요. 기본값은 문법 기반 토큰화를 사용하고 Unicode Text Segmentation 알고리즘에 기반한 표준 analyzer예요.
boost 관련성 점수에 대한 이 필드의 가중치를 지정하는 부동소수점 값이에요. 1.0보다 큰 값은 필드의 관련성을 높이고, 0.0과 1.0 사이의 값은 관련성을 낮춰요. 기본값은 1.0이에요. 동적으로 업데이트 가능해요.
eager_global_ordinals refresh 시 global ordinals를 미리 로드할지 여부를 지정해요. 필드가 집계에 자주 사용된다면 이 파라미터를 true로 설정해야 해요. 기본값은 false예요. 동적으로 업데이트 가능해요.
fielddata 정렬, 집계, 스크립팅을 위해 이 필드의 분석된 토큰에 접근할지 여부를 지정하는 불리언 값이에요. 기본값은 false예요. 동적으로 업데이트 가능해요.
fielddata_frequency_filter 문서 빈도가 min과 max 값(절대 수 또는 백분율로 제공) 사이인 분석된 토큰만 메모리에 로드하도록 지정하는 JSON 객체예요. 빈도는 세그먼트별로 계산돼요. 파라미터: min, max, min_segment_size. 기본값은 모든 분석된 토큰을 로드하는 거예요. 동적으로 업데이트 가능해요.
fields 같은 문자열을 여러 방식으로 색인하려면(예: keyword와 text로 모두) fields 파라미터를 제공해요. 검색에 사용할 필드 버전과 정렬·집계에 사용할 필드 버전을 각각 지정할 수 있어요.
index 필드를 검색 가능하게 할지 여부를 지정하는 불리언 값이에요. 기본값은 true예요.
index_options 검색과 하이라이팅을 위해 인덱스에 저장할 정보를 지정해요. 유효 값: docs(문서 번호만), freqs(문서 번호와 용어 빈도), positions(문서 번호, 용어 빈도, 용어 위치), offsets(문서 번호, 용어 빈도, 용어 위치, 시작·끝 문자 오프셋). 기본값은 positions예요.
index_phrases 2-gram을 별도로 색인할지 여부를 지정하는 불리언 값이에요. 2-gram은 이 필드 문자열에서 연속된 두 단어의 조합이에요. slop 없는 더 빠른 정확한 구문 쿼리를 만들지만 인덱스는 더 커져요. 불용어를 제거하지 않을 때 가장 잘 작동해요. 기본값은 false예요.
index_prefixes 용어 접두사를 별도로 색인할지 여부를 지정하는 JSON 객체예요. 접두사의 문자 수는 min_chars와 max_chars 사이(포함)예요. 더 빠른 접두사 검색을 만들지만 인덱스는 더 커져요. 선택 파라미터: min_chars, max_chars. 기본 min_chars는 2, max_chars는 5예요.
meta 이 필드에 대한 메타데이터를 받아요.
norms 관련성 점수 계산 시 필드 길이를 사용할지 여부를 지정하는 불리언 값이에요. 기본값은 true예요.
position_increment_gap text 필드가 분석되면 위치가 할당돼요. 필드가 문자열 배열을 포함하고 이 위치들이 연속적이라면 서로 다른 배열 요소 간의 매칭이 발생할 수 있어요. 이를 방지하기 위해 연속된 배열 요소 사이에 인위적인 갭이 삽입돼요. 정수 position_increment_gap을 지정해 이 갭을 바꿀 수 있어요. 참고: slop이 position_element_gap보다 크면 서로 다른 배열 요소 간의 매칭이 발생할 수 있어요. 기본값은 100이에요. 동적으로 업데이트 가능해요.
similarity 관련성 점수를 계산하는 랭킹 알고리즘이에요. 기본값은 BM25예요.
term_vector 이 필드에 대한 용어 벡터를 저장할지 여부를 지정하는 불리언 값이에요. 기본값은 no예요.

Term vector 파라미터

term vector는 분석 중에 생성돼요. 여기에는 다음이 포함돼요.

  • 용어 목록.
  • 각 용어의 순서 위치(ordinal position).
  • 필드 안 검색 문자열의 시작·끝 문자 오프셋.
  • 페이로드(사용 가능한 경우). 각 용어는 용어의 위치와 연관된 사용자 지정 이진 데이터를 가질 수 있어요.

term_vector 필드는 다음 파라미터를 받는 JSON 객체를 포함해요.

파라미터 저장 값
no 없음. 기본값이에요.
yes 필드의 용어.
with_offsets 용어와 문자 오프셋.
with_positions_offsets 용어, 위치, 문자 오프셋.
with_positions_offsets_payloads 용어, 위치, 문자 오프셋, 페이로드.
with_positions 용어와 위치.
with_positions_payloads 용어, 위치, 페이로드.

위치를 저장하는 것은 근접성 쿼리에 유용해요. 문자 오프셋을 저장하는 것은 하이라이팅에 유용해요.

Term vector 파라미터 예시

term vector에 문자 오프셋을 저장하는 text 필드가 있는 매핑을 만들어 볼게요.

PUT testindex
{
  "mappings" : {
    "properties" : {
      "dob" : {
        "type" :  "text",
        "term_vector": "with_positions_offsets"
      }
    }
  }
}

text 필드가 있는 문서를 색인해요.

PUT testindex/_doc/1
{
    "dob" : "The patient's date of birth."
}

"date of birth"를 쿼리하고 원래 필드에서 하이라이트해요.

GET testindex/_search
{
  "query": {
    "match": {
      "dob": "date of birth"
    }
  },
  "highlight": {
    "fields": {
      "dob": {} 
    }
  }
}

응답에서 "date of birth" 단어들이 하이라이트돼요.

{
  "took" : 854,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "testindex",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "text" : "The patient's date of birth."
        },
        "highlight" : {
          "text" : [
            "The patient's date of birth."
          ]
        }
      }
    ]
  }
}

더 알아보기 (Learn more)