Elasticsearch

Elasticsearch Query DSL

illho 2024. 3. 18. 12:52

풀 텍스트 쿼리 - Full Text Query

 

인덱스를 하나 생성해서 테스트 데이터를 넣는다.

PUT sport_3

GET sport_3/_search

POST sport_3/_bulk
{"index":{"_id":1}}
{"message":"soccer is good"}
{"index":{"_id":2}}
{"message":"soccer is good and great"}
{"index":{"_id":3}}
{"message":"soccer is very good and great"}
{"index":{"_id":4}}
{"message":"soccer and baseball"}
{"index":{"_id":5}}
{"message":"baseball and basketball"}

 

 

match_all

match_all은 별다른 조건 없이 해당 인덱스의 모든 도큐먼트를 검색하는 쿼리이다.

검색시 쿼리를 넣지 않으면 elasticsearch는 자동으로 match_all을 적용해서 해당 인덱스의 모든 도큐먼트를 검색한다.

 

명령어

GET sport_3/_search

 

 

결과

 

match 

match 쿼리는 풀 텍스트 검색에 가장 일반적인 쿼리이다. 

sport_3 의 인덱스의 message 필드에 soccer가 포함되는 문서를 찾아보겠다.

 

명령어

GET sport_3/_search
{
  "query" : {
    "match" : {
      "message" : "baseball"
    }
  }
}

 

 

결과

 

match 검색에 여러 개의 검색어를 집어넣게 되면 디폴트로 OR 조건으로 검색이 된다.

 

명령어

GET sport_3/_search
{
  "query" : {
    "match" : {
      "message" : "baseball soccer"
    }
  }
}

 

 

결과

 

검색 조건이 OR가 아닌 AND로 바꾸려면 operator 옵션을 사용할 수 있다.

이때는 문법이 바뀐다.

 

<필드명>:<검색어>

 

 

=>

 

<필드명>: { "query":<검색어>, "operator": }

 

 

명령어

GET sport_3/_search
{
  "query" : {
    "match" : {
      "message" : {
        "query" : "soccer baseball",
        "operator": "and"
      }
    }
  }
}

 

결과

 

 

match_phrase

찾는 구문을 공백을 포함해서 정확히 일치하는 내용을 검색할때 사용한다.

match_phrase 쿼리는 입력된 검색어를 순서까지 고려하여 검색을 수행한다.

 

 

명령어

GET sport_3/_search
{
  "query" : {
    "match_phrase": {
      "message" : "good and great"
    }
  }
}

 

결과

 

 

match_phrase 쿼리는 slop 이라는 옵션을 이용하여 slop 에 지정된 값 만큼 단어 사이에 다른 검색어가 끼어드는 것을 허용할 수 있다.

 

 

명령어

GET sport_3/_search
{
  "query" : {
    "match_phrase": {
      "message" : {
        "query" : "soccer great",
        "slop": 3
      }
    }
  }
}

 

결과

 

 

query_string

url검색에 사용하는 검색문법을 본문 검색에 이용하고 싶을 때 query_string 쿼리를 사용할 수 있다.

message 필드에서 baseball , basketball 을 모두 포함하거나 is good 구문을 포함하는 도큐먼트를 검색해본다.

 

명령어

GET sport_3/_search
{
  "query" : {
    "query_string": {
      "default_field": "message",
      "query": "(basketball AND baseball) OR \"is good\""
    }
  }
}

 

결과

 

 

Reference

https://esbook.kimjmin.net/05-search/5.1-query-dsl