'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

Storage/ELK

ELK) Elasticsearch Hello World

MightyTedKim 2022. 7. 9. 08:41
728x90
반응형

https://velog.io/@deet1107/ElasticSearch-Hello-World

 

2년 전에 elasticsearch 공부했던 것 아카이브

 

ElasticSearch 기본 개념 정리

ELK 는 흔히들 말하는 elasticsearch, logstash, kibana에요
최근에는 filebeat가 추가되면서 elk stack으로 불리기도 해요

여기서는 elk 중에서 elasticsearch를 중점적으로 보려고 해요

참고 자료

들어가기 전에

분석기로 쪼개서 검색, Analyzer 가 중요

  • DB 아님
    • 검색에 특화
    • 오픈소스
  • Term 단위로 쪼개고, 검색한다.
    • like 검색과 다르다
    • analyzer 가 중요
  • Index
    • RDB의 테이블 개념
    • analyzer 등 설정
  • 루씬
    • 루씬을 동시에 돌리기 때문에 성능이 높아짐
    • Elastic : Lucene : Segment(데이터) = 1: N : N

설치

Window가 편함, docker/linux 모두 가능

6.x 에서는 설정안하고, network.host만 풀어주면 가능했던거같은데, 7.7로 테스트하고 있는 지금은 node-name도 주석 풀어줘야하는 것 같음
node.name: node-1
network.host: "0.0.0.0"
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
cluster.initial_master_nodes: ["node-1"]

  • Kibana
    - https://www.elastic.co/guide/en/kibana/7.6/install.html
    - config 폴더에서 elasticsearch url 주석을 풀어줌
  • server.port: 5601
    server.host: "0.0.0.0"
    $ elasticsearch.hosts: ["http://192.168.4.103:9200"]
    $ 다른 PC에서 접근할라면 ip 명시해줘야함
    elasticsearch.hosts: ["localhost:9200"]
  • pom.xml
  • <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.6</version> </dependency>

실습

  • index
    • analyzer
  • search
    • text / keyword
  • Rest API
    • Java-High level Rest Client
    • json 과 동일

예시

  • 참고 서적 : 엘라스틱서치 실무 가이드 한글 검색 시스템 구축부터 대용량 클러스터 운영까지어짜피 따라하지 않을거고, 공식 doc에 좋은 예시들이 너무 많아서
    간단한 눈팅용으로 정리 ㅋㅋ

CRUD

  • 방식이 다양함. 아래는 가장 기본적인 예시
DELETE movie

PUT /movie
{
  "settings":{
    "number_of_shards":3,
    "number_of_replicas":2
  },
  "mappings":{
    "properties":{
       "movieCd": {"type":"keyword"},
       "movieCom": {"type":"keyword"},
       "movieNm": {"type":"text"},
       "movieDesc": {"type":"text"},
       "openDt":{"type":"date"},
       "movieScore":{"type":"integer"}
    }
  }
}

POST /movie/_doc/1
{
  "movieCd": "0001", 
  "movieCom":"Marvel",
  "movieNm":"아이언맨1",
  "movieDesc":"내가 제일 좋아하는 영화",
  "openDt":"2008-04-30",
  "movieScore":"9.0"
}

POST /movie/_doc/2
{
  "movieCd": "0002", 
  "movieCom":"Marvel", 
  "movieNm":"아이언맨2",  
  "movieDesc":"내가 제일 좋아하는 두번째 영화",
  "openDt":"2010-04-29",
  "movieScore":"7.0"
}

POST /movie/_doc/3
{
  "movieCd": "0004",  
  "movieCom":"DC", 
  "movieNm":"원더우먼",  
  "movieDesc":"내가 좋아하는 DC영화",
  "openDt":"2017-04-25",
  "movieScore":"8.0"
}

검색

GET /movie/_doc/1

GET movie/_search?q=movieCd:0001

GET /movie/_search
{
  "query": { "match": { "movieCd": "0001" } }
}

GET /movie/_search
{
  "query":{ "match":{"movieDesc":"영화 두번째"} }
}

GET movie/_search
{
  "query": {
    "range": {
      "openDt": {
          "gte": "2017-04-24",
          "lte": "2017-04-26"
      }
    }
  }
}

GET movie/_search
{
  "query": {
    "range": {
      "openDt": {
          "gte": "2010",
          "lte": "2017-04-26"
      }
    }
  }
}

GET movie/_search
{
  "aggs": {
    "movieCom": {
      "terms": {
        "field": "movieScore" 
      }
    }
  }
}

GET movie/_search
{
  "query": {
    "match": {
      "movieCom": "Marvel" 
    }
  },
  "sort": {
    "openDt": "asc" 
  },
  "aggs": {
    "movieCom": {
      "terms": {
        "field": "movieScore" 
      }
    }
  }
}

분석기

POST _analyze
{
  "analyzer": "standard",
  "text":"캐리비안의 해적"
}

POST movie_analyzer/_analyze
{
  "analyzer": "whitespace",
  "text":"Chamber of Secrets"
}

GET _analyze
{
  "tokenizer": "standard",
  "filter": [ "ngram" ],
  "text": "아이언맨"
}
  • index에 분석기 넣기(Ngram)
PUT ngram_example
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_ngram": {
          "tokenizer": "standard",
          "filter": [ "ngram" ]
        }
      }
    }
  }
}

POST ngram_example/_analyze
{
  "text":"아이언맨",
  "analyzer": "standard_ngram"
}

PUT ngram_custom_example
{
  "settings": {
    "index": {
      "max_ngram_diff": 2
    },
    "analysis": {
      "analyzer": {
        "default": {
          "tokenizer": "whitespace",
          "filter": [ "3_5_grams" ]
        }
      },
      "filter": {
        "3_5_grams": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 5
        }
      }
    }
  }
}

POST ngram_custom_example/_analyze
{
  "text":"아이언맨짱"
}

PUT /ngramtest
{
  "settings": {
    "index":{
      "number_of_shards" : 3,
      "number_of_replicas": 1,
      "max_ngram_diff": 49
    },
    "analysis": {
        "analyzer": {
          "ngram_analyzer":{
            "type":"custom",
            "tokenizer":"ngram_tokenizer",
            "filter":["lowercase","trim"]
          }
      },
      "tokenizer":{
        "ngram_tokenizer":{
          "type":"ngram",
          "min_gram":"1",
          "max_gram":"50",
          "token_chars":[
            "letter",
            "digit",
            "punctuation",
            "symbol"
            ]
        }
      }
    }
  }
}

PUT ngramtest/_mapping
{
 "properties": {
    "col1": {
      "type": "text"
    },
    "col2": {
      "type": "text",
      "analyzer":"standard",
      "search_analyzer":"ngram_analyzer"
    },
    "col3": {
      "type": "text",
      "analyzer":"ngram_analyzer",
      "search_analyzer":"standard"
    }
  }
}

POST ngramtest/_analyze
{
  "text":"내가 제일 좋아하는 영화",
  "analyzer": "standard"
}

POST ngramtest/_analyze
{
  "text":"내가 제일 좋아하는 영화",
  "analyzer": "ngram_analyzer"
}

POST /ngramtest/_doc/1
{
  "col1":"내가 제일 좋아하는 영화",
  "col2":"내가 제일 좋아하는 영화",
  "col3":"내가 제일 좋아하는 영화"
}

GET /ngramtest/_search
{
  "query":{ "match":{"col1":"하는"} }
}

GET /ngramtest/_search
{
  "query":{ "match":{"col2":"하는"} }
}

GET /ngramtest/_search
{
  "query":{ "match":{"col3":"하는"} }
}
728x90
반응형