반응형

1. ElasticSearch 버전 확인

 

==> localhost:9200

 

 

2. ElasticSearch와 동일 버전 Logstash 설치

 

==> Logstash 6.5.4 설치(ZIP)  

https://www.elastic.co/kr/downloads/past-releases/logstash-6-5-4

 

Logstash 6.5.4 | Elastic

View the detailed release notes here.

www.elastic.co

3. 압축 해제 후 logstash-6.5.4\config 경로로 이동

 

==> logstash-sample.conf 파일 메모장이나 vsCode로 열기

 

4. Oracle과 ElasticSearch 연동 설정

 

==> 싹 지우고 아래 코드 작성

 

input {
    jdbc {
        jdbc_driver_library => "C:\Users\ehong\Desktop\logstash-6.5.4\lib\ojdbc6.jar"
        jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
        jdbc_connection_string => "jdbc:oracle:thin:@localhost:1521/orcl"
        jdbc_user => "****"
        jdbc_password => "****"    
        statement => "SELECT * FROM EMP"
        jdbc_validate_connection => "true"
    }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "hong-0212"
    #user => "elastic"
    #password => "changeme"
  }
}

 

5. 터미널에서 logstash-6.5.4\bin 경로로 이동 후 명령어 실행

 

==> .\logstash -r -f "../config/logstash-sample.conf"

 

6. Kibana에서 결과 확인

 

'Elasticsearch' 카테고리의 다른 글

Elasticsearch 매핑, 필드 데이터 타입  (0) 2019.12.02
Elasticsearch 란?  (0) 2019.11.30
반응형

 

매핑

색인 시 데이터가 어디에 어떻게 저장될지를 결정하는 설정이다.

데이터베이스의 스키마에 대응하는 개념이라고도 할 수 있고 인덱스에 추가되는 각 데이터 타입을 구체적으로 정의하는 일이다.

엘라스틱서치는 기본적으로 스키마리스이기 때문에 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 필드 데이터 타입에 대한 매핑 정보가 자동으로 생성된다.

이러한 자동 매핑방식이 편리해 보이지만 실수로 잘못된 타입이 지정될 경우 수정할 방법이 없기 때문에 주의해야한다.

 

아래에서 매핑 인덱스 생성과 필드 데이터 타입을 함께 알아보겠습니다.

 

필드 데이터 타입

# keyword, text 같은 문자열 데이터 타입

# date, long, double, integer, boolean, ip 같은 일반적인 데이터 타입

# 객체 또는 중첩문과 같은 JSON 계층의 특성의 데이터 타입

# geo_point, geo_shape 같은 특수한 데이터 타입

 

# Keyword

키워드 형태로 사용할 데이터에 적합한 데이터 타입.

검색 시 필터링되는 항목 , 정렬이 필요한 항목, 집계 해야하는 항목 에 많이 사용된다.

별도의 분석기를 거치지 않고 원문 그대로 색인하기 때문에 특정 코드나 키워드 등 정형화된 컨텐츠에 주로 사용된다.

만약 elastic search 라는 문자열이 keyword 타입으로 설정되면 elastic이나 search라는 질의로는 절대 검색되지 않는다.

정확히 elastic search라고 질의해야함.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "multiMovieYn" : {
      "type" : "keyword"
    }
  }
}
cs

# Text

색인 시 지정된 분석기가 컬럼의 데이터를 문자열 데이터로 인식하고 이를 분석한다.

Text 타입으로 데이터를 색인하면 전체 텍스트가 토큰화되어 생성되며 특정 단어를 검색하는 것이 가능해진다.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "movieComment" : {
      "type" : "text"
    }
  }
}
cs

# Array

영화 데이터에 subtitleLang 필드가 있고 해당 필드에는 개봉 영화의 언어 코드 데이터가 들어있다고 가정해보자.

언어의 값으로 영어(en)와 한국어(ko)라는 두 개의 데이터를 입력하고 싶을 경우 Array 데이터 타입을 사용해야 한다.

문자열이나 숫자처럼 일반적인 값을 지정할 수도 있지만 객체 형태로도 정의할 수 있다.

Array 타입에 저장되는 값은 모두 같은 타입으로만 구성해야 한다.

 

1
2
3
4
5
PUT movie_search/_doc/1
{
 "title" : "해리포터와 마법사의 돌",
 "subtitleLang" : ["ko", "en"]
}
cs

# Numeric 

색인과 검색을 효율적으로 처리하기위한 데이터의 크기에 알맞은 다양한 타입이 제공된다.

long 최솟값과 최댓값을 가지는 부호 있는 64비트 정수. -2^63 ~ 2^63-1
integer 최솟값과 최댓값을 가지는 부호 있는 32비트 정수. -2^31 ~ 2^31-1
short 최솟값과 최댓값을 가지는 부호 있는 16비트 정수. -32768 ~ 32767
byte 최솟값과 최댓값을 가지는 부호 있는 8비트 정수. -128 ~ 127
double 64비트 부동 소수점을 갖는 수
float 32비트 부동 소수점을 갖는 수
half_float 16비트 부동 소수점을 갖는 수

 

 

