Elasticsearch는 강력한 검색 및 데이터 분석 엔진으로, 대용량 데이터를 빠르게 처리하고 검색할 수 있으며, Kibana는 Elasticsearch 데이터를 시각화하고 탐색하기 위한 사용자 인터페이스를 제공한다.
Kibana는 Elasticsearch에서 검색한 데이터를 다양한 형태의 차트, 테이블, 지도 등으로 시각화할 수 있게 해줍니다. 이를 통해 사용자는 복잡한 데이터 세트를 쉽게 이해하고 분석할 수 있습니다.
Elasticsearch의 빠른 검색 기능과 Kibana의 동적 대시보드를 통해 실시간으로 데이터를 모니터링하고 분석할 수 있다. 이는 비즈니스 인텔리전스, 로그 분석, 성능 모니터링 등 다양한 분야에서 유용하게 활용될 수 있다.
Elasticsearch는 수 페타바이트의 데이터를 처리할 수 있으며, 이 데이터를 Kibana에서 쉽게 조작하고 시각화할 수 있다.
Kibana의 사용자 인터페이스는 비개발자도 쉽게 사용할 수 있도록 설계되어 있다. 데이터에 대한 복잡한 쿼리를 작성하지 않고도, 몇 번의 클릭으로 필요한 정보를 얻을 수 있다.
Kibana를 통해 Elasticsearch 데이터에 대한 접근을 제어할 수 있습니다. 사용자와 그룹 기반의 접근 제어를 설정하여 데이터의 보안을 유지할 수 있다.
Elasticsearch 클러스터는 수직 및 수평 확장이 가능하여, 데이터 양의 증가에 따라 리소스를 추가할 수 있다. Kibana는 이러한 클러스터에 연결하여 확장된 리소스를 효율적으로 사용할 수 있다.
로그 데이터를 중앙 집중화하고 이를 Elasticsearch에 저장, Kibana에서 분석 및 시각화함으로써 IT 운영, 보안 모니터링, 문제 해결 등을 효과적으로 수행할 수 있다.
이러한 여러가지 장점이 있지만, 나는 키바나에서 간단히 ES에 API요청을 보내기 위해 키바나를 설치하였다.
콘솔은 사용자가 Elasticsearch에 RESTful API 요청을 보내고 응답을 받을 수 있는 대화형 명령줄 인터페이스이다. 사용자는 여기서 JSON 형식의 직접적인 Elasticsearch 쿼리를 작성하고 실행할 수 있으며, 쿼리의 정확성을 즉시 확인할 수 있다. 자동 완성 기능이 포함되어 있어 사용자가 API 메소드, 인덱스 이름, 필드 이름 등을 쉽게 입력할 수 있다. 구문 강조 및 오류 검사를 제공하여 사용자가 쿼리를 더 쉽고 정확하게 작성할 수 있도록 도와준다.
Elasticsearch 쿼리의 성능을 분석할 수 있는 도구이다. 이를 사용하여 특정 쿼리가 얼마나 효율적인지, 어떤 부분이 병목 현상을 일으키는지 파악할 수 있다. 쿼리 실행 시간과 각 샤드에서의 처리 과정을 상세하게 보여주며, 성능 최적화를 위한 인사이트를 제공한다.
Elasticsearch에서 지원하는 그루비 스크립트를 작성하고 테스트할 수 있다. 이 스크립트는 쿼리 로직을 커스터마이징하거나 복잡한 계산을 실행하는 데 사용된다.
Elasticsearch 5.0 이후부터 주요 스크립팅 언어로 채택된 Painless를 사용하여 데이터 처리 스크립트를 작성할 수 있다. 이는 Java 기반의 안전하고 강력한 스크립트 언어로, 사용자가 데이터를 조작하거나 쿼리 결과를 동적으로 조정할 수 있게 한다.
사전 관리 도구를 만드는 동안 ES에 색인, 형태소 분석 등 요청 코드를 작성하기 전에 어떤 API로 요청을 보내야 어떻게 응답이 돌아오는지 알아보기 위해 Kibana Dev Tools를 사용하였다. 아래의 코드는 여러가지 방법으로 요청을 보내보고 응답을 확인했던 코드들이다.
// 새 인덱스 생성 및 설정 출력 (정렬된 JSON 형식)
PUT /contents?pretty
// 모든 인덱스의 목록과 상태 정보 조회
GET /_cat/indices?v
// 새 문서 색인 생성 ('contents' 인덱스 내에 ID가 1인 문서)
POST /contents/_doc/1?pretty
{
"title": "Hello ElasticSearch",
"author": "ES"
}
// 'contents' 인덱스의 매핑 정보 조회
GET /contents/_mappings?pretty
// 'books' 인덱스의 모든 문서 검색
GET /books/_search?q=*&pretty
// 'books' 인덱스 생성 및 설정
PUT /books?pretty
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": { "type": "text" },
"reviews": { "type": "integer" },
"rating": { "type": "float" },
"authors": { "type": "text" },
"topics": { "type": "keyword" },
"publisher": { "type": "text" },
"ISBN": { "type": "text" },
"release_date": { "type": "date", "format": "yyyy/MM/dd" },
"description": { "type": "text" }
}
}
}
// 새 문서 색인 생성 ('books' 인덱스 내에 ID가 1인 문서)
POST /books/_doc/1?pretty
{
"title": "Kubernetes: Up and Running",
"reviews": 10,
"rating": 5.0,
"authors": "Joe Beda, Brendan Burns, Kelsey Hightower",
"topics": "Kubernetes",
"publisher": "O'Reilly Media, Inc.",
"ISBN": "9781491935675",
"release_date": "2017/09/03",
"description": "What separates the traditional enterprise from the likes of Amazon, Netflix, and Etsy? Those companies have refined the art of cloud native development to maintain their competitive edge and stay well ahead of the competition. This practical guide shows Java/JVM developers how to build better software, faster, using Spring Boot, Spring Cloud, and Cloud Foundry."
}
// 'books' 인덱스의 모든 문서 검색
GET /books/_search?q=*&pretty
// 특정 인덱스의 문서에서 지정된 필드에 대한 term vectors 정보 조회
GET kflow-cmdt-20240408/_termvectors/KFLOW_5800003238855?fields=BOOK_NM
// 'nori_index' 인덱스 생성 및 Nori 한국어 분석기 설정
PUT /nori_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"nori": {
"type": "custom",
"tokenizer": "nori_tokenizer",
"filter": ["lowercase", "nori_readingform"]
}
}
}
}
}
}
// 'nori_index'에 문서 색인
POST /nori_index/_doc/1
{
"text": "한국어 형태소 분석을 Elasticsearch에서 수행합니다."
}
// 'nori_index'에서 형태소 분석 수행
POST /nori_index/_analyze
{
"analyzer": "nori",
"text": "형태소 분석기를 테스트합니다."
}
// 또 다른 문서를 'nori_index'에 색인
POST /nori_index/_doc/2
{
"text": "형태소"
}
// 'nori_index'에서 짧은 텍스트의 형태소 분석 수행
POST /nori_index/_analyze
{
"analyzer": "nori",
"text": "형태소"
}
// 다국어 지원 인덱스 생성 및 설정
PUT /multi_lang_index
{
"settings": {
"analysis": {
"analyzer": {
"eng_kor_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase"]
}
}
}
}
}
// 'multi_lang_index'에서 영어-한국어 혼용 텍스트의 형태소 분석
POST /multi_lang_index/_analyze
{
"analyzer": "eng_kor_analyzer",
"text": "applebanana"
}
// 테스트 인덱스 생성 및 설정
PUT /test_index
{
"settings": {
"analysis": {
"analyzer": {
"custom_standard_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase"]
}
}
}
}
}
// 'test_index'에서 텍스트 분석 수행
POST /test_index/_analyze
{
"analyzer": "custom_standard_analyzer",
"text": "apple Banana"
}
// 'nori_index' 인덱스 삭제
DELETE /nori_index
// 'nori_index' 인덱스 재생성 및 Nori 사용자 사전 설정
PUT /nori_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"nori": {
"type": "custom",
"tokenizer": "nori_user_tokenizer"
}
},
"tokenizer": {
"nori_user_tokenizer": {
"type": "nori_tokenizer",
"decompound_mode": "none",
"user_dictionary": "/usr/share/elasticsearch/config/userdict_ko.txt"
}
}
}
}
}
}
// 'nori_index'에서 형태소 분석 수행 및 분석 과정 설명
POST /nori_index/_analyze
{
"analyzer": "nori",
"text": "다이닝 테이블을 샀습니다.",
"explain": true
}
// 'nori_index'에서 "다이닝"에 대한 문서 검색
POST /nori_index/_search
{
"query": {
"match": {
"text": "다이닝"
}
}
}