본문 바로가기

분류 전체보기

(351)
[ELK] Elasticsearch 단어 사용 횟수 통계 (버킷 집계 - terms) 0. 들어가며 커뮤니티 프로젝트에서 사용된 단어를 형태소 분석기를 통해 토큰으로 분리한 단어의 사용 빈도 데이터를 추출해야한다. ES에서 _search API를 이용해서 단어의 통계를 구하려한다. 이때 필요한 지식이 버킷 집계이다. 1. 버킷 집계 매트릭 집계가 특정 필드를 기준으로 통계값을 계사하려는 목적이라면, 버킷 집계는 특정 기준에 맞춰서 조큐먼트를 그룹핑하는 역할을 한다. 버킷은 도큐먼트가 분할되는 단위로 나뉜 각 그룹을 의미한다. 위 사진처럼 도큐먼트들을 버킷 집계를 통하며 각각의 버킷 집합으로 만든다. 버킷 집계 종류 버킷 집계 설명 histogram 숫자 타입 필드를 일정 간격으로 분류한다. date_histogram 날짜/시간 타입 필드를 일정 날짜/시간 간격으로 분류한다. range 숫..
[ELK] Elasticsearch 한글 형태소 분석기 nori tokenizer 1. nori tokenizer의 필요성 ES의 기존의 형태소 분석기는 한글을 토큰으로 분리하는데 적합하지가 않다. 한글은 제대로 구현이 되어있지 않기 때문이다. 그래서 새롭게 나온 분석기가 한글 형태소 분석기 즉, nori tokenizer이다. 2. analysis-nori 플러그인 설치 ES 버전은 7.16.4를 사용하였고, 로컬 docker 환경에서 구축하였다. # elasticsearch/Dockerfile FROM elasticsearch:7.16.3 RUN bin/elasticsearch-plugin install --batch analysis-nori ES의 Dockerfile에 노리 플러그인을 RUN 명령어로 추가하면 ES 컨테이너가 생성되면서 노리 플러그인도 같이 설치가 된다. 3. S..
[ELK] Elasticsearch DSL 검색 쿼리 문법 1. 엘라스틱서치 검색 쿼리 종류 전문 쿼리 전문 검색에 사용 인덱스 매핑 시 텍스트 타입으로 매핑을 권장 match : 가장 기본이 되는 검색 match_phrase : 용어의 순서까지 완전 일치하는 검색 multi_match : 다중 필드에서 검색. 필드에 가중치 부여 가능 query string : 연산자를 중심으로 텍스트를 분할하여 검색 용어 수준 쿼리 대소문자까지 정확히 일치하는 용어(term) 검색에 사용 term terms fuzzy : 유사한 알파벳까지 검색 쿼리 (한국어 x) 범위 쿼리 날짜, 숫자 등 범위에 지정한 검색에 사용 range 논리 쿼리 (복합 쿼리 = bool) 쿼리들을 조합해 사용하는 쿼리 must : AND must_not : 거짓 should : OR filter : ..
[ELK] Elasticsearch DSL 기본 문법 0. DSL DSL이란 Domain Specific Language으로 JSON에 기반한 질의이다. ES에서의 DSL은 데이터베이스의 SQL문과 동일하다고 이해하면 된다. 즉, 사용자가 원하는 데이터를 추출하기 위한 질의 언어이다. URL 주소 뒤에 한 줄로 이어붙여서 쿼리문을 작성하는 쿼리 스트링보다 REST API 요청 본문 안에 JSON 형태로 쿼리를 작성하는 DSL이 가독성이 더 좋다. -> URL로 요청하는 쿼리문은 보통 간단하게 테스트용으로 자주 쓰인다. 좌측 메뉴 > Management > Dev Tools > Console에서 쿼리 DSL 실행 가능 1. 기본 쿼리 기본적으로 백엔드 API 개발할 때 사용하는 method와 유사하지만 기능은 조금 다르다. GET은 REST method 처럼..
[데이터베이스] RDB에 하지 말아야 할 것들 우연히 좋은 좋은 글을 발견해서 공유하고자 한다. 1. DB에 일 시키지 말자. DB랑 서버랑 요금을 비교해보면 서버가 훨씬 저렴할 것이다. 또한, 서버는 증설해도 DB 보다는 부담이 덜하다. 이 말은 즉, 서버가 연산을 해서 DB에 질의를 하는 것이 좋지, DB에 일 시켜서 버티지 못해 스펙을 높여야 하거나 클러스터링이나 샤딩 등으로 늘려야 하는 대가는 굉장히 비싸다. 2. RDB에 로그를 넣으면 안된다. 로그 전용 DB 라면 로그를 넣어도 된다. 하지만 로그는 계속해서 발생할 것이고, 유저가 몰리게 된다면 짧은 시간에 로그는 대량으로 발생할 것이다. 그렇게 발생한 대량의 로그 때문에 서버의 DB가 터질 수 있다. 아니 터진다. 3. 컬럼을 추가하기 전에 생각해야한다. 필요한게 생겨서 컬럼을 추가하는건..
프로젝트에서 엘라스틱서치에 적재된 로그 문제점 및 개선 사항 현재 문제점 게시글 생성 로그에서 발생 [ "{'Article_id': 'a4847333-c581-409c-b9a8-0ed7516b3c1e', 'Article': ArticleCreate(title='ㅇㅁㅇㅁ', content='ㅇㅁㅇ', summary='string', board_id=UUID('532aa49c-c677-4fe6-8a93-87ec01b23811'), board_path='mbti', tags=[], poll=PollCreate(title='string', is_multiple=False, contents=[])), 'User_id': None, 'Message': 'Article Create'}" ] 1. 'Article' key 부분의 value가 토크나이저로 분리하기 힘든 구조로 되..
[2018 KAKAO BLIND RECRUITMENT] [3차] 압축 https://school.programmers.co.kr/learn/courses/30/lessons/17684 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. 해결방법 생각보다 헤맸던 문제이다. 2시간 정도 걸렸다;; 처음 접근하는 방법이 중요하다. 다른 방법으로 시도한 끝에 결국 딕셔너리를 이용하는게 맞다고 판단이 되어서 딕셔너리를 사용하였다. 1. msg 문자열의 각 알파벳의 아스키코드 값을 dict라는 딕셔너리에 저장한다. 2. left와 right을 두어서 각 문자열이 dict에 있는지 없는지 판단해야한다. (w, c) 3. w와 c를 구해..
Elastic APM을 이용한 FastAPI 모니터링 연동 1. Docker docker-compose.yml과 Dockerfile 세팅은 Django 연동할 때와 동일하기에 참고 바람. 2. FastAPI (1) 라이브러리 설치 먼저 해당 패키지를 다운받아야 한다. pip install elastic-apm or poetry add elastic-apm (2) FastAPI 설정 from elasticapm.contrib.starlette import make_apm_client, ElasticAPM # Elastic APM # https://medium.com/squad-engineering/how-to-optimize-elastic-apm-6f7f6d58bed5 apm_config = { "SERVICE_NAME": "FastAPI", "SERVER_URL..