검색 실행edit

몇 가지 기본 검색 매개변수를 익혔으므로 쿼리 DSL을 좀 더 자세히 알아보겠습니다. 먼저 반환된 문서 필드를 살펴볼까요? 기본적으로 전체 JSON 문서가 모든 검색의 일부로 반환됩니다. 이를 소스(검색 적중의 _source 필드)라고 합니다. 전체 소스 문서가 반환되는 것을 원치 않는다면 소스 의 일부 필드만 반환하도록 요청할 수 있습니다.

이 예는 검색에서 account_numberbalance(`_source`의 내부에 있음)의 2개 필드를 반환하는 방법을 보여줍니다.

GET /bank/_search
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}

위 예는 _source 필드를 줄였을 뿐입니다. 여전히 _source`라는 이름의 필드 하나만 반환하지만, 그 안에는 `account_numberbalance 필드만 있습니다.

SQL 배경 지식이 있다면 개념상 SQL SELECT FROM 필드 목록과 다소 비슷하다는 것을 알 수 있습니다.

쿼리 부분으로 진행할까요? 앞서 match_all 쿼리가 모든 문서를 비교하는 데 어떻게 사용되는지 알아봤습니다. match 쿼리라는 새로운 쿼리를 소개합니다. 이는 기본 필드 검색 쿼리라고 볼 수 있습니다. 즉 특정 필드 또는 필드 집합에 대해 검색이 수행됩니다.

이 예에서는 번호가 20인 계정이 반환됩니다.

GET /bank/_search
{
  "query": { "match": { "account_number": 20 } }
}

주소에 "mill"이라는 용어가 있는 모든 계정을 반환합니다.

GET /bank/_search
{
  "query": { "match": { "address": "mill" } }
}

여기서는 주소에 "mill" 또는 "lane"이라는 용어가 있는 모든 계정을 반환합니다.

GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

이 예는 match(match_phrase)의 변형으로 주소에 "mill lane" 문구가 있는 모든 계정을 반환합니다.

GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

이제 bool(Boolean) 쿼리에 대해 알아보겠습니다. bool 쿼리에서는 부울 로직을 사용하여 작은 쿼리로 더 큰 쿼리로 만들 수 있습니다.

이 예는 2개의 match 쿼리를 작성하고 주소에 "mill" 및 "lane"이 있는 모든 계정을 반환합니다.

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

위 예에서 bool must 절에 지정된 모든 쿼리가 true가 되어야 문서가 일치 항목으로 간주됩니다.

이와 달리 다음 예는 2개의 match 쿼리를 작성하고 주소에 "mill" 또는 "lane"이 있는 모든 계정을 반환합니다.

GET /bank/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

위 예에서 bool should 절에 지정된 쿼리 중 하나라도 true가 되면 문서는 일치 항목이 됩니다.

이 예는 2개의 match 쿼리를 작성하고 주소에 "mill" 및 "lane"이 없는 모든 계정을 반환합니다.

GET /bank/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

위 예에서 bool must_not 절에 지정된 쿼리 중 어느 것도 true가 아닐 때만 문서가 일치 항목이 됩니다.

하나의 bool 쿼리 내에 must, should, must_not 절을 동시에 조합할 수 있습니다. 또한 복잡한 다단계 부울 로직처럼 bool 절 내에 bool 쿼리를 작성할 수 있습니다.

이 예는 나이가 40세이지만 ID(아이다호)에 살고 있지 않은 사람의 모든 계정을 반환합니다.

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}