Elasticsearch Query DSL
Bool 복합 쿼리 - Bool Query
query_string 쿼리는 여러 조건을 조합하기에는 용이하지만 옵션이 한정되어 있다.
본문 검색에서 여러쿼리를 조합하기 위해서는 상위에 bool 쿼리를 사용하고 그 안에 다른 쿼리들을 넣는 식으로 사용이 가능하다. bool 쿼리는 4개의 인자를 가지고 있으며 그 인자 안에 다른 쿼리들을 배열로 넣는 방식으로 동작한다.
- must : 쿼리가 참인 도큐먼트들을 검색한다.
- must_not : 쿼리가 거짓인 도큐먼트들을 검색합니다.
- should : 검색 결과 중 이 쿼리에 해당하는 도큐먼트의 점수를 높입니다.
- filter : 쿼리가 참인 도큐먼트를 검색하지만 스코어를 계산하지 않는다. must보다 검색 속도가 빠르고 캐시이 가능하다.
명령어
GET <인덱스명>/_search
{
"query": {
"bool": {
"must": [
{ <쿼리> }, …
],
"must_not": [
{ <쿼리> }, …
],
"should": [
{ <쿼리> }, …
],
"filter": [
{ <쿼리> }, …
]
}
}
}
ex) good 과 is basketball 이 포함된 모든 문서를 검색하는 쿼리
명령어
GET sport_3/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "good"
}
},
{
"match_phrase": {
"message": "is basketball"
}
}
]
}
}
}
결과
ex) good 과 is basketball 이 포함되지 않은 모든 문서를 검색하는 쿼리
명령어
GET sport_3/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"message": "good"
}
},
{
"match_phrase": {
"message": "is basketball"
}
}
]
}
}
}
결과
범위 쿼리 - Range Query
테스트 데이터
PUT sport_4
GET sport_4
POST sport_4/_bulk
{"index":{"_id":1}}
{"model":"soccer ball","price":300,"date":"2014-02-24"}
{"index":{"_id":2}}
{"model":"baseball ball","price":455,"date":"2015-03-15"}
{"index":{"_id":3}}
{"model":"basketball ball","price":669,"date":"2016-02-21"}
{"index":{"_id":4}}
{"model":"tennis ball","price":889,"date":"2017-03-29"}
조회 결과
ragne 쿼리는 range : { <필드명>: { <파라메터>:<값> } } 으로 입력 된다.
range 쿼리 파라메터는 4가지가 있다.
- gte - 이상 ( 같거나 큼)
- gt - 초과 (큼)
- lte - 이하 (같거나 작음)
- lt - 미만(작음)
price 가 600 이상 900 미만인 데이터를 검색해본다.
명령어
GET sport_4/_search
{
"query" : {
"range" : {
"price" : {
"gte" : 600,
"lt" : 900
}
}
}
}
결과
날짜도 숫자와 마찬가지로 range 쿼리의 사용이 가능하다.
기본적으로 elasticsearch 에서 날짜 값은 2024-03-19 또는 2024-03-19T10:15:30 과 같이 JSON 에서 일반적으로 사용되는 ISO8601 형식을 사용한다.
필드의 날짜가 2016년 1월 1일 이후인 도큐먼트들을 검색하는 쿼리이다.
명령어
GET sport_4/_search
{
"query" : {
"range" : {
"date" : {
"gt" : "2016-01-01"
}
}
}
}
결과
쿼리의 날짜 포맷을 다르게 하고 싶다면 format 옵션의 사용이 가능하다. || 을 사용해서 여러 값의 입력이 가능하다.
date 필드의 값이 2015년 12월 31일 부터 2018년 이전 사이 값들을 검색하는 쿼리이다.
명령어
GET sport_4/_search
{
"query": {
"range": {
"date": {
"gt": "31/12/2015",
"lt": "2018",
"format": "dd/MM/yyyy||yyyy"
}
}
}
}
결과
날짜를 검색 할 때는 검색하는 현재 시간을 가져오는 예약어 now와 y년 M월 d일 h시 m분 s초 w주 등의 사용이 가능하다.
date의 값이 2016년 1월 1일에서 6개월 후인 날 부터 오늘보다 365일 전인 날 사이의 데이터를 가져오는 쿼리이다.
명령어
GET sport_4/_search
{
"query" : {
"range" : {
"date" : {
"gt" : "2016-01-01||+6M",
"lt" : "now-365d"
}
}
}
}
결과