Elasticsearch는 Apache Lucene 기반의 검색 엔진으로, JSON 문서를 인덱싱하고 검색하는 기능을 제공합니다.
Elasticsearch는 RESTful API를 통해 상호작용하며, 실시간으로 대량의 데이터를 검색할 수 있는 뛰어난 성능을 자랑합니다.
[Elasticsearch의 주요 특징]
- 확장성: 클러스터링을 통해 데이터와 작업을 분산시켜 대규모 데이터 처리를 지원합니다.
- 실시간 검색: 거의 실시간으로 데이터를 인덱싱하고 검색할 수 있습니다.
- 분석 기능: 데이터를 빠르게 분석하고 통계 정보를 추출할 수 있습니다.
- 다양한 데이터 형식 지원: JSON 형식의 문서를 기본으로 다양한 데이터 타입을 지원합니다.
[Elasticsearch 사용 이유]
- 고성능 검색: 대용량 데이터를 빠르게 검색할 수 있어, 검색 응답 시간을 최소화합니다.
- 유연한 스키마: 스키마리스(Schema-less) 구조를 지원하여 유연하게 데이터를 저장하고 검색할 수 있습니다.
- 강력한 분석 도구: Kibana와 같은 시각화 도구와 쉽게 통합하여 데이터를 분석하고 시각화할 수 있습니다.
1. Elasticsearch 설치 및 기본 설정
[Elasticsearch 설치]
Elasticsearch는 Elasticsearch 공식 사이트에서 설치 파일 다운로드 가능.
또한, Docker를 사용하여 Elasticsearch를 설치하고 실행 가능.
// Docker를 사용하여 Elasticsearch 이미지를 다운로드하고 단일 노드로 Elasticsearch 컨테이너를 실행
docker pull elasticsearch:8.4.3
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.4.3
Elasticsearch 기본 설정
Elasticsearch가 설치되면, 브라우저에서 http://localhost:9200에 접속하여 Elasticsearch 서버가 정상적으로 실행되고 있는지 확인할 수 있습니다. 기본 설정이 완료되면, Node.js 애플리케이션에서 Elasticsearch를 사용할 준비가 완료됩니다.
2. Node.js 프로젝트에 Elasticsearch 통합하기
프로젝트 초기화 및 Elasticsearch 클라이언트 설치
@elastic/elasticsearch : Node.js에서 Elasticsearch와 상호작용하기 위한 공식 클라이언트 라이브러리
mkdir elasticsearch-nodejs
cd elasticsearch-nodejs
npm init -y
npm install @elastic/elasticsearch
Elasticsearch 클라이언트를 설정하고, Elasticsearch 서버에 연결하여 서버 정보를 출력
// client.js
import { Client } from '@elastic/elasticsearch';
const client = new Client({ node: '<http://localhost:9200>' });
const run = async () => {
try {
const info = await client.info();
console.log(info);
} catch (error) {
console.error('Elasticsearch 연결 실패:', error);
}
};
run();
3. Elasticsearch에 데이터 인덱싱하기
Elasticsearch에 데이터를 저장하려면 먼저 인덱스를 생성하고, 데이터를 인덱싱 해야 함.
my-index라는 인덱스를 생성하고, 샘플 데이터를 인덱싱하는 작업.
indexData 함수는 Elasticsearch에 데이터를 인덱싱하여 검색할 수 있도록 준비하고, 각각의 문서는 index 메서드를 사용하여 Elasticsearch에 저장
// indexData.js
import { Client } from '@elastic/elasticsearch';
const client = new Client({ node: '<http://localhost:9200>' });
const createIndex = async () => {
try {
await client.indices.create({
index: 'my-index',
body: {
mappings: {
properties: {
title: { type: 'text' },
description: { type: 'text' },
date: { type: 'date' },
},
},
},
});
console.log('인덱스가 성공적으로 생성되었습니다.');
} catch (error) {
console.error('인덱스 생성 실패:', error);
}
};
const indexData = async () => {
try {
const documents = [
{ title: 'Node.js 시작하기', description: 'Node.js에 대한 기본 개념을 다룹니다.', date: '2024-01-01' },
{ title: 'Elasticsearch 소개', description: 'Elasticsearch와 그 주요 기능을 설명합니다.', date: '2024-01-02' },
];
for (const document of documents) {
await client.index({
index: 'my-index',
body: document,
});
}
console.log('데이터가 성공적으로 인덱싱되었습니다.');
} catch (error) {
console.error('데이터 인덱싱 실패:', error);
}
};
const run = async () => {
await createIndex();
await indexData();
};
run();
4. Elasticsearch에서 데이터 검색하기
my-index 인덱스에서 "Node.js"라는 단어가 포함된 문서를 검색
// searchData.js
import { Client } from '@elastic/elasticsearch';
const client = new Client({ node: '<http://localhost:9200>' });
const search = async () => {
try {
const result = await client.search({
index: 'my-index',
body: {
query: {
match: { title: 'Node.js' },
},
},
});
console.log('검색 결과:', result.hits.hits);
} catch (error) {
console.error('검색 실패:', error);
}
};
search();
여러 필드를 검색하거나, 범위 쿼리를 사용하여 특정 날짜 범위의 문서 검색 가능
// searchData.js (continued)
const advancedSearch = async () => {
try {
const result = await client.search({
index: 'my-index',
body: {
query: {
bool: {
must: [
{ match: { title: 'Elasticsearch' } },
{ range: { date: { gte: '2024-01-01', lte: '2024-12-31' } } },
],
},
},
},
});
console.log('고급 검색 결과:', result.hits.hits);
} catch (error) {
console.error('고급 검색 실패:', error);
}
};
advancedSearch();
이번 포스팅에서는 Node.js와 Elasticsearch를 사용하여 강력한 검색 기능을 구현하는 방법을 살펴보았습니다. Elasticsearch는 실시간 검색과 분석을 위한 뛰어난 성능을 제공하며, Node.js 애플리케이션에 쉽게 통합할 수 있습니다
'개발정리 (nodeJS)' 카테고리의 다른 글
[nodeJS] Node.js에서 GraphQL 서브스크립션 구현하기 (3) | 2024.09.23 |
---|---|
[nodeJS] Node.js로 GraphQL API 구현하기 (2) | 2024.09.18 |
[nodeJS] Node.js로 PDF 생성 및 처리하기 (1) | 2024.09.09 |
[nodeJS] Node.js에서 시계열 데이터베이스 적용하기 (0) | 2024.09.03 |
[nodeJS] Node.js와 gRPC를 사용한 고성능 서비스 구축하기 (0) | 2024.08.26 |