Elasticsearch-쿼리 DSL

Elasticsearch에서는 JSON 기반 쿼리를 사용하여 검색을 수행합니다. 쿼리는 두 개의 절로 구성됩니다.

  • Leaf Query Clauses −이 절은 특정 필드에서 특정 값을 찾는 일치, 용어 또는 범위입니다.

  • Compound Query Clauses − 이러한 쿼리는 원하는 정보를 추출하기위한 리프 쿼리 절과 기타 복합 쿼리의 조합입니다.

Elasticsearch는 많은 수의 쿼리를 지원합니다. 쿼리는 쿼리 키워드로 시작한 다음 JSON 개체 형식의 조건과 필터를 포함합니다. 다양한 유형의 쿼리가 아래에 설명되어 있습니다.

모든 검색어 일치

이것은 가장 기본적인 쿼리입니다. 모든 콘텐츠와 모든 개체에 대해 1.0의 점수를 반환합니다.

POST /schools/_search
{
   "query":{
      "match_all":{}
   }
}

위의 코드를 실행하면 다음과 같은 결과가 나옵니다.

{
   "took" : 7,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 1.0,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         },
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

전체 텍스트 쿼리

이러한 쿼리는 장이나 뉴스 기사와 같은 전체 텍스트 본문을 검색하는 데 사용됩니다. 이 쿼리는 특정 인덱스 또는 문서와 관련된 분석기에 따라 작동합니다. 이 섹션에서는 다양한 유형의 전체 텍스트 쿼리에 대해 설명합니다.

일치 쿼리

이 쿼리는 하나 이상의 필드 값이있는 텍스트 또는 구와 일치합니다.

POST /schools*/_search
{
   "query":{
      "match" : {
         "rating":"4.5"
      }
   }
}

위의 코드를 실행하면 아래와 같은 응답을받습니다.

{
   "took" : 44,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.47000363,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 0.47000363,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

다중 일치 쿼리

이 쿼리는 둘 이상의 필드가있는 텍스트 또는 구와 일치합니다.

POST /schools*/_search
{
   "query":{
      "multi_match" : {
         "query": "paprola",
         "fields": [ "city", "state" ]
      }
   }
}

위의 코드를 실행하면 아래와 같은 응답을받습니다.

{
   "took" : 12,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.9808292,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 0.9808292,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         }
      ]
   }
}

쿼리 문자열 쿼리

이 쿼리는 쿼리 구문 분석기와 query_string 키워드를 사용합니다.

POST /schools*/_search
{
   "query":{
      "query_string":{
         "query":"beautiful"
      }
   }
}

위의 코드를 실행하면 아래와 같은 응답을받습니다.

{
   "took" : 60,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
      "value" : 1,
      "relation" : "eq"
   },
………………………………….

용어 수준 쿼리

이러한 쿼리는 주로 숫자, 날짜 및 열거 형과 같은 구조화 된 데이터를 처리합니다.

POST /schools*/_search
{
   "query":{
      "term":{"zip":"176115"}
   }
}

위의 코드를 실행하면 아래와 같은 응답을받습니다.

……………………………..
hits" : [
   {
      "_index" : "schools",
      "_type" : "school",
      "_id" : "5",
      "_score" : 0.9808292,
      "_source" : {
         "name" : "Central School",
         "description" : "CBSE Affiliation",
         "street" : "Nagan",
         "city" : "paprola",
         "state" : "HP",
         "zip" : "176115",
         "location" : [
            31.8955385,
            76.8380405
         ],
      }
   }
]   
…………………………………………..

범위 쿼리

이 쿼리는 주어진 값 범위 사이의 값을 가진 개체를 찾는 데 사용됩니다. 이를 위해 다음과 같은 연산자를 사용해야합니다.

  • gte −보다 큼
  • gt −보다 큼
  • lte −보다 작음
  • lt −보다 작음

예를 들어, 아래 주어진 코드를 관찰하십시오-

POST /schools*/_search
{
   "query":{
      "range":{
         "rating":{
            "gte":3.5
         }
      }
   }
}

위의 코드를 실행하면 아래와 같은 응답을받습니다.

{
   "took" : 24,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

다음과 같은 다른 유형의 용어 수준 쿼리가 있습니다.

  • Exists query − 특정 필드에 null이 아닌 값이있는 경우.

  • Missing query − 이는 기존 쿼리와 완전히 반대이며,이 쿼리는 특정 필드가없는 객체 나 null 값을 갖는 필드를 검색합니다.

  • Wildcard or regexp query −이 쿼리는 정규 표현식을 사용하여 객체에서 패턴을 찾습니다.

복합 쿼리

이러한 쿼리는 and, or, not 또는 다른 인덱스 또는 함수 호출 등의 부울 연산자를 사용하여 서로 병합 된 서로 다른 쿼리의 모음입니다.

POST /schools/_search
{
   "query": {
      "bool" : {
         "must" : {
            "term" : { "state" : "UP" }
         },
         "filter": {
            "term" : { "fees" : "2200" }
         },
         "minimum_should_match" : 1,
         "boost" : 1.0
      }
   }
}

위의 코드를 실행하면 아래와 같은 응답을받습니다.

{
   "took" : 6,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 0,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   }
}

지역 쿼리

이러한 쿼리는 지리적 위치 및 지리적 지점을 처리합니다. 이러한 쿼리는 모든 위치에 가까운 학교 또는 기타 지리적 개체를 찾는 데 도움이됩니다. 지리적 포인트 데이터 유형을 사용해야합니다.

PUT /geo_example
{
   "mappings": {
      "properties": {
         "location": {
            "type": "geo_shape"
         }
      }
   }
}

위의 코드를 실행하면 아래와 같은 응답을받습니다.

{  "acknowledged" : true,
   "shards_acknowledged" : true,
   "index" : "geo_example"
}

이제 위에서 만든 인덱스에 데이터를 게시합니다.

POST /geo_example/_doc?refresh
{
   "name": "Chapter One, London, UK",
   "location": {
      "type": "point",
      "coordinates": [11.660544, 57.800286]
   }
}

위의 코드를 실행하면 아래와 같은 응답을받습니다.

{
   "took" : 1,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         "_index" : "geo_example",
         "_type" : "_doc",
         "_id" : "hASWZ2oBbkdGzVfiXHKD",
         "_score" : 1.0,
         "_source" : {
            "name" : "Chapter One, London, UK",
            "location" : {
               "type" : "point",
               "coordinates" : [
                  11.660544,
                  57.800286
               ]
            }
         }
      }
   }