[Elasticsearch] 분석기 수정 및 인덱스 복사
·
Elasticsearch
상황메디지 서비스에서는 약 검색 기능을 제공하는데, 약 검색 요청어에 따른 결과가 아쉬운점이 몇몇 있었다.예를 들어 씬지록신정이라는 약을 검색하기 위해 씬지록신이라고 입력하였지만, 전혀 관련 없는 약들이 나오는 문제였다.약 검색 기능은 서비스의 핵심적인 요소 중 하나이기 때문에, 정확하고 유연한 결과를 주는 것은 필수적이다.따라서 해당 문제를 보완하기로 하였다.문제 분석약 검색 기능을 제공하기 위해 Elasticsearch 데이터베이스를 사용한다.약 데이터를 저장할 때 형태소 분석을 통해 약 이름을 토큰화하여 저장하고, 검색할 때에도 똑같이 검색어를 토큰화하여, 일치하는 토큰이 많은 데이터를 우선순위로 보여준다. 토큰화를 하는 기준은 분석기에 따라 다른데, 한글 분석기의 예시 중 하나인 nori 분석기는..
[Elasticsearch] 도큐먼트 저장 방식과 작동 원리 정리
·
Elasticsearch
1. 글을 쓰게 된 계기프로젝트에서 검색 기능을 구현하기 위해 Elasticsearch(이하 ES)를 도입하게 되었고, 데이터를 저장하고 검색하는 과정에서 ES가 내부적으로 어떻게 동작하는지 궁금해졌다.이후 관련 서적을 통해 ES의 인덱싱 구조와 검색 로직, 데이터 저장 방식 등을 공부하게 되었고, 이를 정리해 블로그에 기록으로 남기기로 했다.2. Elasticsearch 기본 개념 정리ES의 작동 원리를 이해하기 위해서는 먼저 몇 가지 기본 용어와 개념부터 정리할 필요가 있다.✅ DocumentElasticsearch에서 데이터를 저장하는 기본 단위다.관계형 데이터베이스(RDB)에서의 **레코드(Row)**에 해당한다.✅ Index도큐먼트(Document)들을 모아 놓은 논리적인 저장 단위다.RDB에서..
[Elasticsearch 보안 설정] 비밀번호 인증 활성화 및 Spring, Kibana 연동
·
Elasticsearch
상황현재 프로젝트에서 검색 및 분석 기능을 위해 Elasticsearch를 사용하고 있다.개발 초반에는 인증 없이 사용해왔지만, 데이터가 쌓이고 보안이 중요해짐에 따라Elasticsearch에 비밀번호 인증 기능을 설정하게 되었다.📦 환경 정보항목 버전Elasticsearch8.5.0Kibana8.5.0Spring Boot3.4.2Elasticsearch Clientspring-boot-starter-data-elasticsearch:3.4.2 (spring-data-elasticsearch:5.4.2)인프라 환경Docker + docker-compose🔸 Elasticsearch와 Kibana는 반드시 같은 버전을 사용하는 것이 좋다.🐳 Docker Compose 설정es: container_n..
[Elasticsearch] Docker 환경에서 스냅샷(Snapshot) 백업 및 자동화 설정
·
Elasticsearch
개발 중이던 Elasticsearch 서버에서 메모리 부족 현상으로 인해 인덱스들이 모두 날아간 일이 있었다.다행히 개발 환경이라 큰 문제가 되진 않았지만, 운영 환경이었다면 큰 사고로 이어졌을 수 있었다.이후 데이터를 다시 저장하면서, 스냅샷 백업 및 자동화 설정을 함께 진행했다.Docker 환경 기준으로 정리해본다.🔧 환경 개요환경: Docker + Elasticsearch 8.5운영 방식: docker-compose문제: 메모리 부족 → 인덱스 유실목표: 백업과 복원이 가능한 구조 확보📁 Docker 설정1. elasticsearch.yml 환경변수 설정environment: - node.name=single-node - cluster.name=medeasy-elastic-cluster -..
[ElasticSearch] 인기 검색어 쿼리 구현
·
Elasticsearch
목표(개요)시스템의 검색 엔진을 개발하면서, 최근 실시간 인기 검색어 기능을 추가할 필요가 생겼다.인기검색어란 단순히 많이 검색된 것을 넘어서, 얼마나 많이 최근에 검색되었는가?를 구현하는 것이 중요하다고 생각하였다.그에 따라 아래와 같은 쿼리 기준을 작성하였다.searchTime기준으로 도큐먼트 1000개 추출현재 밀리초와 searchTime 밀리초를 가지고 0~1 가중치(Decay) 추출같은 keyword를 가진 document끼리 가중치 더하기가중치를 기반으로 상위 10개의 keyword와 점수 반환전체 쿼리Kibana를 통한 Painless 스크립트로 작성하였으며, 아래는 전체 쿼리이다.GET search_history/_search{ "size": 0, "aggs": { "recent_..
[ElasticSearch] ElasticSearch Native Query 최신 버전 작성
·
Elasticsearch
엘라스틱 서치 쿼리 작성 문제스프링부트 최신버전과 함께 spring data elasticsearch 라이브러리도 최신 버전을 사용하고 있지만,최신버전에서 새롭게 사용되는 쿼리 문법에 대한 래퍼런스가 부족하여 구현하는데 어려움이 있었다.버전에 따른 문법 변화에 영향을 덜 받기 위해 @Query으로 메서드를 구현하는 방법을 생각하였으나,현재 시스템의 구현하려는 검색 엔진에 많은 조건문, 필터링이 추가됨에 따라 동적 쿼리 구현이 필요하다고 판단하였다.따라서 Native Query 최신 버전에 대해 공식 문서와 라이브러리를 뜯어보며 작성하게 되었다.버전 환경개발 환경으로는 SpringBoot 3.4.2버전과, 엘라스틱 서치와 연동을 위해 spring-boot-starter-data-elasticsearch 3..