2장. 필드 타입 및 조회 방법

Mapping이란?

Mapping은 필드가 저장되고 인덱싱되는 방식을 정의하는 프로세스다. Elasticsearch는 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 데이터 타입에 대한 매핑 정보가 자동으로 생성된다. 하지만, 자신이 원하지 않는 타입으로 지정될 경우 수정이 불가능하므로 상황에 따라 필드에 미리 매핑정보를 정의해야 하는 경우가 있다.

 

Field Data Type

Field Type 설명
Text keyword  입력된 문자열을 하나의 토큰으로 저장한다. 검색 시 필터링, 정렬, 집계 시 많이 사용하며, 별도의 분석기를 거치지 않기 때문에 키워드 등 정확한 검색을 할때 유용
text  입련된 문자열을 쪼개어 역색인 구조로 만든다.
Numeric long  64비트 정수
integer  32비트 정수
short  16비트 정수
byte  8비트 정수
double 
64비트 실수
 
float
32비트 실수
 
half_float 
16비트 실수
 
scaled_float  실수형이지만 부동소수점이 아니라 long 형태로 저장하고 옵션으로 소수점 위치를 지정
Date  date  ISO8601 형식을 따라 입력되며, 형식이 안맞으면 text, keyword로 인식하여 저장
"2019-06-12"
"2019-06-12T17:13:40"
"2019-06-12T17:13:40+09:00"
"2019-06-12T17:13:40.428Z"
Boolean  boolean  true와 false 두가지 값을 갖는 필드
보통 term 쿼리를 이용해서 검색
Object object 한 요소가 여러 하위 정보를 가지고 있는 경우
Nested  nested  필드에 여러개의 object 값들이 서로 다른 역색인 구조를 갖도록 할때는 Nested 타입으로 지정

 

조회 방법

Elasticsearch에서는 검색을 위해 JSON을 기반으로 하는 QueryDSL을 사용하여 점수를 계산하고 점수로 검색 결과를 정렬한다. 

 

Query DSL

Match all Query

모든 문서를 검색하는 쿼리이다.

// match all 검색 예시
{
  "query" : { 
    "match_all": {}
  }
}

 

Match Query

텍스트, 숫자, 날짜 등 색인된 데이터와 일치하는 문서를 찾는 기본 필드 검색 쿼리이다.

Match 검색은 기본적으로 or 검색이 되며 and 검색을 하고 싶은 경우에는 operator 값을 and로 변경해주면 된다.

( ex : '플레티어 테크팀' 으로 검색 시 or 검색이면 플레티어 or 테크팀으로 각각 검색되어 검색 결과가 나온다.)

 

// 상품명 검색 예시
{
  "query" : { 
    "match": {
      "goodsNm": {
        "query": "상품"
      }
    }
  }
}

// 상품명 and 검색 예시
{
  "query" : { 
    "match": {
      "goodsNm": {
        "query": "상품",
        "operator" : "and"
      }
    }
  }
}

 

Match phrase Query

구문 전체가 띄어쓰기까지 일치하는 문서를 검색하는 쿼리이다.

// 상품명 검색 예시
{
  "query" : { 
    "match_phrase": {
      "goodsNm": "플래티어 테크팀"
    }
  }
}

 

Term Query

term 쿼리는 정확한 키워드가 포함된 문서를 검색한다. match 쿼리와 비슷하지만 text 필드를 조회 시 주의해야하는 사항이 있다. "플래티어 테크팀"이란 문자열이 있을때 text 타입은 [플래티어,테크팀]으로 역색인이 되는데 term으로 "플래티어"를 검색하면 문서를 찾을 수 있지만 "플래티어 테크팀"으로 검색 시 결과가 검색되지 않을 수 있다.

// 브랜드 검색 예시
{
  "query" : {
    "term": {
      "brandNo": {
        "value": "11000"
      }
    }
  }
}

 

Query string Query

