ELASTICSEARCH

[엘라스틱서치] 4. Bool query, Range query

sejin2 2024. 3. 13. 10:15

Bool query : 여러 쿼리를 조합하여 사용 가능

  • must : 쿼리가 참인 문서들을 검색
  • must_not : 쿼리가 거짓인 문서들을 검색
  • should : 검색 결과 중 이 쿼리에 해당하는 문서들의 score를 높여줌
  • filter : 쿼리가 참인 문서를 검색하지만, score를 계산하지 않음 must보다 검색 속도가 빠르다

[사용법]

 GET 인덱스명/_search
 {
    "query":{
        "bool":{
            "must":[
                { 쿼리 }, ... 
            ],
            "must_not":[
            { 쿼리 }, ...
            ],
            "should":[
                { 쿼리 }, ...
            ],
            "filter":[
                { 쿼리 }, ...
            ]
        }
    }
 }

EX01 ) 조건 - 팀이 jazz 이고, golden states 가 참인 것 ( 둘 다 참인 것 )
golden states는 붙어있고, jazz는 들어가 있기만 하면 됨.

GET basketball/_search
 {
    "query":{
        "bool":{
            "must": [
                {"match" : {"team" : "jazz"}},
                {"match_phrase" : {"team" : "Golden States"}}
            ]
        }
    }
 }

EX02) 조건 - Golden States 사이에 1개 단어가 들어오는 것은 허용

 GET basketball/_search
    {
      "query":{
        "bool":{
          "must": [
            {"match": {"team":"Jazz"}}, 
            {"match_phrase":{
              "team": {
                  "query" : "Golden States",
                  "slop":1
                }
              }
            }
          ]
        }
      }
    }

EX03) 조건 - Jazz 있고, Golden States 없음

GET basketball/_search
{
  "query":{
    "bool":{
      "must": [
        {"match": {"team":"Jazz"}}
      ],
      "must_not": [
        {"match_phrase": {"team" : "Golden States"}}
      ]
    }
  }
}

EX04) should : 검색 점수 조정을 위해 사용 ( 가중치를 주어 상위로 올리기 )

GET basketball/_search
{
    "query":{
        "bool":{
          "must":[{
            "match":{"team":"jazz"}
          }],
          "should":[{
            "match":{"team":"Golden"}
          }]
        }
    }
}

EX05) filter : score에 영향을 주지 않고 검색 -> jazz로만 검색한 것과 같은 score를 가짐

GET basketball/_search
 {
  "query":{
    "bool":{
      "must":[
      {
        "match":{"team":"jazz"}
      }],
      "filter":[
       {
        "match":{"team":"Golden"} 
       }
      ]
    }
  }
}

 

Range query : 숫자나 날짜 형식의 범위를 검색

  • gte : ~ 이상
  • gt : ~ 초과
  • lte : ~ 이하
  • lt : ~ 미만

EX01) points가 10~19 사이 검색

GET basketball/_search
{
  "query":{
    "range":{
      "points":{
        "gte":10, 
        "lt":20
      }
    }
  }
}

EX02) submit_date에서 2023년도 사이 검색

GET basketball/_search
{
  "query":{
    "range":{
      "submit_date":{
        "gte" : "2023-01-01",
        "lte" : "2023-12-31"
      }
    }
  }
}