2018년 12월 3일 월요일

Query DSL 맛보기

Elasticsearch에서 원하는 데이터만 삭제하고 싶을 때는 원하는 데이터만 골라주는 쿼리문을 작성해야 하는데, 이때 JSON 기반의 쿼리문을 사용한다. 간단히 얘기하면 {}를 이용해서 계층을 구분하는 쿼리문.

다음은 message 필드값이 'this is a test'인 데이터를 조회하는 'query - match - 필드명' 구조의 쿼리문.


쿼리문 작성 같은 건 당최 모르겠고 할 때, 전에는 Discover 메뉴에서 Request 소스코드에 박힌 쿼리문을 복사해올 수 있었다. 그런데 어느 순간 해당 기능이 사라짐. (나중에 다시 생김..)

꼼짝없이 쿼리문을 작성해야 하는 상황. 근데 가만 보니 쿼리 구조가 그리 복잡해보이진 않는다. 'query - match - field' 구조만 맞춰주면 되잖아? 다음은 event_id가 4688인 데이터만 조회하는 쿼리문. 조회 결과는 31개.


Discover 메뉴에서 조회한 결과도 같다.


다음은 특정 기간 5분 동안 발생한 모든 데이터를 조회하는 쿼리문. match 대신 range 옵션 사용.

참고로 엘라스틱 쿼리문에서 시간값은 유닉스 시간 형식으로 입력해야 하는데, 유닉스 시간은 10자리 초시간이지만 엘라스틱에서는 밀리초 단위까지 포함한 13자리 값을 입력해야 한다.


역시 Discover 메뉴에서도 15개의 결과가 조회된다.


필드가 2개 이상이면?

논리 연산을 지원하는 bool 옵션을 사용하면 된다. 이때 must(AND 연산), should(OR 연산) 등의 하위 옵션을 이용해서 2개 이상의 필드를 검색 조건으로 지정할 수 있다. 다음은 'event_id 값이 4688 AND 특정 기간 5분' 조건의 쿼리문. 조회된 데이터는 6개.


Discover 메뉴에서 조회된 데이터도 6개.


'bool - must' 구조 안에 event_id와 @timestamp 필드를 나열한 쿼리문 구조.

GET logstash-2018.11.29/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "event_id": 4688
          }
        },
        {
          "range": {
            "@timestamp": {
              "gte": 1543517400000,
              "lte": 1543517700000
            }
          }
        }
      ]
    }
  }
}

Dev Tools 메뉴의 자동완성 기능이 전체 구조를 유지해주기 때문에 몇 번 써보면 금방(?) 익숙해질 수 있을 것 같다.


21.01.29
range query에서 시간값 지정 시 유닉스 포맷 대신 날짜 포맷을 사용할 수 있다. 원래 됐었나?

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스