매개변수에 다양한 질의문을 사용해서 사용할 수 있는 쿼리이다. 개인적으로는 like 검색을 사용하기 위해 사용하였다.

// 상품명 like 검색 예시
{
  "query" : { 
    "query_string": {
      "default_field": "goodsNm",
      "query": "*상품*"
    }
  }
}

 

Bool Query

bool 의 조건으로는 must, filter, should, must_not이 이 있으며, 조건들의 조합으로 적용하여 검색 결과를 찾아낼 수 있다.

  • must : 모든 query가 일치하는 문서 검색
  • filter : 모든 query가 일치하는 문서 검색 (score에 영향x)
  • should : query가 하나라도 일치하는 문서 검색 
  • must_not : 모든 query가 일치하지 않는 문서 검색
// bool 검색 예시
{
  "query" : {
    "bool": {
    	// '프로모션' 값이 들어간 데이터 검색
        "must": [
            {
              "query_string": {
                  "default_field": "goodsNm",
                  "query": "*프로모션*"
              }
            }
        ],
    	// must가 있으므로 '상품'이 없어도 검색
        "should": [
            {
                "query_string": {
                    "default_field": "goodsNm",
                    "query": "*상품*"
                }
            }
        ],
        // '플래티어' 값이 안들어간 데이터 검색
        "must_not": [
            {
                "query_string": {
                    "default_field": "goodsNm",
                    "query": "*플래티어*"
                }
            }
        ]
    }
  }
}

 

Range Query

범위를 지정하여 해당하는 값을 가지고 있는 문서를 검색한다.

파라메터는 아래 4가지가 있다.

  • gte : 이상
  • gt: 초과
  • lte : 이하
  • lt : 미만
// 상품가격 범위 검색 예시
{
  "query" : {
    "range": {
      "salePrc": {
      	//1000원이상 10000원 이하 상품 검색
        "gte": 1000,
        "lte": 10000
      }
    }
  }
}

 

 

Function score Query

검색 필드로 부스팅하여 스코어를 조정하는 것보다 좀 더 디테일하게 스코어링 하기위해 사용하는 쿼리

  • boost_factor : 단순 상수를 곱하여 계산
  • field_value_factor : 카운트된 값 등의 숫자형 필드를 검색할 시 사용
  • script_score : 스크립트 표현식을 사용하여 가장 자유도가 높은 스코어링 방식
  • random_score : 문서를 랜덤하게 정렬할때 사용
  • decay function  : 특정 필드 값을 이용하여 스코어를 줄여가는 함수
    • offset : origin에서 스코어가 줄지 않는 거리
    • origin : 스코어가 가장 높은 지점
    • scale : origin에서 멀어지는 단위
    • decay : scale당 줄어드는 단위
// decay 검색 예시
{
	"query": {
        "function_score": {
            "query": {
              "match_all": {}
            },
            "functions": [
                {
                    "gauss": {
                        "goodsRegDtm": {
                            "origin": "now",
                            "scale": "7d",
                            "decay": 0.9
                        }
                    }
                }
            ]
        }
    }
}

 

Aggregation

Aggregation은 데이터를 지표, 통계 또는 기타 분석으로 요약한다.

  • Metirc Aggregation : avg, min, max, sum 등 주로 통곗값 계산으로 사용
  • Bucket Aggregation : range, terms 등 주로 특정기준에 맞춰서 grouping 하는 용도로 사용
// aggregation 검색 예시
{
	"query": {
      "match_all": {}
    },
    "aggs": {
        "category": {
            "nested": {
                "path": "dispCtgNo"
            },
            "aggs": {
                "category_keyword": {
                    "multi_terms": {
                        "size": 10000,
                        "terms": [
                            {
                                "field": "dispCtgNo.dispCtgNo.keyword"
                            },
                            {
                                "field": "dispCtgNo.ctgFullPath.keyword"
                            },
                            {
                                "field": "dispCtgNo.ctgFullPathNm.keyword"
                            }
                        ]
                    }
                }
            }
        }
    }
}

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유