* Query DSL?

유연하고 강력한 쿼리 언어
- 쿼리(Queries) : 적합도(relevance), full text, 캐쉬되지 않음(not cached), 느림
- 필터(Filters) : boolean yes/no, 적확한 값, 캐쉬됨(cached), 빠름
=> 필터를 먼저사용하고, 쿼리를 나중에 실행해야 한다. (Filter first, then query remaining docs)

1. 기본 쿼리
GET /bank/account/_search
{
 "query": {
        "match_all": {}
    }
}

2. 쿼리(Query) 구조

GET /_search
{
 "query" : {
  "filtered":{
   "query":{"match_all":{}},
   "filter":{"term":{"status":"active"}}
  }
 }
}

3. 데이터는 어떻게 색인이 되는가
- RDB의 경우 색인
  예) content가 brown 이나 fox를 찾을때 아래와 같이함
     where content like "%brown%fox%"
     =>느리고, 유연성이 없음
- ElasticSearch의 경우
   - 내부적으로 단어 분석이 됨
   - inverted index라고 불림
   - 텍스트가 아닌 것도 색인이 가능 : not text, numbers, dates, bools, enums, geopoints, geoshapes 등
  
4. 데이터 색인의 예
(1) 특정 필드가 들어있는지 검색 (WHERE field = "value") - term 키워드
- age가 39살인 고객정보 조회
GET /bank/account/_search
{
    "query" : {
        "term" : {
            "age" : 39
        }
    }
}


(2)특정 필드 여러개가 들어있는지 검색 (WHERE field in ["val",....]) - terms 키워드
- age가 29,39살인 고객정보 조회
- 주의 : 여러개 조회하므로 "terms" 키워드 사용해야함
GET /bank/account/_search
{
"query" : {
    "terms" : {
      "age" : [29,39]
    }
  }
}

(3) 범위 검색 (WHERE field >= "val1" AND field < "val2") - range 키워드
- age가 29~39 사이인 고객정보 조회
GET /bank/account/_search
{
"query" : {
    "range" : {
      "age" : {
        "gte" : 29,
        "lt" : 39
      }
    }
  }
}

참고) date의 경우
"range":{
 "date":{
  "gte" : "2014-01-01",
  "lt" : "2041-02-01"
 }
}

* 숫자/날짜 필드는 range filter로 최적화 된다.