* 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로 최적화 된다.