ElasticSearch

사내에서 RDBMS -> Elasticsearch로 전환하는 데이터 개선 프로젝트를 진행하기 때문에 학습을 목적으로 Elasticsearch의 Query DSL(Domain Specific Languag)에 대해 정리해보려고 합니다.

 

RDBMS 와 ElasticSearch의 비교 

RDBMS Elasticsearch

schema mapping

database

table

index
row document
column field

 

RDBMS Elasticsearch

SELECT GET

UPDATE

PUT
INSERT POST
DELETE DELETE

Dev Tools

Elasticsearch의 데이터 접근을 위해서는 curl, url 등을 통해 접근할 수 있는데 Kibana의 Dev Tools 기능을 이용하면 간단하게 접근할 수 있습니다.

좌측 메뉴 → Management → Dev Tools

 

Console에 query를 입력 후 우측에 세모 버튼을 클릭하면 결과를 확인할 수 있습니다. 

 

 

ElasticSearch Query DSL

아래 내용은 ElasticSearch 쿼리의 예시이며, 기본적으로 질의를 위해선 "query" 속성을 사용합니다.

GET /인덱스명/_search

{

    "query": {

        ...

    }

}

 

term, terms 

term은 형태소 분석기에 의해 나눠진 토큰을 기반으로 동작하며, term에 주어진 질의와 나눠진 토큰에 일치하는 문장을 찾습니다.

만약 상품명(productName)이 "테스트11 입니다." 이며, 형태소 분석에 의해 "테스트" / "11" / "입니다." 로 나눠지고 term에 질의문이 "테스트11" 인 경우 일치하는 토큰이 없기 때문에 결과를 찾을 수 없습니다. 

term은 1개의 질의만 가능하지만 terms는 1개 이상의 질의가 가능 

GET /tcmpny_link/_search

{

  "query" : {

    "term": {

      "productName": "테스트11"

    }

  }

}

GET /tcmpny_link/_search

{

  "query" : {

    "terms": {

      "productName": ["테스트11", "테스트22"]

    }

  }

}

 

match

match는 term과 동일하게 형태소 분석기에 의해 나눠진 토큰을 기반으로 동작하지만, 주어진 질의도 형태소 분석을 하여 토큰으로 나눈 이후 일치하는 문장을 찾습니다. 

만약 상품명(productName)이 "테스트11 입니다." 이며, 형태소 분석에 의해 "테스트" / "11" / "입니다." 로 나눠지고 match에 질의문이 "테스트11"인 경우 형태소 분석에 의해 "테스트" / "11" 로 나눠지기 때문에 term과 다르게 결과를 찾을 수 있습니다.

GET /tcmpny_link/_search

{

  "query" : {

    "match": {

      "productName": "테스트11"

    }

  }

}

 

multi_match

muti_match는 여러 필드에 단일 질의문을 질의할때 사용합니다.

GET /tcmpny_link/_search

{

  "query" : {

    "multi_match": {

      "fields": ["productName", "productMaker"],

      "query": "테스트"

    }

  }

}

 

match_phrase

match_phrase 는 match와 다르게 토큰의 순서까지 일치해야 됩니다.

만약 "테스트 샴푸" 키워드 검색 시 match인 경우는 "테스트"라는 상품명이 존재 시 결과가 나오지만 match_phrase는 띄어쓰기까지 포함한 "테스트 샴푸"라는 상품명이 존재해야지만 결과가 나옵니다.  

GET /tcmpny_link/_search

{

  "query" : {

    "match_phrase": {

      "productName": "테스트 샴푸"

    }

  }

}

 

bool

bool은 하위에 여러 질의를 결합하여 결과를 낼때 사용합니다.

bool - must

bool - must 는 지정된 모든 질의가 모두 TRUE가 되야 결과가 나옵니다.  (AND 조건)

상품명에 "테스트", "샴푸" 모두 존재하면 결과 노출 

GET /tcmpny_link/_search

{

  "query" : {

    "bool" : {

      "must": [

        {"match": {"productName": "테스트"}},

        {"match": {"productName": "샴푸"}}

      ]

    }

  }

}

 

bool - should

bool - should는 지정된 질의중 하나라도 TRUE가 되면 결과가 나옵니다.  (OR 조건)

상품명에 "테스트", "샴푸" 하나라도 존재하면 결과 노출

GET /tcmpny_link/_search

{

  "query" : {

    "bool" : {

      "should": [

        {"match": {"productName": "테스트"}},

        {"match": {"productName": "샴푸"}}

      ]

    }

  }

}

 

bool - must_not

bool - should는 지정된 모든 질의가 모두 false가 되면 결과가 나옵니다.  (NOT 조건)

상품명에 "테스트", "샴푸" 모두 없으면 결과 노출

GET /tcmpny_link/_search

{

  "query" : {

    "bool" : {

      "must_not": [

        {"match": {"productName": "테스트"}},

        {"match": {"productName": "샴푸"}}

      ]

    }

  }

}

 

range 

range는 범위 질의로 주로 숫자나 날짜 질의에 사용합니다.

  • gte (Greater-than or equal to) - 이상 (같거나 큼)
  • gt (Greater-than) – 초과 (큼)
  • lte (Less-than or equal to) - 이하 (같거나 작음)
  • lt (Less-than) - 미만 (작음)

 

가격(pcPrice)이 1000 이상 3000 이하 검색 

GET /tcmpny_link/_search

{

  "query" : {

    "range" : {

      "pcPrice": {

        "gte": 1000,

        "lte": 3000

      }

    }

  }

}

수정일(modifyDate)이 2019-08-19 검색 

GET /tcmpny_link/_search

{

  "query" : {

    "range" : {

      "modifyDate": {

        "gte": "2019-08-19 00:00:00",

        "lte": "2019-08-19 23:59:59"

      }

    }

  }

}

 

sort

sort는 정렬 질의로 검색 결과를 정렬할 수 있습니다. 

수정일(modifyDate) 내림차순, 가격(pcPrice) 오름차순 정렬

GET /tcmpny_link/_search

{

  "query" : {

    "range" : {

      "modifyDate": {

        "gte": "2019-08-19 00:00:00",

        "lte": "2019-08-19 23:59:59"

      }

    }

  },

  "sort": [

    {"modifyDate": "desc"},

    {"pcPrice": "asc"}

  ]

}

 

from - size

from size는 페이징 처리 시 유용하게 사용이 가능합니다  from은 offset이고 size는 limit 개념입니다. 

GET /tcmpny_link/_search

{

  "from" : 0,

  "size" : 10,

  "query" : {

    "range" : {

      "modifyDate": {

        "gte": "2019-08-19 00:00:00",

        "lte": "2019-08-19 23:59:59"

      }

    }

  },

  "sort": [

    {"modifyDate": "desc"},

    {"pcPrice": "asc"}

  ]

}

 

프로젝트를 진행하면서 필요한 내용이 있으면 추가할 예정입니다.

'기타' 카테고리의 다른 글

GIT  (0) 2021.03.07
알림 관련 프로세스 (FCM, Web Socket, SSE)  (0) 2020.08.16
권한 인증방식  (0) 2020.08.16
Template Engine  (0) 2020.08.15
Database CRUD 타입 및 사용 방법  (0) 2020.08.09

Tags

Read Next