일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- CTF-d
- diva
- XSS
- Docker
- elasticsearch
- beebox
- InsecureBank
- Suninatas
- NTFS
- base64
- ctf
- Strings
- Reflected XSS
- Openstack
- lord of sql injection
- otter
- vulnhub
- 인시큐어뱅크
- 파이썬
- 안드로이드
- Volatility
- frida
- igoat
- SQL Injection
- ESXi
- logstash
- 2018
- MFT
- kibana
- foremost
- Today
- Total
Information Security
검색 API 본문
간단한 검색을 시작해봅시다.
검색을 하기 위해서는 두 개의 기본 방법이 있습니다.
- 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
- bank 인덱스에서
- q=* 매개 변수는 Elasticsearch 가 인덱스의 모든 문서와 일치하도록 지시
- sort= account_number asc는 각 문서의 account_number 필드를 사용하여 결과를 오름차순으로 정렬
- 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 |