# Date

Date 타입은 JSON 포맷에서 문자열로 처리된다.

날짜는 다양하게 표현될 수 있기 때문에 올바르게 구문 분석될 수 있게 날짜 문자열 형식을 명시적으로 설정해야한다.

별도의 형식을 지정하지 않을 경우 기본 형식인 “yyyy-MM-ddTHH:mm:ssZ”로 지정된다.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
 "properties" : {
   "date" : {
     "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss"
   }
 }
}
cs

# Range 

범위가 있는 데이터를 저장할 때 사용하는 데이터 타입이다.

데이터의 시작과 끝만 지정한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "showRange" : {
      "type" : "date_range"
    }
  }
}
 
PUT movie_search/_doc/2
{
  "showRange" : {
    "gte" : "2001-01-01",
    "lte" : "2001-12-31"
  }
}
cs

 

# Boolean

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "check" : {
      "type" : "boolean"
    }
  }
}
cs

 

# Geo-Point 

위도, 경도 등 위치 정보를 담은 데이터를 저장할 때 사용할 수 있는 타입이다.

위치기반 데이터를 색인하고 검색하는 데 매우 유용하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "filmLocation" : {
      "type" : "geo_point"
    }
  }
}
 
PUT movie_search/_doc/3
{
  "title" : "해리포터와 마법사의 돌",
  "filmLocation" : {
    "lat" : 55.415555,
    "lon" : -1.3333
  }
}
cs

# IP

IP 주소와 같은 데이터를 저장하는 데 사용한다. IPv4IPv6를 모두 지정 가능.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "ipAddr" : {
      "type" : "ip"
    }
  }
}
 
PUT movie_search/_doc/4
{
  "ipAddr" : "127.0.0.1"
}
cs

# Object

JSON 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있다.

문서의 필드는 단순히 값을 가질 수도 있지만 복잡한 형태의 또 다른 문서를 포함하는 것도 가능하다.

이처럼 값으로 문서를 가지는 필드의 데이터 타입을 Object 데이터 타입이라고 한다.

Object 데이터 타입을 정의할 때는 다른 데이터 타입과 같이 특정 키워드를 이용하지 않고 단지 필드값으로 다른 문서의 구조를 입력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "companies" : {
      "properties" : {
        "companyName" : {
          "type" : "text"
        }
      }
    }
  }
}
 
PUT movie_search/_doc/5
{
  "title" : "반지의 제왕",
  "companies" : {
    "companyName" : "워너브라더스"
  }
}
cs

# Nested

Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입이다.

필드에 객체가 배열 형태로 저장 가능하다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#인덱스 생성
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "companies_nested" : {
      "type" : "nested"
    }
  }
}
 
#데이터 색인
PUT movie_search/_doc/8
{
  "title" : "해리포터와 마법사의 돌",
  "companies_nested" : [
    {
      "companyCd" : "1",
      "companyName" : "워너브라더스"
    },{
      "companyCd" : "2",
      "companyName" : "Hello films"
    }
    ]
}
#검색
POST movie_search/_search
{
  "query": {
    "nested": {
      "path": "companies_nested",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "companies_nested.companyName": "워너브라더스"}
              },
              {
                "match" : {
                  "companies_nested.companyCd" : "1"
                }
              }
          ]
        }
      }
    }
  }
}
cs

참고서적 권택환 외 5명 「엘라스틱서치 실무 가이드」 위키북스(2019) p61~97

반응형

 

안녕들 하시죠!

이번시간에는 Elasticsearch에 대해 알아보겠습니다.

 

Elasticsearch

아파치 루씬을 기반으로 한 대표적인 검색엔진이다.

Java로 개발되었으며 역색인과 분산처리 등 기존 검색 기능의 한계를 극복하여 현재 다수의 기업에서 활용하려는 시도를 많이 하고있다.

 

검색 서비스 > 검색 시스템 > 검색 엔진

 

# 검색 엔진

광활한 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램이다. (Elasticsearch)

 

 

# 검색 시스템  

대용량 데이터를 기반으로 신뢰성 있는 검색 결과를 제공하기 위해 검색엔진을 기반으로 구축된 시스템을 통칭하는 용어이다.

수집기를 이용해 방대한 데이터를 수집하고 이를 다수의 검색엔진을 이용해 색인하고 검색 결과를 UI로 제공한다.

 

# 검색 서비스

검색엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공한다.

 

검색시스템의 구성요소

 

# 수집기

웹사이트, 블로그, 카페 등 웹에서 필요한 정보를 수집하는 프로그램이다.

 

# 스토리지

DB에서 데이터를 저장하는 물리적인 저장소.

검색엔진은 색인한 데이터를 스토리지에 보관한다.

 

