bool 쿼리는 다음과 같이 4개의 인자를 가지고 있으며, filter의 경우만 score 계산을 하지 않는 Filter Context에 해당됨풀 텍스트 검색은 스코어 점수 기반으로 relevancy가 높은 결과부터 가져옴
이와 상반되는 특성을 Exact Value 라고 하는데, 값이 정확히 일치 하는지의 여부 만을 따지는 검색임
Exact Value에는 term, terms, range와 같은 쿼리들이 이 부분에 속하며, 스코어를 계산하지 않기 때문에 보통 bool 쿼리의 filter 내부에서 사용됨
- bool 쿼리 내에 위의 각 절들을 조합해서 사용할 수 있음
```
[GET] my_index/_search
{
"query": {
"bool": {
"must": [
{ <쿼리> }, …
],
"must_not": [
{ <쿼리> }, …
],
"should": [
{ <쿼리> }, …
],
"filter": [
{ <쿼리> }, …
]
}
}
}
```
{
"query": {
"bool": {
"must": [
{ "match": { "address": "rlatkd" } }
],
"must_not": [
{ "match": { "fruit": "banana" } }
]
}
}
} "query": {
"bool": {
"must": [
{"match": {
"address": "rlatkd"
}}
],
"should": [
{"match": {
"address": "banana"
}}
]
}
}filter 쿼리는 document가 검색 쿼리와 일치하는지 나타내는 _score 값을 계산하지 않도록 쿼리 실행을 최적화 함"query": {
"bool": {
"filter": {"term":{
"address.keyword":"rlatkd banana"
}}
}
}filter 안에 넣은 검색 조건들은 스코어를 계산하지 않지만 캐싱이 되기 때문에 쿼리가 더 가볍고 빠르게 실행됨
keyword 뒤에 설명할 range 쿼리와 같이 스코어 계산이 필요하지 않은 쿼리들은 모두 filter 안에 넣어서 실행하는 것이 좋음
- filter 쿼리 내에 여러 조건을 추가하고 싶을 때
```
[GET] summary/_search
{
"query": {
"bool": {
"filter": [
{ "term" : {"name": "rlatkd" }},
{ "terms" : {"category": ["a", "b"] }},
{ "range": { "createdAt": {"gte": "2024-06-12", "lte": "2024-06-13"}}}
]
}
}
}
```
filter 쿼리 내에 term, terms, range 는 relevance score를 계산하지 않기 때문에 캐싱이 됨
range 쿼리는 범위를 지정하여 범위에 해당하는 값을 갖는 document를 조회함Filter Context이며, 정수, 날짜를 비교할 수 있음{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"date": {
"gt": "2023-01-01"
}
}
}
}
}
}term 쿼리는 역색인에 명시된 토큰 중 정확한 키워드가 포함된 document를 조회함"query": {
"term": {
"address": "rlatkd"
}
}terms 쿼리는 배열에 나열된 키워드 중 하나와 일치하는 document를 조회함{
"query": {
"terms": {
"address": ["rlatkd", "banana", "apple"]
}
}
}regexp 쿼리는 정규 표현식 term 쿼리를 사용할 수 있음{
"query": {
"regexp":{
"address": ".*rlatkd"
}
}
}- . : 모든 문자열- * : 0개 이상의 자리수from은 default 0이고, size는 default 10임
- 3개의 document만 반환하도록 조회
```
{
"from" : 0,
"size" : 3,
"query":{
"match_all":{}
}
}
```
sort 쿼리로 특정 필드마다 하나 이상의 정렬을 추가 할 수 있음{
"sort" : [
{ "age" : "desc" },
{ "fruits" : "desc" },
"_address"
],
"query":{
"match_all":{}
}
}{
"_source": false,
"query":{
"match_all":{}
}
}{
"_source": ["address","fruits"],
"query":{
"match_all":{}
}
}