Elasticsearch를 직접 체험하려면 당사의 샘플 노트북을 살펴보거나, 무료 클라우드 체험판을 시작하거나, 지금 바로 로컬 기기에서 Elastic을 사용해 보세요.
이 글은 JavaScript와 함께 Elasticsearch를 사용하는 방법을 다루는 시리즈의 첫 번째 글입니다. 이 시리즈에서는 JavaScript 환경에서 Elasticsearch를 사용하는 방법에 대한 기본 사항을 알아보고 검색 앱을 만드는 데 가장 적합한 기능과 모범 사례를 검토합니다. 끝으로 JavaScript를 사용하여 Elasticsearch를 실행하는 데 필요한 모든 것을 알게 될 것입니다.
이 첫 번째 파트에서는 검토할 내용을 살펴봅니다:
여기에서 예제와 함께 소스 코드를 확인할 수 있습니다.
Elasticsearch Node.js 클라이언트란 무엇인가요?
Elasticsearch Node.js 클라이언트는 Elasticsearch API의 HTTP REST 호출을 JavaScript로 변환하는 JavaScript 라이브러리입니다. 이렇게 하면 문서를 일괄 색인하는 것과 같은 작업을 간소화하는 도우미를 더 쉽게 처리하고 사용할 수 있습니다.
환경
프론트엔드, 백엔드 또는 서버리스?
JavaScript 클라이언트를 사용하여 검색 앱을 생성하려면 최소한 두 가지 구성 요소, 즉 Elasticsearch 클러스터와 클라이언트를 실행하기 위한 JavaScript 런타임이 필요합니다.
JavaScript 클라이언트는 모든 Elasticsearch 솔루션(클라우드, 온프레미스, 서버리스)을 지원하며, 클라이언트가 내부적으로 모든 변형을 처리하므로 어떤 것을 사용할지 고민할 필요가 없습니다.
하지만 자바스크립트 런타임은 브라우저에서 직접 실행하는 것이 아니라 서버에서 실행해야 합니다.

이는 브라우저에서 Elasticsearch를 호출할 때 사용자가 클러스터 API 키, 호스트 또는 쿼리 자체와 같은 민감한 정보를 얻을 수 있기 때문입니다. Elasticsearch는 클러스터를 인터넷에 직접 노출하지 않고 사용자가 매개변수만 볼 수 있도록 이 모든 정보를 추상화하는 중간 계층을 사용할 것을 권장합니다. 이 주제에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
다음과 같은 스키마를 사용하는 것이 좋습니다:

