Fields 매핑 파라미터

Fields 매핑 파라미터

fields 매핑 파라미터는 추가 하위 필드를 정의해 같은 필드를 여러 방식으로 인덱싱할 수 있게 해줘요. multi-fields를 사용하면 하나의 데이터 표현에서는 전체 텍스트 검색을, 다른 표현에서는 정확히 일치시키는 연산을 수행할 수 있어요.

출처: 문서

본문

fields 매핑 파라미터는 추가 하위 필드를 정의해 같은 필드를 여러 방식으로 인덱싱할 수 있게 해줍니다. multi-fields에서 기본 필드 값은 주 매핑을 사용해 저장됩니다. 또한 다양한 검색 및 집계 요구를 지원하는 대체 매핑(예: 다른 데이터 타입이나 분석기)으로 하나 이상의 하위 필드를 구성할 수 있습니다.

Multi-fields는 데이터의 한 표현에서는 전체 텍스트 검색을, 다른 표현에서는 정확히 일치시키는 연산(정렬 또는 집계 등)을 수행해야 할 때 특히 유용합니다. 또한 같은 필드를 다른 분석기로 인덱싱할 수도 있습니다. 예를 들어 한 하위 필드는 일반 텍스트 검색에 기본 분석기를 사용하고, 다른 하위 필드는 자동 완성이나 퍼지 매칭을 지원하기 위해 n-gram을 생성하는 맞춤형 분석기를 사용할 수 있습니다.

Multi-fields 구성

다음 예제에서는 title 필드가 전체 텍스트로 분석되는 articles라는 인덱스를 만듭니다. fields 아래에 raw라는 하위 필드가 정의되어 정확히 일치시키는 쿼리를 위해 같은 값을 keyword로 저장합니다.

PUT /articles
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

다른 분석기 사용

다음 예제에서는 같은 title 필드를 두 개의 다른 분석기로 인덱싱합니다. 주 필드는 전체 텍스트 검색에 기본 분석기를 사용하고, ngrams 하위 필드는 자동 완성 같은 기능을 지원하는 맞춤형 n-gram 분석기를 사용합니다.

PUT /articles
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ngram_analyzer": {
          "tokenizer": "ngram_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "ngram_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 4,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "fields": {
          "raw": {
            "type": "keyword"
          },
          "ngrams": {
            "type": "text",
            "analyzer": "ngram_analyzer"
          }
        }
      }
    }
  }
}

문서 인덱싱

인덱스가 생성된 후 문서를 인덱싱할 수 있습니다. title 필드는 매핑에 정의된 대로 처리되며, 하위 필드들은 같은 값의 대체 표현을 제공합니다.

PUT /articles/_doc/1
{
  "title": "Understanding Multi-Fields in Search"
}

Multi-fields 쿼리

쿼리에서 추가 하위 필드를 대상으로 삼아 다양한 요구에 맞출 수 있습니다. 예를 들어 title의 정확한 값에 집계하려면 다음 요청으로 title.raw 하위 필드를 쿼리합니다.

POST /articles/_search
{
  "size": 0,
  "aggs": {
    "titles": {
      "terms": {
        "field": "title.raw"
      }
    }
  }
}

keyword로 매핑된 title.raw 하위 필드는 원래 title 필드가 전체 텍스트로 분석되더라도 정확히 일치시키는 집계를 허용합니다.

{
  ...
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "titles": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "Understanding Multi-Fields in Search",
          "doc_count": 1
        }
      ]
    }
  }
}

또는 자동 완성 기능을 사용하려면 title.ngrams 하위 필드에 match 쿼리를 실행할 수 있습니다.

POST /articles/_search
{
  "query": {
    "match": {
      "title.ngrams": "Und"
    }
  }
}

title.ngrams 하위 필드는 맞춤형 n-gram 분석기를 사용하므로 Und 접두어가 Understanding이라는 단어의 시작 부분과 성공적으로 매칭됩니다.

{
  ...
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "articles",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "title": "Understanding Multi-Fields in Search"
        }
      }
    ]
  }
}

더 알아보기 (Learn more)