-
ES - 기본 API🔍 elastic search 2022. 9. 21. 19:42
Index, Type, Document에 대한 CRUD API
- Index - RDBMS의 database 같은 개념
- Type - RDBMS의 table 개념
- Document - RDMBS의 ROW 같은 개념
입력 (PUT)
- 데이터 입력시 PUT 메서드를 이용
조회 (GET)
- GET 메서드로 가져올 도큐먼트의 URL을 입력시 도큐먼트의 내용을 가져온다.
삭제 (DELETE)
- DELETE 메서드를 이용해서 도큐먼트 또는 인덱스 단위의 삭제가 가능
수정 (POST)
- POST 메서드는 PUT 메서드와 유사하게 데이터 입력에 사용 가능
- 도큐먼트 id 의 자동 생성은 PUT 메서드로는 동작하지 않는다.
ES API 구조
💡 http://<호스트>:<포트>/<인덱스>/_doc/<도큐먼트 id>
인덱스
클러스터에 존재하는 모든 index 조회
curl -XGET 'localhost:9200/_cat/indices?v'
인덱스 만들기
- user라는 인덱스 만들기
curl -XPUT 'localhost:9200/user?pretty'
- 다시 조회
⇒ user 인덱스 조회됨.
인덱스의 health
총 3가지의 상태
상태 설명 green 모든 샤드가 정상적인 상태 yellow 일부 혹은 모든 샤드의 래플리카 샤드가 정상적으로 동작하지 않고 있는 상태 red 일부 혹은 모든 샤드의 primary & replica 샤드가 모두 정상적으로 동작하지 않고 있는 상태 green / yellow는 쓰기, 읽기에는 문제가 없는 상태이다.
- 현재는 노드가 하나 뿐이라 replica 샤드의 상태가 UNASSIGNED 되었기 때문
- primary, replica 샤드는 하나의 노드에 있을 수 없음.
Document
인덱스에 document 추가하기
POST를 사용
curl -XPOST '[IP]:[PORT]/[index명]/_doc/[아이디]' -H 'Content-type:application/json' -d '[데이터]'
아이디를 적지 않으면 ES에서 임의적으로 아이디가 들어가게 된다.
아이디를 적어주면 해당 아이디로 Document 생성
Document 조회
모든 document 조회하기
curl -XGET '[IP]:[PORT]/[index명]/_search?pretty
특정 document 조회하기
curl -XGET '[IP]:[PORT]/[index명]/_doc/[아이디]?pretty
Document 수정
수정은 생성과 동일
- 변경될 내용을 명시해 주면 된다.
- 버전이 더 높아진다.
벌크 API - _bulk API
여러 명령을 배치로 수행하기 위해서 _bulk API 사용 가능
- index
- create
- update
- delete
동작이 가능하다.
delete를 제외하고는 명령문과 데이터문을 한 줄씩 순서대로 입력해야 한다.
POST _bulk {"index":{"_index":"test", "_id":"1"}} {"field":"value one"} {"index":{"_index":"test", "_id":"2"}} {"field":"value two"} {"delete":{"_index":"test", "_id":"2"}} {"create":{"_index":"test", "_id":"3"}} {"field":"value three"} {"update":{"_index":"test", "_id":"1"}} {"doc":{"field":"value two"}}
파일에 저장 내용을 저장후 실행
벌크 명령을 파일로 저장하고 curl 명령으로 실행 가능
저장한 명령 파일을 —data-binary 로 지정하면 저장된 파일로 부터 입력할 명령과 데이터를 읽어올 수 있다.
- 아래 예제에서는 명령을 bulk.json이라는 이름의 파일로 저장함.
$ curl -XPOST "<http://localhost:9200/_bulk>" -H 'Content-Type: application/json' --data-binary @bulk.json
- 파일 이름 앞에는 @ 문자를 입력해야 한다.
❗ 벌크 동작은 따로따로 수행하는 것보다 속도가 훨씬 빠르다.
특히 대량의 데이터를 입력할 때 반드시 _bulk API를 사용해야 불필요한 오버헤드가 없다.
Logstah 와 Beats 그리고 Elastic 웹페이지에서 제공하는 대부분의 언어별 클라이언트에서는 데이터 입력시 _bulk를 사용하도록 개발되어 있다.
검색 API - _search API
검색은 인덱스 단위로 이루어진다.
GET <인덱스명> /_search
형식으로 사용하며 쿼리를 입력하지 않으면 전체 도큐먼트를 찾는 match_all 검색을 한다.
URI 검색
_search 뒤에 q 파라미터를 사용해 검색어를 입력할 수 있다.
- 이렇게 요청 주소에 검색어를 넣어 검색하는 방식 = URI 검색
GET test/_search?q=value // - test 인덱스에서 "value"라는 값을 검색하기 위함.
// 결과 { "took" : 3, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 0.105360515, "hits" : [ { "_index" : "test", "_type" : "_doc", "_id" : "3", "_score" : 0.105360515, "_source" : { "field" : "value three" } }, { "_index" : "test", "_type" : "_doc", "_id" : "1", "_score" : 0.105360515, "_source" : { "field" : "value two" } } ] } }
- hits.total.value
- 검색 결과 전체에 해당되는 문서의 개수
- hits:[] 구문 안에 배열로 가장 정확도가 높은 문서 10개가 나타남.
AND 조건 사용
// 검색어 "value AND three" 검색 GET test/_search?q=value AND three
검색어를 field 필드에서 찾고 싶을 때
- <필드명> : <검색어> 형태로 입력
// "field" 필드에서 검색어 "value" 검색 GET test/_search?q=field:value
데이터 본문 검색 (Data body)
데이터 본문(data body) 검색은 검색 쿼리를 데이터 본문으로 입력하는 방식
- ES의 QueryDSL을 사용
- 쿼리 또한 JSON 형식
가장 많이 사용되는 것 - match 쿼리
// 데이터 본문 검색으로 "field" 필드에서 검색어 "value" 검색 GET test/_search { "query": { "match": { "field": "value" } } }
- 쿼리 입력은 항상 query 지정자로 시작한다.
- 그 다음 레벨에서 쿼리의 종류를 지정
- 그 후는 사용할 쿼리 별로 문법이 상이하다.
멀티 테넌시 (Multitenancy)
Elasticsearch는 여러 개의 인덱스를 한꺼번에 묶어서 검색할 수 있는 멀티테넌시를 지원
ex) logs-2022-09, logs-2022-10 … 와 같이 날짜별로 저장된 인덱스들이 있다면 이 인덱스들을 모두 logs-*/_search 명령으로 한꺼번에 검색이 가능
특히 시간순으로 따라 쌓이는 로그 데이터를 다룰 때는 인덱스를 일단위 등으로 구분하는 것이 좋다.
필드 구조가 변경되거나 크기가 커져서 샤드 설정을 변경하거나 할 때 용이
여러 인덱스를 검색할 땐 쉼표 , 로 나열하거나 와일드카드 * 문자로 묶을 수 있다.
참고 자료
https://esbook.kimjmin.net/04-data/4.3-_bulk
https://esbook.kimjmin.net/04-data/4.4-_search
https://velog.io/@soyeon207/ES-3.-인덱스-설정과-document-CRUD-API
'🔍 elastic search' 카테고리의 다른 글
ES - Aggregations (0) 2022.09.22 ES - 텍스트 분석 (0) 2022.09.22 ES - 데이터 검색 (1) 2022.09.21 Docker로 ES 설치하기 (1) 2022.09.21 ElasticSearch (0) 2022.09.20