# 색인기

검색엔진이 수집한 정보에서 사용자 질의와 일치하는 정보를 찾으려면 수집된 데이터를 검색 가능한 구조로 가공하고 저장해야한다. 그 역할을 하는 것이 색인기다.

색인기는 다양한 형태소 분석기를 조합해 정보에서 의미가 있는 용어를 추출하고 검색에 유리한 역색인 구조로 데이터를 저장한다.

 

# 검색기

검색기는 사용자 질의를 입력받아 색인기에서 저장한 역색인 구조에서 일치하는 문서를 찾아 결과로 반환한다.

질의와 문서가 일치하는지는 유사도 기반의 검색 순위 알고리즘으로 판단한다.

검색기 또한 색인기와 마찬가지로 형태소 분석기를 사용해 사용자 질의에서 유의미한 용어를 추출해 검색한다.

따라서 사용하는 형태소 분석기에 따라 품질이 달라진다.

 

 

 

 

엘라스틱서치와 관계형 데이터베이스 비교
엘라스틱서치 관계형 데이터베이스
index database
shard partition
type table
document row
field column
mapping schema
Query DSL SQL

 

추가, 검색, 삭제, 수정 기능 비교

엘라스틱서치에서 사용하는 HTTP 메서드

기능 데이터베이스 질의 문법
GET 데이터 조회 SELECT
PUT 데이터 생성 INSERT
POST 인덱스 업데이트, 데이터 조회 UPDATE, SELECT
DELETE 데이터 삭제 DELETE
HEAD 인덱스의 정보 확인 -
엘라스틱서치 장점

 

# 엘라스틱서치는 유연하다

역색인되는 문자열 전체를 정책에 따라 소문자 혹은 대문자로 생성하고 쿼리가 들어오는 필터를 색인 시간과 검색 시간에 동일하게 지정한다면 해당하는 쿼리에 어떠한 문자열이 들어와도 검색이 가능해진다.

 

# 구조화되지 않은 비정형 데이터도 검색이 가능하다.

 

# 오픈소스 검색엔진

루씬 기반으로 개발된 오픈소스 검색엔진, 버그의 빠른 수정.

 

# 전문 검색 (Full Text) 검색이 가능하다.

내용 전체를 색인해서 특정 단어가 포함된 문서를 검색한다.

 

# 통계 분석

비정형 로그 데이터를 수집하고 한곳에 모아 통계분석이 가능하고 키바나를 통해 신시간으로 쌓이는 로그를 시각화하고 분석할 수 있다.

 

# 스키마리스

정형화되지 않은 다양한 형태의 문서도 자동으로 색인하고 검색할 수 있다.

 

# RESTful API

HTTP 기반의 RESTful API를 지원하기 떄문에 요청뿐 아니라 응답에도 JSON 형식을 사용해 플랫폼에 종속되지 않고 사용이 가능하다.

  

# 멀티테넌시

서로 상이한 인덱스일지라도 검색할 필드명만 같으면 여러 개의 인덱스를 한번에 조회할 수 있다.

 

# Document-Oriented

여러 계층의 데이터를 JSON 형식의 구조화된 문서로 인덱스에 저장할 수 있다.

계층 구조로 문서도 한번의 쿼리로 쉽게 조회할 수 있다.

 

# 역색인

예를 들어 검색엔진이란 단어가 포함된 모든 문서를 찾아야 한다고 하자.

일반적으로는 처음부터 끝까지 모든 문서를 읽어야만 원하는 결과를 얻을 수 있다.

하지만 역색인 구조는 해당 단어만 찾으면 단어가 포함된 모든 문서의 위치를 알 수 있기 때문에 빠르게 찾을 수 있다.

 

# 확장성과 가용성

엘라스틱서치를 분산 구성해서 확장한다면 대량의 문서를 좀 더 효율적으로 처리할 수 있다.

분산환경에서 데이터는 샤드라는 작은 단위로 나뉘어 제공되며, 인덱스를 만들 때마다 샤드의 수를 조절할 수 있다.

이를 통해 데이터의 종류와 성격에 따라 데이터를 분산해서 빠르게 처리가 가능하다.

 

엘라스틱서치 단점

# 준 실시간

내부적으로 커밋과 플러시 같은 복잡한 과정 때문에 1초정도의 딜레이가 있다.

 

# 트랜잭션과 롤백 기능을 제공하지 않는다.

 

# 데이터의 업데이트를 제공하지 않는다.

데이터의 업데이트 명령이 요청될 경우 기존 문서를 삭제하고 변경된 내용으로 새로운 문서를 생성하는 방식을 이용한다.

비용이 많이 들지만 => 불변적이라는 이점을 취할 수 있다.

 

참고서적 권택환 외 5명 「엘라스틱서치 실무 가이드」 위키북스(2019) p1~10

 

오늘은 여기까지입니다 감사합니다.

+ Recent posts