검색엔진/Elasticsearch / / 2023. 11. 17. 16:04

[Elasticsearch] Elasticsearch 검색 방법(Query DSL)

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"
                            }
                        ]
                    }
                }
            }
        }
    }
}
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유