티스토리 뷰

Elasticsearch APIs

김종민 - Elastic 테크 에반젤리스트

Reference

Index 생성

  • library 인덱스 생성

    • shard 수 : 5

    • replica 수 : 1


PUT library
{
 "settings" : {
   "number_of_shards": 5,
   "number_of_replicas": 1
}
}

Bulk 색인

  • 다량의 도큐먼트를 한꺼번에 색인 할 때는 bulk API를 사용


POST library/books/_bulk
{"index":{"_id":1}}
{"title":"The quick brow fox", "price":5, "colors":["red", "green", "blue"]}
{"index":{"_id":2}}
{"title":"The quick brow fox jumps over the lazy dog", "price":15, "colors":["blue", "yellow"]}
{"index":{"_id":3}}
{"title":"The quick brow fox jumps over the quick dog", "price":8, "colors":["red", "blue"]}
{"index":{"_id":4}}
{"title":"brow fox brown dog", "price":2, "colors":["black", "yellow", "red", "blue"]}
{"index":{"_id":5}}
{"title":"Lazy dog", "price":9, "colors":["red", "blue", "green"]}

검색(_search)

전체 도큐먼트 검색

  • 기본적으로 _search의 옵션을 주지 않으면 기본적으로 인덱스의 전체 도큐먼트를 검색한다.

  • 이때는 score 검색을 하지 않아서, 모든 score는 1로 동등하다.


GET library/_search
{
 "query": {
   "match_all": {}
}
}


GET library/_search

매핑 정보 검색

  • RDB의 스키마에 해당하는 Elasticsearch의 매핑정보를 검색한다.

  • 리턴되는 값을 참조하면

  • library라는 인덱스 밑에 books라는 도큐먼트가 있고, 도큐먼트에는 3개의 필드 colors, price, title이 존재한다.

  • 필드안에는 타입과 하위 필드인 keyword 타입이 있다. keyword 타입은 aggregation에 쓰이는 필드를 저장하고, 이 내용들은 분석을 하지 않는다. 즉, 검색어로 쪼개지 않고 저장한다.


GET library/_mapping


{
 "library": {
   "mappings": {
     "books": {
       "properties": {
         "colors": {
           "type": "text",
           "fields": {
             "keyword": {
               "type": "keyword",
               "ignore_above": 256
            }
          }
        },
         "price": {
           "type": "long"
        },
         "title": {
           "type": "text",
           "fields": {
             "keyword": {
               "type": "keyword",
               "ignore_above": 256
            }
          }
        }
      }
    }
  }
}
}

키워드가 포함된 도큐먼트 검색

  • match query 사용해서 title필드에 fox가 포함된 도큐먼트들을 리턴


GET library/_search
{
 "query": {
   "match": {
     "title": "fox"
  }
}
}

복수의 키워드가 포함된 도큐먼트 검색

  • match query 사용, " "(공백)으로 분리


GET library/_search
{
 "query": {
   "match": {
     "title": "quick dog"
  }
}
}


