책 소개
요약
이 책은 현대적인 검색엔진인 일래스틱서치의 기능과 활용법을 폭넓게 다룬 실용적인 안내서다. 기초적인 검색 개념부터 고급 쿼리 작성, 시스템 관리까지 일래스틱서치의 핵심 기능과 아키텍처를 체계적으로 탐구하며, 초보자와 고급 사용자 모두에게 유용한 지식을 제공한다.
초반에는 검색의 기본 개념과 일래스틱서치의 독창적인 기능을 소개하며, 도큐먼트 API 실습을 통해 검색 조건 및 고급 쿼리 작성을 학습할 수 있도록 안내한다. 이어서 데이터 매핑, 텍스트 분석, 풀텍스트 검색, 복합 쿼리 작성, 집계 처리 등 검색 기술 전반을 심층적으로 다룬다. 후반부에서는 프로덕션 환경에서의 일래스틱서치 운영과 성능 최적화에 중점을 두고, 클러스터 관리, 샤드 구성, 스냅숏 생성 및 복구, 성능 병목 현상 해결 등 실무적 관리 기법을 상세히 설명한다. 또한 부록에서는 설치 가이드, 데이터 전처리용 인제스트 파이프라인 구성, 다양한 프로그래밍 언어와의 연동 방법을 제공한다.
검색 기술을 배우고 활용하고자 하는 모든 독자에게 강력한 도구와 실무적 인사이트를 제공할 것이다.
추천의 글
여러 해 동안 매닝의 『인 액션(In Action)』 시리즈의 엄청난 팬이었으며, 이 시리즈는 경력에 있어서 중요한 부분을 차지해왔다. 일뿐만 아니라 오픈 소스에 있어서도 실무적이고 유용하며 다양한 기술에 대해 실질적인 조언을 제공하는 방식을 좋아한다. 수년 전 일래스틱서치를 개발하기 시작한 것도 같은 맥락에서였다. 아내가 요리사가 되기 위해 공부할 때 아내를 위해 레시피 애플리케이션을 만들고자 검색 기술에 관심을 갖게 됐다. 구현한 코드를 오픈 소스로 공개함으로써 오픈 소스 세계에 첫발을 내디뎠다. 몇 년 뒤 유용하고 실용적이며 사용하기 쉬운 실질적인 검색엔진을 만들기 위해 일래스틱서치를 개발하기 시작했다. 2023년으로 빠르게 넘어가 보면 일래스틱서치가 많은 인기를 얻고 인 액션 시리즈에 포함돼 있다는 것을 보게 돼 매우 기쁘다. 지금 여러분이 손에 들고 있거나 디지털 형태로 보고 있는 바로 이 책 말이다. 이 책을 읽고 일래스틱서치에 대해 배우는 일을 즐길 것이라 확신한다. 지은이 마두(Madhu)는 검색과 일래스틱서치에 열정을 갖고 있으며, 이 책의 깊이와 폭, 열중하는 어조, 실습 예제에서 그 열렬한 마음이 드러난다. 일래스틱서치에 대해 배운 후, 읽은 내용을 “실제로 활용(in action)”하길 바란다. 결국 검색은 우리가 하는 모든 일과 모든 곳에 존재한다. 내가 그토록 오래 전에 검색에 빠져들게 된 이유이기도 하다.
— 셰이 배넌(Shay Banon), 일래스틱서치 설립자
이 책에서 다루는 내용
◆ 검색 아키텍처 이해
◆ 풀텍스트와 텀 수준 검색 쿼리
◆ 분석 및 집계
◆ 키바나에서의 고수준 시각화
◆ 클러스터 구성, 확장 및 튜닝
목차
목차
- 1장 개요
- 1.1 좋은 검색엔진이란?
- 1.2 검색은 새로운 표준
- 1.2.1 구조화된 데이터와 비구조화된 데이터
- 1.2.2 데이터베이스 기반 검색
- 1.2.3 데이터베이스와 검색엔진
- 1.3 최신 검색엔진
- 1.3.1 기능
- 1.3.2 인기 검색엔진
- 1.4 일래스틱서치 개요
- 1.4.1 핵심 영역
- 1.4.2 일래스틱 스택
- 1.4.3 일래스틱서치 사용 사례
- 1.4.4 부적절한 일래스틱서치 사용
- 1.4.5 오해
- 1.5 대중적 채택
- 1.6 생성형 AI와 최신 검색
- 요약
- 2장 시작해 보기
- 2.1 데이터와 함께 일래스틱서치 준비
- 2.1.1 온라인 서점
- 2.1.2 도큐먼트 인덱싱
- 2.1.3 첫 도큐먼트 인덱싱
- 2.1.4 더 많은 도큐먼트 인덱싱
- 2.2 데이터 검색
- 2.2.1 도큐먼트 집계
- 2.2.2 도큐먼트 검색
- 2.3 풀텍스트 검색
- 2.3.1 match 쿼리: 특정 저자의 책 검색
- 2.3.2 AND 연산자를 사용한 match 쿼리
- 2.3.3 _bulk API를 사용해 도큐먼트 인덱싱
- 2.3.4 다중 필드 검색
- 2.3.5 결과 부스팅
- 2.3.6 문구 검색
- 2.3.7 누락된 단어가 있는 문구
- 2.3.8 철자 오류 처리
- 2.4 텀 수준 쿼리
- 2.4.1 term 쿼리
- 2.4.2 range 쿼리
- 2.5 compound 쿼리
- 2.5.1 bool 쿼리
- 2.5.2 must 절
- 2.5.3 must_not 절
- 2.5.4 should 절
- 2.5.5 filter 절
- 2.6 집계
- 2.6.1 메트릭
- 2.6.2 버킷 집계
- 요약
- 3장 아키텍처
- 3.1 개요
- 3.1.1 데이터 입력
- 3.1.2 데이터 처리
- 3.1.3 데이터 출력
- 3.2 빌딩 블록
- 3.2.1 도큐먼트
- 3.2.2 인덱스
- 3.2.3 데이터 스트림
- 3.2.4 샤드와 복제본
- 3.2.5 노드와 클러스터
- 3.3 역인덱스
- 3.4 관련성
- 3.4.1 관련성 점수
- 3.4.2 관련성(유사성) 알고리듬
- 3.5 라우팅 알고리듬
- 3.6 스케일링
- 3.6.1 스케일 업(수직 확장)
- 3.6.2 스케일 아웃(수평 확장)
- 요약
- 4장 매핑
- 4.1 매핑 개요
- 4.1.1 매핑 정의
- 4.1.2 첫 도큐먼트 인덱스 생성
- 4.2 동적 매핑
- 4.2.1 타입 추론 메커니즘
- 4.2.2 동적 매핑의 한계
- 4.3 명시적 매핑
- 4.3.1 인덱싱 API를 사용한 매핑
- 4.3.2 매핑 API를 사용해 스키마 업데이트
- 4.3.3 기존 필드 수정은 허용되지 않는다
- 4.3.4 타입 강제
- 4.4 데이터 타입
- 4.5 핵심 데이터 타입
- 4.5.1 text 데이터 타입
- 4.5.2 keyword 데이터 타입
- 4.5.3 date 데이터 타입
- 4.5.4 숫자 데이터 타입
- 4.5.5 boolean 데이터 타입
- 4.5.6 range 데이터 타입
- 4.5.7 IP 데이터 타입
- 4.6 고급 데이터 타입
- 4.6.1 geo_point 데이터 타입
- 4.6.2 object 데이터 타입
- 4.6.3 nested 데이터 타입
- 4.6.4 flattened 데이터 타입
- 4.6.5 join 데이터 타입
- 4.6.6 searchasyou_type 데이터 타입
- 4.7 다중 데이터 타입이 있는 필드
- 요약
- 5장 도큐먼트 작업
- 5.1 도큐먼트 인덱싱
- 5.1.1 도큐먼트 API
- 5.1.2 인덱싱 메커니즘
- 5.1.3 새로 고침 프로세스 사용자 정의
- 5.2 도큐먼트 검색
- 5.2.1 단일 도큐먼트 API 사용
- 5.2.2 다중 도큐먼트 검색
- 5.2.3 ID 쿼리
- 5.3 응답 조작
- 5.3.1 응답에서 메타데이터 제거
- 5.3.2 소스 도큐먼트 제외
- 5.3.3 필드 포함 및 제외
- 5.4 도큐먼트 업데이트
- 5.4.1 도큐먼트 업데이트 메커니즘
- 5.4.2 _update API
- 5.4.3 스크립트 업데이트
- 5.4.4 도큐먼트 교체
- 5.4.5 Upsert
- 5.4.6 Upsert로 업데이트
- 5.4.7 쿼리를 사용한 업데이트
- 5.5 도큐먼트 삭제
- 5.5.1 ID로 삭제하기
- 5.5.2 쿼리로 삭제(deleteby_query)
- 5.5.3 범위 쿼리로 삭제
- 5.5.4 모든 도큐먼트 삭제
- 5.6 벌크 도큐먼트 작업
- 5.6.1 _bulk API 형식
- 5.6.2 벌크 인덱싱 도큐먼트
- 5.6.3 독립된 엔티티와 다중 액션
- 5.6.4 cURL을 사용한 대량 요청
- 5.7 도큐먼트 재인덱싱
- 요약
- 6장 인덱싱 작업
- 6.1 인덱싱 작업
- 6.2 인덱스 생성
- 6.2.1 암묵적으로 인덱스 생성(자동 생성)
- 6.2.2 명시적으로 인덱스 생성
- 6.2.3 맞춤형 설정이 포함된 인덱스
- 6.2.4 매핑이 포함된 인덱스
- 6.2.5 별칭이 있는 인덱스
- 6.3 인덱스 읽기
- 6.3.1 공개 인덱스 읽기
- 6.3.2 숨겨진 인덱스 읽기
- 6.4 인덱스 삭제
- 6.5 인덱스 닫기와 열기
- 6.5.1 인덱스 닫기
- 6.5.2 인덱스 열기
- 6.6 인덱스 템플릿
- 6.6.1 컴포저블(인덱스) 템플릿 만들기
- 6.6.2 컴포넌트 템플릿 생성
- 6.7 인덱스 모니터링 및 관리
- 6.7.1 인덱스 통계
- 6.7.2 다중 인덱스 및 통계
- 6.8 고급 작업
- 6.8.1 인덱스 분할
- 6.8.2 인덱스 축소
- 6.8.3 인덱스 별칭 롤오버
- 6.9 인덱스 수명 주기 관리
- 6.9.1 인덱스 수명 주기
- 6.9.2 인덱스 수명 주기 수동 관리
- 6.9.3 롤오버가 포함된 수명 주기
- 요약
- 7장 텍스트 분석
- 7.1 개요
- 7.1.1 구조화되지 않은 데이터 쿼리
- 7.1.2 분석기가 구원해 주다
- 7.2 분석기 모듈
- 7.2.1 토큰화
- 7.2.2 정규화
- 7.2.3 분석기 구조
- 7.2.4 분석기 테스트
- 7.3 내장 분석기
- 7.3.1 standard 분석기
- 7.3.2 simple 분석기
- 7.3.3 whitespace 분석기
- 7.3.4 keyword 분석기
- 7.3.5 fingerprint 분석기
- 7.3.6 pattern 분석기
- 7.3.7 언어 분석기
- 7.4 맞춤형 분석기
- 7.4.1 고급 맞춤형
- 7.5 분석기 지정
- 7.5.1 인덱싱을 위한 분석기
- 7.5.2 검색용 분석기
- 7.6 문자 필터
- 7.6.1 HTML 스트립(hmtl_strip) 필터
- 7.6.2 매핑 문자 필터
- 7.6.3 파일을 통한 매핑
- 7.6.4 pattern_replace 문자 필터
- 7.7 토크나이저
- 7.7.1 standard 토크나이저
- 7.7.2 ngram과 edge_ngram 토크나이저
- 7.7.3 기타 토크나이저
- 7.8 토큰 필터
- 7.8.1 스테머 필터
- 7.8.2 shingle 필터
- 7.8.3 synonym 필터
- 요약
- 8장 검색 소개
- 8.1 개요
- 8.2 검색은 어떻게 작동할까?
- 8.3 영화 샘플 데이터
- 8.4 검색 기본 사항
- 8.4.1 _search 엔드포인트
- 8.4.2 쿼리와 필터 컨텍스트
- 8.5 요청과 응답 분석
- 8.5.1 검색 요청
- 8.5.2 검색 응답
- 8.6 URI 요청
- 8.6.1 제목으로 영화 검색하기
- 8.6.2 특정 영화 검색하기
- 8.6.3 추가 매개변수
- 8.6.4 쿼리 DSL로 URI 요청 지원
- 8.7 쿼리 DSL
- 8.7.1 샘플 쿼리
- 8.7.2 cURL에 대한 DSL 쿼리
- 8.7.3 집계를 위한 쿼리 DSL
- 8.7.4 리프 및 복합 쿼리
- 8.8 검색 기능
- 8.8.1 페이지 매김
- 8.8.2 강조 표시
- 8.8.3 관련성 점수 설명
- 8.8.4 정렬
- 8.8.5 결과 조작
- 8.8.6 인덱스 및 데이터 스트림 검색
- 요약
- 9장 텀 수준 검색
- 9.1 텀 수준 검색 개요
- 9.1.1 텀 수준 쿼리는 분석되지 않는다
- 9.1.2 텀 수준 쿼리 예
- 9.2 term 쿼리
- 9.2.1 텍스트 필드에 대한 term 쿼리
- 9.2.2 term 쿼리 예시
- 9.2.3 간소화된 텀 수준 쿼리
- 9.3 terms 쿼리
- 9.3.1 terms 쿼리의 예
- 9.3.2 terms 룩업 쿼리
- 9.4 ids 쿼리
- 9.5 exists 쿼리
- 9.6 range 쿼리
- 9.7 wildcard 쿼리
- 9.8 prefix 쿼리
- 9.8.1 간소화 버전 쿼리
- 9.8.2 prefix 쿼리 속도 향상
- 9.9 fuzzy 쿼리
- 요약
- 10장 풀텍스트 검색
- 10.1 개요
- 10.1.1 정밀도
- 10.1.2 재현율
- 10.2 샘플 데이터
- 10.3 match_all 쿼리
- 10.3.1 match_all 쿼리 작성
- 10.3.2 match_all 쿼리의 간소화 버전
- 10.4 match_none 쿼리
- 10.5 match 쿼리
- 10.5.1 match 쿼리의 형식
- 10.5.2 match 쿼리를 사용해 검색
- 10.5.3 match 쿼리 분석
- 10.5.4 여러 단어 검색
- 10.5.5 최소한 몇 단어 일치
- 10.5.6 fuzziness 키워드를 사용한 오타 수정
- 10.6 match_phrase 쿼리
- 10.7 matchphraseprefix 쿼리
- 10.8 multi_match 쿼리
- 10.8.1 베스트 필드
- 10.8.2 dis_max 쿼리
- 10.8.3 타이브레이커
- 10.8.4 개별 필드 부스팅
- 10.9 query_string 쿼리
- 10.9.1 query_string 쿼리의 필드
- 10.9.2 기본 연산자
- 10.9.3 구문이 포함된 query_string 쿼리
- 10.10 fuzzy 쿼리
- 10.11 간단한 문자열 쿼리
- 10.12 simplequerystring 쿼리
- 요약
- 11장 복합 쿼리
- 11.1 제품 데이터 샘플
- 11.1.1 products 스키마
- 11.1.2 products 인덱싱
- 11.2 복합 쿼리
- 11.3 bool 쿼리
- 11.3.1 bool 쿼리 구조
- 11.3.2 must 절
- 11.3.3 must 절 강화
- 11.3.4 must_not 절
- 11.3.5 must_not 절 개선
- 11.3.6 should 절
- 11.3.7 filter 절
- 11.3.8 모든 절 결합
- 11.3.9 명명된 쿼리
- 11.4 상수 점수
- 11.5 부스팅 쿼리
- 11.6 디스정션 맥스(dis_max) 쿼리
- 11.7 function_score 쿼리
- 11.7.1 random_score 함수
- 11.7.2 script_score 함수
- 11.7.3 fieldvaluefactor 함수
- 11.7.4 함수 점수의 결합
- 요약
- 12장 고급 검색
- 12.1 위치 검색 소개
- 12.1.1 bounding_box 쿼리
- 12.1.2 geo_distance 쿼리
- 12.1.3 geo_shape 쿼리
- 12.2 지리 공간 데이터 타입
- 12.2.1 geo_point 데이터 타입
- 12.2.2 geo_shape 데이터 타입
- 12.3 지리 공간 쿼리
- 12.4 geoboundingbox 쿼리
- 12.5 geo_distance 쿼리
- 12.6 geo_shape 쿼리
- 12.7 shape 쿼리
- 12.8 span 쿼리
- 12.8.1 샘플 데이터
- 12.8.2 span_first 쿼리
- 12.8.3 span_near 쿼리
- 12.8.4 span_within 쿼리
- 12.8.5 span_or 쿼리
- 12.9 특수 쿼리
- 12.9.1 distance_feature 쿼리
- 12.9.2 pinned 쿼리
- 12.9.3 morelikethis 쿼리
- 12.9.4 percolate 쿼리
- 요약
- 13장 집계
- 13.1 개요
- 13.1.1 엔드포인트와 구문
- 13.1.2 검색 및 집계 결합
- 13.1.3 다중 및 중첩 집계
- 13.1.4 결과 무시
- 13.2 메트릭 집계
- 13.2.1 샘플 데이터
- 13.2.2 value_count 메트릭
- 13.2.3 avg 메트릭
- 13.2.4 sum 메트릭
- 13.2.5 min 및 max 메트릭
- 13.2.6 stats 메트릭
- 13.2.7 extended_stats 메트릭
- 13.2.8 cardinality 메트릭
- 13.3 버킷 집계
- 13.3.1 히스토그램
- 13.3.2 자식 수준 집계
- 13.3.3 사용자 정의 범위 집계
- 13.3.4 텀즈 집계
- 13.3.5 다중 텀즈 집계
- 13.4 부모 및 형제 집계
- 13.4.1 부모 집계
- 13.4.2 형제 집계
- 13.5 파이프라인 집계
- 13.5.1 파이프라인 집계 유형
- 13.5.2 샘플 데이터
- 13.5.3 파이프라인 집계 구문
- 13.5.4 사용 가능한 파이프라인 집계
- 13.5.5 cumulative_sum 부모 집계
- 13.5.6 maxbucket 및 minbucket 형제 파이프라인 집계
- 요약
- 14장 관리자
- 14.1 클러스터 확장
- 14.1.1 클러스터에 노드 추가
- 14.1.2 클러스터 상태
- 14.1.3 읽기 처리량 증가
- 14.2 노드 통신
- 14.3 샤드 크기 조정
- 14.3.1 단일 인덱스 설정
- 14.3.2 다중 인덱스 설정
- 14.4 스냅숏
- 14.4.1 시작하기
- 14.4.2 스냅숏 저장소 등록
- 14.4.3 스냅숏 생성
- 14.4.4 스냅숏 복원
- 14.4.5 스냅숏 삭제
- 14.4.6 스냅숏 자동화
- 14.5 고급 구성
- 14.5.1 기본 구성 파일
- 14.5.2 로깅 옵션
- 14.5.3 자바 가상 머신 옵션
- 14.6 클러스터 마스터
- 14.6.1 마스터 노드
- 14.6.2 마스터 선출
- 14.6.3 클러스터 상태
- 14.6.4 쿼럼
- 14.6.5 스플릿 브레인 문제
- 14.6.6 전용 마스터 노드
- 요약
- 15장 성능 및 문제 해결
- 15.1 검색과 속도 문제
- 15.1.1 최신 하드웨어
- 15.1.2 도큐먼트 모델링
- 15.1.3 text 타입 대신 keyword 타입 선택
- 15.2 인덱스 속도 문제
- 15.2.1 시스템 생성 식별자
- 15.2.2 벌크 요청
- 15.2.3 새로 고침 빈도 조정
- 15.3 불안정한 클러스터
- 15.3.1 클러스터가 GREEN이 아니다
- 15.3.2 할당되지 않은 샤드
- 15.3.3 디스크 사용량 임곗값
- 15.4 서킷 브레이커
- 15.5 마무리