Search

ElasticSearch

1. Elastic Search

가. RDBMS vs Elastic Search

1) Indexing

키워드 중심의 ‘READ’ 관점에서 O(1) vs O(logn)
Elastic Search: ‘john’이라는 키워드는 text에 인덱싱되어 있고 해당 키워드를 포함한 document를 결과값으로 반환하므로 시간복잡도 O(1)
RDBMS: 인덱싱되어 있는 record인 doc1, doc2, doc3를 확인하고 그 안에 ‘john’이라는 텍스트의 존재여부를 확인하므로 시간복잡도 O(logn) or O(N)

2) Basic Terms

Elastic Search는 HTTP Method 기준으로 동작을 정의함
Index 내부에 복수의 Type이 존재하고 그 안에 Document로 구성됨
→ RDBMS의 Database - Table - Row - Column과 같이 구조적으로 계층적인 부분이 있음

나. CRUD

1) Common

응답값을 정돈된 형태로 확인: HTTP 요청 마지막에 ~?pretty 추가
ex) curl -XPUT http://localhost:9200/classes?pretty

2) Index

인덱스 생성: PUT 메소드 활용
ex) students 인덱스를 만들고 싶은 경우: curl -XPUT http://localhost:9200/students
인덱스 확인: GET 메소드 활용
인덱스 삭제: DELETE 메소드 활용

3) Document

인덱스 내 다큐먼트 생성: POST 메소드 활용
json 포맷 입력으로 직적 document 생성
ex) curl -XPOST http://localhost:9200/classes/1/ -d '{"title": "hello", "student": "mj"}'
json 포맷으로 데이터가 입력된 파일을 토대로 document 생성
ex) curl -XPOST http://localhost:9200/classes/1/ -d @oneclass.json
Bulk Insert: ~/_bulk --data-binary @<file name>
ex) curl -XPOST http://localhost:9200/_bulk --data-binary @oneclass.json
ex) curl -XPOST http://localhost:9200/_bulk?pretty --data-binary @oneclass.json

다. Type

1) Type Mapping

라. Search

간단한 검색을 제외하고는 request body 형태로 검색하는 것을 권장

1) search with request param

GET movie_search/_search?q=prdtYear:2018

2) search with request body

GET movie_search/_search { "query" : { "term" : { "prdtYear": "2018"} } }
JSON
복사

마. Aggregation

1) Metric

산술 결과

2) Bucket

일종의 Group By

2. Kibana

가. 기본 데이터 초기화

1) 인덱스 생성

2) 타입 맵핑

curl -XPUT 'http://localhost:9200/basketball/record/_mappin' -d @mapping.json -H "Content-Type: application/json"
mapping.json
0.4KB

3) 데이터 벌크 입력

curl -XPOST 'http://localhost:9200/_bulk' --data-binary @bulk.json -H "Content-Type: application/json"
bulk.json
3.4KB

나. Kibana Setting

1) Management Setting

Management란의 Index Patterns에서 ‘Create Index Pattern’ 작업
→ 기본 데이터 생성 시 인덱스로 설정한 ‘basketball’을 기준으로 pattern 생성
Index Pattern 생성 결과

2) Discover Setting

Setting

가. Elastic Search

1) 설치

이미지 다운로드 명령: docker pull <elasticsearch:tag>
ex) docker pull elasticsearch:7.17.5

2) 설정

Docker Network 설정 명령: docker network create <network name>
ex) docker network create elk_net
→ docker network 목록 확인: docker network ls
→ Docker Container 간 통신을 위해 Network 설정 필요
→ ElasticSearch   Kibana   Logstash
Docker 컨테이너 생성 및 실행
ex) docker run -d --name elasticsearch --net elk_net --publish 9200:9200 --publish 9300:9300 --env "discovery.type=single-node" elasticsearch:7.17.5
or docker run -d --name elasticsearch --net elk_net -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.17.5
ElasticSearch 설정 확인
ex) docker exec -i -t elasticsearch cat /usr/share/elasticsearch/config/elasticsearch.yml

나. Kibana

1) 설치

이미지 다운로드 명령
ex) docker pull kibana:7.17.5

2) 설정

Docker 컨테이너 생성 및 실행
ex) docker run -d --name kibana --net elk_net -p 5601:5601 kibana:7.17.5
→ ElasticSearch 컨테이너가 속한 도커 네트워크에 연결
Kibana Web Site 접속: http://127.0.0.1:5601/

다. Logstash

1) 설치

2) 설정

이슈 정리

1) Elastic Search  Kibana Version 불일치

현상: Elastic Search 7버전에서는 등록 토큰 생성 프로세스가 없어서 Kibana 8버전에서 요구하는 등록 토큰을 입력할 수 없음
해결 방법
1.
Elastic Search 버전을 8 이상으로 높여서 등록 토큰 생성 후 Kibana 8 버전에 등록
2.
Kibana 버전을 7로 낮춰서 등록 토큰 등록 프로세스 생략

Reference

권택한 외 5명 지음, 엘라스틱서치 실무가이드, 위키북스