이 경우 클라이언트는 서버에 대한 검색어와 인증 키만 전송하고 서버는 쿼리 및 Elasticsearch와의 통신을 완전히 제어합니다.
클라이언트 연결하기
다음 단계에 따라 API 키를 생성하여 시작하세요.
이전 예제에 따라 간단한 Express 서버를 생성하고 Node.JS 서버의 클라이언트를 사용하여 서버에 연결하겠습니다.
NPM으로 프로젝트를 초기화하고 Elasticsearch 클라이언트와 Express를 설치하겠습니다. 후자는 Node.js에서 서버를 불러오는 라이브러리입니다. Express를 사용하면 HTTP를 통해 백엔드와 상호 작용할 수 있습니다.
프로젝트를 초기화해 보겠습니다:
npm init -y
종속성을 설치합니다:
npm install @elastic/elasticsearch express split2 dotenv
자세히 설명해 드리겠습니다:
- elastic/elasticsearch: 공식 Node.js 클라이언트입니다.
- 익스프레스: 경량 노드js 서버를 회전시켜 Elasticsearch를 노출할 수 있습니다.
- split2: 텍스트 줄을 스트림으로 분할합니다. 한 번에 한 줄씩 ndjson 파일을 처리하는 데 유용합니다.
- dotenv: .env를 사용하여 환경 변수를 관리할 수 있습니다. 파일
.env 파일 만들기 파일을 열고 다음 줄을 추가합니다:
이렇게 하면 dotenv 패키지를 사용하여 해당 변수를 가져올 수 있습니다.
server.js 파일을 만듭니다:
이 코드는 포트 3000에서 수신 대기하고 인증을 위해 API 키를 사용하여 Elasticsearch 클러스터에 연결하는 기본 Express.js 서버를 설정합니다. 여기에는 GET 요청을 통해 액세스할 때 Elasticsearch 클라이언트의 .info() 메서드를 사용하여 기본 정보를 위해 Elasticsearch 클러스터에 쿼리하는 /ping 엔드포인트가 포함되어 있습니다.
쿼리가 성공하면 클러스터 정보를 JSON 형식으로 반환하고, 그렇지 않으면 오류 메시지를 반환합니다. 또한 서버는 본문 파서 미들웨어를 사용하여 JSON 요청 본문을 처리합니다.
파일을 실행하여 서버를 불러옵니다:
node server.js
답은 다음과 같이 표시되어야 합니다:
이제 엔드포인트 /ping 를 참조하여 Elasticsearch 클러스터의 상태를 확인해 보겠습니다.
문서 색인 생성
연결되면 시맨틱 검색을 위한 semantic_text와 전체 텍스트 쿼리를 위한 텍스트와 같은 매핑을 사용하여 문서를 색인할 수 있습니다. 이 두 가지 필드 유형을 사용하면 하이브리드 검색도 수행할 수 있습니다.
매핑을 생성하고 문서를 업로드하기 위해 load.js 파일을 새로 만들겠습니다.
Elasticsearch 클라이언트
먼저 클라이언트를 인스턴스화하고 인증해야 합니다:
시맨틱 매핑
동물 병원에 대한 데이터로 인덱스를 만들겠습니다. 주인과 반려동물의 정보, 방문 세부 정보를 저장합니다.
이름과 설명 등 전체 텍스트 검색을 실행하려는 데이터는 텍스트로 저장됩니다. 동물의 종이나 품종과 같은 카테고리의 데이터는 키워드로 저장됩니다.
또한 모든 필드의 값을 semantic_text 필드에 복사하여 해당 정보에 대해서도 의미론적 검색을 실행할 수 있도록 합니다.
대량 도우미
클라이언트의 또 다른 장점은 일괄 도우미를 사용하여 일괄 색인을 생성할 수 있다는 점입니다. 대량 도우미를 사용하면 동의, 재시도 및 기능을 통과하여 성공 또는 실패한 각 문서에 대해 수행할 작업과 같은 작업을 쉽게 처리할 수 있습니다.
이 도우미의 매력적인 기능은 스트림으로 작업할 수 있다는 점입니다. 이 기능을 사용하면 전체 파일을 메모리에 저장하고 한 번에 Elasticsearch로 전송하는 대신 파일을 한 줄씩 전송할 수 있습니다.
Elasticsearch에 데이터를 업로드하려면 프로젝트의 루트에 data.ndjson이라는 파일을 생성하고 아래 정보를 추가하세요(또는 여기에서 데이터 세트가 포함된 파일을 다운로드할 수 있습니다):
split2를 사용해 파일 줄을 스트리밍하는 동시에 대량 도우미가 이를 Elasticsearch로 전송합니다.
위의 코드는 .ndjson 파일을 한 줄씩 읽고 helpers.bulk 메서드를 사용하여 각 JSON 객체를 지정된 Elasticsearch 인덱스로 일괄 색인합니다. createReadStream 및 split2 을 사용하여 파일을 스트리밍하고 각 문서에 대한 인덱싱 메타데이터를 설정하며 처리하지 못한 모든 문서를 기록합니다. 완료되면 성공적으로 색인된 항목의 수를 기록합니다.
indexData 기능 대신, Kibana를 사용하여 데이터 파일 업로드 UI를통해 직접 파일을 업로드할 수 있습니다.
파일을 실행하여 Elasticsearch 클러스터에 문서를 업로드합니다.
node load.js
데이터 검색
server.js 파일로 돌아가서 어휘, 시맨틱 또는 하이브리드 검색을 수행하기 위해 다양한 엔드포인트를 만들어 보겠습니다.
간단히 말해, 이러한 유형의 검색은 상호 배타적인 것이 아니라 답변해야 하는 질문의 종류에 따라 달라집니다.
| 쿼리 유형 | 사용 사례 | 질문 예시 |
|---|---|---|
| 어휘 쿼리 | 문제의 단어 또는 단어 어근이 색인 문서에 표시될 가능성이 높습니다. 질문과 문서 간의 토큰 유사성. | 파란색 스포츠 티셔츠를 찾고 있습니다. |
| 시맨틱 쿼리 | 질문의 단어는 문서에 표시되지 않을 가능성이 높습니다. 질문과 문서 간의 개념적 유사성. | 추운 날씨에 입을 옷을 찾고 있습니다. |
| 하이브리드 검색 | 문제에는 어휘 및/또는 의미 구성 요소가 포함되어 있습니다. 질문과 문서 간의 토큰 및 의미적 유사성. | 해변 결혼식에 입을 S 사이즈 드레스를 찾고 있습니다. |
문제의 어휘 부분은 제목과 설명 또는 카테고리 이름의 일부일 가능성이 높으며, 의미 부분은 해당 필드와 관련된 개념입니다. 파란색은 카테고리 이름 또는 설명의 일부일 수 있으며, 해변 결혼식은 그렇지 않을 가능성이 높지만 의미상 린넨 의류와 관련이 있을 수 있습니다.
어휘 쿼리(/search/lexic?q=<query_term>)
전체 텍스트 검색이라고도 하는 어휘 검색은 토큰 유사성을 기반으로 검색하는 것을 의미합니다. 즉, 분석 후 검색에 토큰이 포함된 문서가 반환됩니다.
어휘 검색 실습 튜토리얼은 여기에서 확인할 수 있습니다.
테스트 대상: 손톱 다듬기
답변:
시맨틱 쿼리(/search/semantic?q=<query_term>)
시맨틱 검색은 어휘 검색과 달리 벡터 검색을 통해 검색어의 의미와 유사한 결과를 찾아냅니다.
시맨틱 검색 실습 튜토리얼은 여기에서 확인할 수 있습니다.
테스트 대상은 다음과 같습니다: 누가 페디큐어를 받았나요?
답변:
하이브리드<query_term> 쿼리(/검색/하이브리드?q=)
하이브리드 검색을 사용하면 시맨틱 검색과 어휘 검색을 결합하여 토큰별 검색의 정확성과 시맨틱 검색의 의미 근접성을 모두 얻을 수 있습니다.
"누가 페디큐어나 치과 치료를 받았나요?"로 테스트합니다."
대응:
결론
이 시리즈의 첫 번째 파트에서는 클라이언트/서버 모범 사례에 따라 환경을 설정하고 다양한 검색 엔드포인트를 가진 서버를 생성하여 Elasticsearch 문서를 쿼리하는 방법을 설명했습니다. 시리즈 2부에서 프로덕션 모범 사례와 서버리스 환경에서 Elasticsearch Node.js 클라이언트를 실행하는 방법에 대해 알아보세요.