{
 "took": 64,
 "timed_out": false,
 "_shards": {
   "total": 5,
   "successful": 5,
   "skipped": 0,
   "failed": 0
},
 "hits": {
   "total": 5,
   "max_score": 0.7564473,
   "hits": [
    {
       "_index": "library",
       "_type": "books",
       "_id": "2",
       "_score": 0.7564473,
       "_source": {
         "title": "The quick brow fox jumps over the lazy dog",
         "price": 15,
         "colors": [
           "blue",
           "yellow"
        ]
      }
    },
       
     ...

구문이 포함된 도큐먼트 검색

  • match_phrase query 사용, 해당 문자열이 포함된 도큐먼트 리턴


GET library/_search
{
 "query": {
   "match_phrase": {
     "title": "quick dog"
  }
}
}

복합 쿼리 - bool 쿼리를 이용한 서브쿼리 조합

must

  • "quick" 과 "lazy dog" 이 포함된 모든 문서 검색


GET /library/_search
{
 "query": {
   "bool": {
     "must": [
      {
         "match": {
           "title": "quick"
        }
      },
      {
         "match_phrase": {
           "title": {
             "query": "lazy dog"
          }
        }
      }
    ]
  }
}
}

must_not

  • "quick" 또는 "lazy dog" 이 포함되지 않은 문서 검색


GET /library/_search
{
 "query": {
   "bool": {
     "must_not": [
      {
         "match": {
           "title": "quick"
        }
      },
      {
         "match_phrase": {
           "title": {
             "query": "lazy dog"
          }
        }
      }
    ]
  }
}
}

특정 쿼리에 대한 가중치 조절(boost)

should

  • OR(||)랑 비슷하지만 같지는 않다.

  • 반드시 매칭 될 필요는 없지만, 매칭 되는 경우 더 높은 스코어를 가짐

  • 기본 boost값은 1이다. 아래의 경우 "lazy dog" 에 가중치를 3으로 설정했으므로 quick dog

  • 를 포함하고 있는 도큐먼트보다


GET /library/_search
{
 "query": {
   "bool": {
     "should": [
      {
         "match_phrase": {
           "title": "quick dog"
        }
      },
      {
         "match_phrase": {
           "title": {
             "query": "lazy dog",
             "boost": 3
          }
        }
      }
    ]
  }
}
}

must + should

  • must와 should를 같이 사용하게 되면, must를 우선적으로 매칭하고 must 조건을 만족하는 도큐먼트 중에서 should 쿼리의 매칭 여부에 따라 score가 결정 된다.


GET /library/_search
{
 "query": {
   "bool": {
     "should": [
      {
         "match_phrase": {
           "title": "lazy"
        }
      }
    ],
     "must": [  
      {
         "match_phrase": {
           "title": {
             "query": "dog"
          }
        }
      }
    ]
  }
}
}

Highlight - 매칭 된 부분 하이라이트

  • 검색 결과값이 크고 여러 필드를 사용하는 경우 유용하다

highlight

  • 검색결과 해당 단어와 매칭되는 단어를 highlight 표시


GET /library/_search
{
 "query": {
   "bool": {
     "should": [
      {
         "match_phrase": {
           "title": "lazy"
        }
      },
      {
         "match_phrase": {
           "title": {
             "query": "dog"
          }
        }
      }
    ]
  }
},
 "highlight" : {
   "fields" : {
     "title" : {}
  }
}
}
  • 검색 후 리턴 값의 highlight속성에는 em태그로 해당 키워드가 표시 된다.


{
 "took": 110,
 "timed_out": false,
 "_shards": {
   "total": 5,
   "successful": 5,
   "skipped": 0,
   "failed": 0
},
 "hits": {
   "total": 4,
   "max_score": 0.7564473,
   "hits": [
    {
       "_index": "library",
       "_type": "books",
       "_id": "2",
       "_score": 0.7564473,
       "_source": {
         "title": "The quick brow fox jumps over the lazy dog",
         "price": 15,
         "colors": [
           "blue",
           "yellow"
        ]
      },
       "highlight": {
         "title": [
           "The quick brow fox jumps over the <em>lazy</em> <em>dog</em>"
        ]
      }
    },
       
       ...

Filter - 검색 결과의 sub-set 도출

  • 스코어를 계산하지 않고 캐싱되어 쿼리보다 대부분 빠르다

(bool) must + filter

  • filter는 bool조건의 쿼리에서 사용할 수 있고, 아래의 쿼리는 "dog" 을 포함하고 있는 도큐먼트 중에서 price의 range가 5이상 10이하의 도큐먼트 들만 리턴한다.

  • 알아둬야 할 것은 filter 구문을 제거하고 search만 수행했을 경우의 score와 filter를 설정했을 때의 score가 같다는 것이다. 스코어를 다시 계산하지 않고 검색 결과가 나온것 중에서 sub-set만 도출하기 때문에 쿼리보다 빠르다.


GET /library/_search
{
 "query": {
   "bool": {
     "must": [
      {
         "match": {
           "title": "dog"
        }
      }
    ],
     "filter": {
       "range": {
         "price": {
           "gte": 5,
           "lte": 10
        }
      }
    }
  }
}
}

score가 필요 없는 경우 filter만 사용

  • score가 필요없이 특정 필드의 숫자 범위를 판단하는 상황에서는 filter만 사용할 수 있다. 이때는 true, false로 판단만 하게 된다.

  • 결과는 price가 5보다 큰(>5) 도큐먼트들만 리턴된다


GET /library/_search
{
 "query": {
   "bool": {
     "filter": {
       "range": {
         "price": {
           "gt": 5
        }
      }
    }
  }
}
}

분석 - Analysis(_analyze)

Tokenizer를 통해 문장을 검색어 term으로 분리

  • text로부터 분리된 offset과 type, position 정보 표시


GET library/_analyze
{
 "tokenizer": "standard",
 "text": "Brown fox brown dog"
}


{
 "tokens": [
  {
     "token": "Brown",
     "start_offset": 0,
     "end_offset": 5,
     "type": "<ALPHANUM>",
     "position": 0
  },
  {
     "token": "fox",
     "start_offset": 6,
     "end_offset": 9,
     "type": "<ALPHANUM>",
     "position": 1
  },
  {
     "token": "brown",
     "start_offset": 10,
     "end_offset": 15,
     "type": "<ALPHANUM>",
     "position": 2
  },
  {
     "token": "dog",
     "start_offset": 16,
     "end_offset": 19,
     "type": "<ALPHANUM>",
     "position": 3
  }
]
}

Filter(토큰필터)를 통해 쪼개진 term들을 가공

  • lowercase - 소문자로 변경


GET library/_analyze
{
 "tokenizer": "standard",
 "filter": [
   "lowercase"
],
 "text": "Brown fox brown dog"
}


{
 "tokens": [
  {
     "token": "brown",
     "start_offset": 0,
     "end_offset": 5,
     "type": "<ALPHANUM>",
     "position": 0
  },
     ...
  • unique - 중복 term 제거

    • 아래의 필터에서 lowercase를 제거하면, 대소문자를 구분하게 된다.


GET library/_analyze
{
 "tokenizer": "standard",
 "filter": [
   "lowercase",
   "unique"
],
 "text": "Brown brown brown fox brown dog"
}


{
 "tokens": [
  {
     "token": "brown",
     "start_offset": 0,
     "end_offset": 5,
     "type": "<ALPHANUM>",
     "position": 0
  },
  {
     "token": "fox",
     "start_offset": 18,
     "end_offset": 21,
     "type": "<ALPHANUM>",
     "position": 1
  },
  {
     "token": "dog",
     "start_offset": 28,
     "end_offset": 31,
     "type": "<ALPHANUM>",
     "position": 2
  }
]
}

(Tokenizer + Filter) 대신 Analyzer 사용

  • 기본적인 standard analyzer는 lowercase와 standard tokenizer가 적용된다.


GET library/_analyze
{
 "analyzer": "standard",
 "text": "Brown fox brown dog"
}

복합적인 문장 분석

  • T: standard, F: lowercase

    • 아래의 결과를 통해서 중요하게 알고 넘어가야 할 것은 standard tokenizer와 lowercase filter로 텍스트를 저장했을 경우, 결과 값으로 리턴되는 분리된 token으로 검색해야만 원래의 문장을 검색할 수 있다.


GET library/_analyze
{
 "tokenizer": "standard",
 "filter": [
   "lowercase"  
],
 "text": "THE quick.brown_FOx jumped! $19.95 @ 3.0"
}


{
 "tokens": [
  {
     "token": "the",
     "start_offset": 0,
     "end_offset": 3,
     "type": "<ALPHANUM>",
     "position": 0
  },
  {
     "token": "quick.brown_fox",
     "start_offset": 4,
     "end_offset": 19,
     "type": "<ALPHANUM>",
     "position": 1
  },
  {
     "token": "jumped",
     "start_offset": 20,
     "end_offset": 26,
     "type": "<ALPHANUM>",
     "position": 2
  },
  {
     "token": "19.95",
     "start_offset": 29,
     "end_offset": 34,
     "type": "<NUM>",
     "position": 3
  },
  {
     "token": "3.0",
     "start_offset": 37,
     "end_offset": 40,
     "type": "<NUM>",
     "position": 4
  }
]
}
  • T:letter, F:lowercase

    • letter tokenizer는 실제로 알파벳 문자가 아닌 모든것을 구분자로 판단한다. 따라서, lowercase의 분리된 문자열만 리턴된다.


GET library/_analyze
{
 "tokenizer": "letter",
 "filter": [
   "lowercase"  
],
 "text": "THE quick.brown_FOx jumped! $19.95 @ 3.0"
}


{
 "tokens": [
  {
     "token": "the",
     "start_offset": 0,
     "end_offset": 3,
     "type": "word",
     "position": 0
  },
  {
     "token": "quick",
     "start_offset": 4,
     "end_offset": 9,
     "type": "word",
     "position": 1
  },
  {
     "token": "brown",
     "start_offset": 10,
     "end_offset": 15,
     "type": "word",
     "position": 2
  },
  {
     "token": "fox",
     "start_offset": 16,
     "end_offset": 19,
     "type": "word",
     "position": 3
  },
  {
     "token": "jumped",
     "start_offset": 20,
     "end_offset": 26,
     "type": "word",
     "position": 4
  }
]
}

Email, URL 분석

  • T: standard


GET library/_analyze
{
 "tokenizer": "standard",
 "text": "elastic@example.com website: https://elastic.co"
}


{
 "tokens": [
  {
     "token": "elastic",
     "start_offset": 0,
     "end_offset": 7,
     "type": "<ALPHANUM>",
     "position": 0
  },
  {
     "token": "example.com",
     "start_offset": 8,
     "end_offset": 19,
     "type": "<ALPHANUM>",
     "position": 1
  },
  {
     "token": "website",
     "start_offset": 20,
     "end_offset": 27,
     "type": "<ALPHANUM>",
     "position": 2
  },
  {
     "token": "https",
     "start_offset": 29,
     "end_offset": 34,
     "type": "<ALPHANUM>",
     "position": 3
  },
  {
     "token": "elastic.co",
     "start_offset": 37,
     "end_offset": 47,
     "type": "<ALPHANUM>",
     "position": 4
  }
]
}
  • T: uax_url_email


GET library/_analyze
{
 "tokenizer": "uax_url_email",
 "text": "elastic@example.com website: https://elastic.co"
}


{
 "tokens": [
  {
     "token": "elastic@example.com",
     "start_offset": 0,
     "end_offset": 19,
     "type": "<EMAIL>",
     "position": 0
  },
  {
     "token": "website",
     "start_offset": 20,
     "end_offset": 27,
     "type": "<ALPHANUM>",
     "position": 1
  },
  {
     "token": "https://elastic.co",
     "start_offset": 29,
     "end_offset": 47,
     "type": "<URL>",
     "position": 2
  }
]
}

집계(Aggregation)

  • aggregation은 기본적으로 document value에 있는 값들을 사용한다. 그중에서도 저장했을때 타입이 keyword인 값들만 사용 가능

  • aggregation은 쿼리랑 같은 레벨에서 사용 가능

aggs terms를 이용한 colors.keyword 필드 값 집계

  • colors.keyword 타입을 집계하면, library 인덱스의 colors keyword별로 집계된 값들이 리턴 된다.


GET library/_search
{
 "size": 0,
 "aggs": {
   "popular-colors": {
     "terms": {
       "field": "colors.keyword"
    }
  }
}
}


{
 "took": 13,
 "timed_out": false,
 "_shards": {
   "total": 5,
   "successful": 5,
   "skipped": 0,
   "failed": 0
},
 "hits": {
   "total": 5,
   "max_score": 0,
   "hits": []
},
 "aggregations": {
   "popular-colors": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
      {
         "key": "blue",
         "doc_count": 5
      },
      {
         "key": "red",
         "doc_count": 4
      },
      {
         "key": "green",
         "doc_count": 2
      },
      {
         "key": "yellow",
         "doc_count": 2
      },
      {
         "key": "black",
         "doc_count": 1
      }
    ]
  }
}
}

검색(query)와 집계(aggregation) 동시에 사용

  • 검색 쿼리와 집계를 동시에 사용하면, 검색을 먼저 수행하고 그 결과로부터 aggregation을 수행한다.

  • 아래의 구문에서는 dog을 포함하고 있는 document 들의 colors.keyword타입을 집계한다.

  • size value를 0으로 주면, hits결과는 표시되지 않고 aggregations 결과값만 출력한다.

    • "size": 0


GET library/_search
{
 "query": {
   "match": {
     "title": "dog"
  }
},
 "aggs": {
   "popular-colors": {
     "terms": {
       "field": "colors.keyword"
    }
  }
}
}


{
 "took": 54,
 "timed_out": false,
 "_shards": {
   "total": 5,
   "successful": 5,
   "skipped": 0,
   "failed": 0
},
 "hits": {
   "total": 4,
   "max_score": 0.2876821,
   "hits": [
    {
       "_index": "library",
       "_type": "books",
       "_id": "5",
       "_score": 0.2876821,
       "_source": {
         "title": "Lazy dog",
         "price": 9,
         "colors": [
           "red",
           "blue",
           "green"
        ]
      }
    },
     
     ...검색 결과 중략...
    ,  
 "aggregations": {
   "popular-colors": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
      {
         "key": "blue",
         "doc_count": 4
      },
      {
         "key": "red",
         "doc_count": 3
      },
      {
         "key": "yellow",
         "doc_count": 2
      },
      {
         "key": "black",
         "doc_count": 1
      },
      {
         "key": "green",
         "doc_count": 1
      }
    ]
  }
}
}

여러개의 aggregation, sub-aggs 사용

  • aggregation 안에, 다시 sub-aggregation을 정의한다.

  • 아래의 코드는 두개의 aggregation을 구하게 된다.

  • 먼저 price-statistic로 정의된 aggregation은 library 인덱스에 대해서 price필드의 stats(통계 - count, min, max, avg, sum)을 구하고,

  • popular-colors는 먼저 colors.keyword로 terms를 정의하고, sub-aggs로 정의된 avg-price-per-color에서는 colors.keyword로 집계된 결과를 바탕으로 price의 평균값을 구하게 된다.

    • 반환되는 결과에는 bucket이 정의되고, bucket은 colors.keyword를 key로 구분한다.

    • 그 안에는 해당 컬러가 포함된 도큐먼트의 수와 price average값이 반환 된다.


GET library/_search
{
 "size": 0,
 "aggs": {
   "price-statistics": {
     "stats": {
       "field": "price"
    }
  },
   "popular-colors": {
     "terms": {
       "field": "colors.keyword"
    },
     "aggs": {
       "avg-price-per-color": {
         "avg": {
           "field": "price"
        }
      }
    }
  }
}
}


 
 ...

},
 "aggregations": {
   "popular-colors": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
      {
         "key": "blue",
         "doc_count": 5,
         "avg-price-per-color": {
           "value": 7.8
        }
      },
      {
         "key": "red",
         "doc_count": 4,
         "avg-price-per-color": {
           "value": 6
        }
      },
      {
         "key": "green",
         "doc_count": 2,
         "avg-price-per-color": {
           "value": 7
        }
      },
      {
         "key": "yellow",
         "doc_count": 2,
         "avg-price-per-color": {
           "value": 8.5
        }
      },
      {
         "key": "black",
         "doc_count": 1,
         "avg-price-per-color": {
           "value": 2
        }
      }
    ]
  },
   "price-statistics": {
     "count": 5,
     "min": 2,
     "max": 15,
     "avg": 7.8,
     "sum": 39
  }
}
}

Document Update

  • 동일한 URL에 데이터 입력시 기존 데이터가 대체됨

    • 반환되는 결과를 확인하면 update 된 경우 version이 +1 된다.

    • elasticsearch에서는 transaction 개념이 없기때문에 유의해야 한다.


GET library/books/1


POST library/books/1
{
 "title": "The quick brow fox",
 "price": 10,
 "colors": ["red","green","blue"]
}


{
 "_index": "library",
 "_type": "books",
 "_id": "1",
 "_version": 3,
 "found": true,
 "_source": {
   "title": "The quick brow fox",
   "price": 10,
   "colors": [
     "red",
     "green",
     "blue"
  ]
}
}

_update API 이용

  • elasticsearch에서 _update API를 사용하더라도 title만 업데이트 하는 것이 아닌, 전체 도큐먼트를 delete 후 insert하는 개념으로 업데이트가 이루어 진다.


POST library/books/1/_update
{
 "doc": {
   "title": "The quick fantastic fox"
}
}

Mapping

매핑 정보 확인

  • 데이터가 색인될 때, elasticsearch는 스스로 매핑정보를 만든다.

  • 저장되는 도큐먼트의 필드값을 확인하면서 타입을 판단한다.


GET library/_mapping

직접 매핑 설정한 인덱스 생성

  • famous-librarians라는 인덱스를 새로 생성한다.

  • settings에는 인덱스가 가지고 있는 시스템적인 설정값을 넣는다.

    • 샤드 수, 복제본 수, analysis(analyzer) 정보 등

    • analysis의 analyzer를 my-desc-analyzer로 정의하고,

    • custom type, uax_url_email 토크나이저, lowercase 필터를 사용하도록 설정한다.

  • mappings에는 매핑값을 성정한다.

    • famous-librarians라는 인덱스 밑에 librarian이라는 타입이 정의되고,

    • 5개의 필드가 정의 된다.

      • 각 필드의 타입과 포맷 그리고 해당 필드를 저장할 때 사용할 analyzer를 등록한다.

  • 필드의 매핑값을 설정해 놓으면, 삽입되는 데이터들은 필드의 타입에 맞게 색인 된다.

    • 만약 매핑값이 정의되지 않은 데이터가 들어오게 되면, 삽입되는 순간 매핑정보를 판단해서 등록한다.

  • 주의할 점은 필드의 타입은 수정이 불가하기 때문에, 수정을 하고싶다면 인덱스와 매핑정보를 다시 만들고 데이터를 처음부터 다시 넣어야 한다.


PUT famous-librarians
{
 "settings": {
   "number_of_shards": 2,
   "number_of_replicas": 0,
   "analysis": {
     "analyzer": {
       "my-desc-analyzer": {
         "type": "custom",
         "tokenizer": "uax_url_email",
         "filter": [
           "lowercase"
        ]
      }
    }
  }
},
 "mappings": {
   "librarian": {
     "properties": {
       "name": {
         "type": "text"
      },
       "favourite-colors": {
         "type": "keyword"
      },
       "birth-date": {
         "type": "date",
         "format": "year_month_day"
      },
       "hometown": {
         "type": "geo_point"
      },
       "description": {
         "type": "text",
         "analyzer": "my-desc-analyzer"
      }
    }
  }
}
}

예제 데이터 삽입 1

  • favaorite-colors는 keyword 타입으로 삽입되고,

  • hometown에는 object 타입으로 데이터를 삽입할 수 있는데, object 타입 중에 geo_point 타입은 latitude, longitude 쌍으로 데이터를 넣는다.

    • geo_point 타입의 경우 거리를 기준으로하는 쿼리가 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PUT famous-librarians/librarian/1
{
  "name": "Sarah Byrd Askew",
  "favourite-colors": [
    "Yellow",
    "light-grey"
  ],
  "bitrh-date": "1877-02-15",
  "hometown": {
    "lat": 32.349722,
    "lon": -87.641111
  },
  "description": "An American public librarian who pioneered the establishment of county libraries in the United States - https://en.wikipedia.org/wiki/Sarah_Byrd_Askew"
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PUT famous-librarians/librarian/2
{
  "name": "John J. Beckley",
  "favourite-colors": [
    "Red",
    "off-white"
  ],
  "bitrh-date": "1757-08-07",
  "hometown": {
    "lat": 51.507222,
    "lon": -0.1275
  },
  "description": "An American political campaign manager and the first Librarian of the United States Congress, - https://en.wikipedia.org/wiki/John_J._Beckley"
}
cs

query_string - keyword 필드 확인

  • keyword 타입으로 저장된 favourite-colors 필드는 분석과정(analyzer를 통해서)을 거치지 않기 때문에, 대문자 Yellow가 저장되어 있다.

  • 따라서, yellow OR off-white 쿼리에 검색되지 않는다.

  • keyword 타입은 aggregation을 위해 원본데이터가 저장이 되어야 한다. 하지만, 검색을 위해서는 데이터를 가공해서 저장해야 하는데, 그 과정을 거치지 않으므로 keyword 타입을 검색 할때 주의해야한다.


GET famous-librarians/_search
{
 "query": {
   "query_string": {
     "fields": [
       "favourite-colors"
    ],
     "query": "yellow OR off-white"
  }
}
}

range - 날짜 범위 검색

  • date 타입을 검색할 때에는 now 키워드를 사용할 수 있다.

    • h - 시간

    • d - 일

    • M - 달

    • y - 년

    • now-200y 의 경우 지금으로부터 200년 전이다.


GET famous-librarians/_search
{
 "query": {
   "bool": {
     "must": [
      {
         "match_all": {}
      }
    ],
     "filter": {
       "range": {
         "birth-date": {
           "gte": "now-200y",
           "lte": "2000-01-01"
        }
      }
    }
  }
}
}

geo_distance - 특정 지점에서 반경 100km 거리 검색

  • 특정 지점으로부터 반경 이내에 있는 특정 위치 검색하기 등 거리 탐색에 사용


GET famous-librarians/_search
{
 "query": {
   "bool": {
     "filter": {
       "geo_distance": {
         "distance": "100km",
         "hometown": {
           "lat": 32.41,
           "lon": -86.92
        }
      }
    }
  }
}
}





댓글