검색 API

edit

먼저 몇 가지 간단한 검색을 해보겠습니다. 기본적인 검색 실행 방법으로 2가지가 있습니다. REST 요청 URI를 통해 검색 매개변수를 보내는것 그리고 REST 요청 본문을 통해 보내는 것입니다. 요청 본문 방식은 더 상세한 표현이 가능하고 또한 더 읽기 쉬운 JSON 형식으로 검색을 정의할 수도 있습니다. 여기서는 요청 URI 방식을 한 번 시도해보겠지만, 이 튜토리얼의 나머지 부분에서는 요청 본문 방식만 사용할 것입니다.

검색을 위한 REST API는 _search 엔드포인트에서 액세스할 수 있습니다. 이 예는 bank 색인의 모든 문서를 반환합니다.

GET /bank/_search?q=*&sort=account_number:asc&pretty

먼저 검색 호출을 자세히 살펴볼까요? bank 색인에서 검색하는 중인데(_search 엔드포인트), q=* 매개변수를 통해 Elasticsearch에게 색인의 모든 문서를 비교하여 일치 여부를 확인하라고 지시합니다. sort=account_number:asc 매개변수는 각 문서의 account_number 필드를 기준으로 삼아 오름차순으로 결과를 정렬하도록 지시합니다. pretty 매개변수는 역시 Elasticsearch에게 JSON 결과를 pretty-print하여 반환하도록 지시합니다.

다음은 응답의 일부입니다.

{
  "took" : 63,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : null,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "0",
      "sort": [0],
      "_score" : null,
      "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"bradshawmckenzie@euron.com","city":"Hobucken","state":"CO"}
    }, {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "1",
      "sort": [1],
      "_score" : null,
      "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
    }, ...
    ]
  }
}

이 응답에서는 다음 부분이 눈에 띕니다.

  • took – Elasticsearch가 검색을 실행하는 데 걸린 시간(밀리초)
  • timed_out – 검색의 시간 초과 여부
  • _shards – 검색한 샤드 수 및 검색에 성공/실패한 샤드 수
  • hits – 검색 결과
  • hits.total – 검색 조건과 일치하는 문서의 총 개수
  • hits.hits – 검색 결과의 실제 배열(기본 설정은 처음 10개 문서)
  • hits.sort - 결과의 정렬 키(점수 기준 정렬일 경우 표시되지 않음)
  • hits._scoremax_score - 지금은 이 필드를 무시하십시오.

위 검색에 요청 본문 방식을 사용할 경우 결과는 다음과 같습니다.

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

URI에서는 q=*`를 전달했지만 여기서는 `_search API에 JSON 스타일의 쿼리 요청 본문을 POST합니다. 다음 섹션에서 이 JSON 쿼리에 대해 살펴볼 것입니다.

검색 결과를 얻으면 Elasticsearch는 해당 요청을 처리 완료한 것이므로 어떤 서버측 리소스도 유지하지 않고 결과에 커서를 열지도 않습니다. 이는 초기에 쿼리 결과의 일부를 얻은 다음 일종의 상태 유지 서버측 커서를 사용하여 나머지 결과를 가져오려면 (또는 페이지로 표시하려면) 반복해서 서버로 돌아가야 하는 SQL과 같은 다른 여러 플랫폼과 크게 다른 점입니다.