본문 바로가기
개발정리 (nodeJS)

[nodeJS] Node.js와 Elasticsearch를 사용한 검색 기능 구현하기

by 할리갈리0 2024. 9. 13.

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 애플리케이션에 쉽게 통합할 수 있습니다

반응형