관리 메뉴

Information Security

검색 API 본문

ELK (ElasticSearch, Logstash, Kibana)

검색 API

HackingPractice 2021. 2. 17. 10:36

간단한 검색을 시작해봅시다.
검색을 하기 위해서는 두 개의 기본 방법이 있습니다.

  • REST request URI을 통해 검색 파라미터를 보내는 방법입니다.
  • REST request body를 통해서 검색어를 보내는 방법입니다.

request body  메소드는 많은 표현이 가능하게 하고, 읽기 쉬운 JSON 포맷상에서 검색어를 정의할 수 있습니다.
request URL 메소드의 예제를 하도록 할 건데, 하지만 튜토리얼의 나머지를 위해, 여기서는 request body 메서드를 사용하도록 하겠습니다.

검색을 위한 REST API는 _search 엔드 포인트로부터 접근 가능합니다.
이 예제는 bank 인덱스에서 모든 documents를 리턴합니다.

 

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

 

  1. bank 인덱스에서
  2. q=* 매개 변수는 Elasticsearch 가 인덱스의 모든 문서와 일치하도록 지시
  3. sort= account_number asc는 각 문서의 account_number 필드를 사용하여 결과를 오름차순으로 정렬
  4. pretty 매개 변수는 다시 Elasticsearch에게 예쁜 JSON 결과를 반환하도록 지시
  • took – Elasticsearch가 검색을 실행하는 데 걸린 시간(밀리초)
  • timed_out – 검색의 시간 초과 여부
  • _shards – 검색한 샤드 수 및 검색에 성공/실패한 샤드 수
  • hits – 검색 결과
  • hits.total - 검색 조건과 일치하는 문서의 총 개수
  • hits.hits - 검색 결과의 실제 배열(기본 설정은 처음 10개 문서)
  • hits.sort - 결과의 정렬 키(점수 기준 정렬일 경우 표시되지 않음)
  • hits._score 및 max_score - 지금은 이 필드를 무시하십시오.

요청 본문 메서드를 사용하여 위와 동일한 검색

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

URI에서는 q=*`를 전달했지만 여기서는 `_search API에 JSON 스타일의 쿼리 요청 본문을 POST 합니다.

 

Query DSL: 쿼리 언어

Elasticsearch는 JSON 스타일 도메인 특정 언어를 제공합니다.
이건 여러분이 query들을 실행하는 데 사용됩니다.

query 언어는 매우 포괄적(comprehensive)하고 한번 봤을 때 겁먹을 수 있지만,

 

이걸 실제 배우는 데 있어서 가장 좋은 방법은 몇 가지 기본 예제로 시작하는 것입니다.

 

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

query 부분은 우리 쿼리 정의가 무엇인지를 알려주고 match_all 파트는 간단히 동작하기 원하는 query 타입이다.
match_all 쿼리는 간단하게 명시된 인덱스상에 모든 document를 검색하는 것입니다.

추가적으로 query 파라미터는, 우리는 검색 결과에 영향을 주는 다른 파라미터도 전달할 수 있습니다.
위의 예제에서, 우리는 soert를 전달 해고, 여기서는 size를 전달합니다.

 

GET /bank/_search
{
  "query": { "match_all": {} },
  "size": 1
}

size가 명시되지 않았다면, 기본값은 10입니다.
이 예제는 match_all를 하고 11에서 20의 document를 리턴합니다.

 

GET /bank/_search
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}

from 매개변수(0 기반)는 어떤 문서 색인에서 시작할지, size 매개변수는 from 매개변수에서 시작하여 몇 개의 문서를 반환할지 지정합니다. 이 기능은 검색 결과의 페이징 구현에 유용합니다. from이 지정되지 않으면 기본값은 0입니다.

 

GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": { "balance": { "order": "desc" } }

match_all 하고 account balance로 내림차순 정렬하고 상위 10개의 document를 리턴합니다.

 

검색 실행하기

  • Query DSL에 대해 더 자세히 들어가 보자
  • 기본적으로 전체 JSON 문서가 모든 검색의 일부로 반환
  • 이를 소스 검색 조회의 _source 필드라고 부름
  • 전체 소스 문서가 반환되기를 원하지 않으면 반환할 소스 내의 일부 필드만 요청 가능
  • account_number와 balance (_source 내부의 두 필드를 검색에서 반환하는 방법

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

 

20이라는 번호가 매겨진 account_number를 반환

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

 

Address 가 mill과 일치하면 반환

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

 

Address 가 mill 또는 lane과 일치하면 반환
GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

 

Address에 mill lane”이라는 문구가 일치하면 반환
GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

두 개의 일치 쿼리를 작성하고 주소에 "mill" 및 "lane"을 포함하는 모든 계정을 반환

bool must  절은 match가 고려된 document들에 대해 true 여야 하는 모든 쿼리들을 명시합니다. 

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

 

should 절은 두 개의 match 쿼리를 구성하고 주소에 "mill"이나 "lane"이 포함된 모든 계정을 리턴합니다.

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

 

bool must_not 절은 매칭 되는 문서들에 대해서 참이어야 하는 것이 없는 쿼리들의 리스트를 명시합니다. 
bool 쿼리 안에 must, should, must_not 절을 상황에 맞게 조합할 수 있습니다.
복잡한 멀티 레벨의 boolean 로직을 흉내내기 위한(mimic) 이런 bool 절 쿼리 안에 bool 쿼리를 조합할 수 있습니다.

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

 

40살인 하지만 ID(aho)에 살고 있지 않은 사람들의 모든 계정을 리턴합니다. 

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

'ELK (ElasticSearch, Logstash, Kibana)' 카테고리의 다른 글

검색 API  (0) 2021.02.17
Search API Query  (0) 2021.02.17
Batch Processing  (0) 2021.02.17
ElasticSearch CRUD  (0) 2021.02.06
ELK 설치 과정  (0) 2021.02.03