엘라스틱서치는 Restful 방식의 API를 제공하며, 이를 통해 JSON 기반으로 통신하며, 기본적으로 Http 통신을 위해 9200 포트를 이용한다.
※참고: Index VS Indices
index: 색인 데이터
indexing: 색인하는 과정
indeices: 매핑 정보를 저장하는 논리적인 공간
색인을 의미하는 경우 index 단어를 사용하며, 매핑 정의 공간을 의미할 경우 indeices를 사용한다.
엘라스틱 서치는 스키마리스라는 기능을 제공하는데 가급적이면 사용하지 말자
- 스키마리스: 문서를 색인하기 위해서는 인덱스를 생성하는 과정이 필요하지만 생성하는 과정 없이 문서를 추가하더라도 문서가 색인되도록 지원하는 기능
- 최초 문서가 색인될 때 인덱스 여부에 따라 존재하지 않으면 문서를 분석해서 인덱스를 자동 생성
- 성능에 영향을 줄 수 있으며, 데이터 구조 및 검색 방식을 확실히 이해한 상태에서 사용해야 한다.
- 인덱스를 자동으로 생성하게 되면, 세부적인 필드 정보가 매핑되지 않을 수도 있으며, 특정 단어 검색 시, 검색 결과에서 누락되는 문제가 발생할 가능성이 높다.
- 필드들이 text와 keyword 타입을 동시에 제공하는 멀티 필드 기능으로 구성될 수 있으며, 이는 데이터 공간의 낭비를 초래한다.
※참고: 스키마리스 기능 명시적 사용
노드 설정 파일에서 action.auto_create_index를 false로 설정할 경우 자동으로 인덱스가 생성되지 않는다.
인덱스 별로 제공되는 index.mapper, dynamic 설정을 false로 설정하면 특정 칼럼의 자동 매핑 생성을 비활성화할 수 있다.
인덱스 관리 API
인덱스 생성
매핑(문서와 문서에 포함된 필드, 필드 타입 등을 세세하게 지정하는 것이 가능한 설정 방식)이라는 세부 설정을 인덱스 생성 시, 추가할 수 있다.
PUT /movie
{
"settings": {
"number_of_shards": 3,
"number _of_replicas": 2
}
"mappings": {
"_doc": 1
"properties": {
"movied": ( "type" : "integer" },
"movieNm": { "type" : "text" },
"movieNmEn": { "type" : "text" },
"prdtYear": 1 "type" : "integer" },
"openDt": ( "type" : "date" },
"typeNm": { "type" : "keyword" },
"prdtStatNm": { "type" : "keyword" },
"nationAlt": { "type" : "keyword" },
"genreAlt": { "type" : "keyword" },
"repNationNm": ( "type" : "keyword" },
"reGenreNm": { "type" : "keyword" }
}
}
}
- 매핑 정보는 변경할 수 없다. 잘못 생성 시, 데이터를 삭제하고 다시 색인해야 한다.
- 엘라스틱서치는 다양한 형태의 데이터 타입을 제공하며, 단순 문자열은 keyword 타입, 형태소 분석을 원할 경우 text 타입을 사용한다.
인덱스 삭제
DELETE /movie
- 인덱스를 한번 삭제하면 다시는 복구할 수 없기 때문에 인덱스 삭제는 신중하게 해야 한다
문서 관리 API
실제 관리 API는 실제 문서를 색인하고 조회, 수정, 삭제를 지원하는 API다. 엘라스틱서치는 기본적으로 검색을 위한 다양한 검색 패턴을 지원하는 SearchApi를 별도로 제공하지만, 색인도 문서의 ID를 기준으로 한건의 문서를 다뤄할 할 경우 문서 관리 API를 사용한다.
문서관리 API는 기본적으로 한 건의 문서를 처리하기 위한 기능을 제공하면 다수의 문서를 처리해야 하는 경우 Multi Document APi를 사용하자
세부 기능
- index API: 한 건의 문서를 색인한다.
- Get API: 한건의 문서를 조회한다.
- Delete API: 한건의 문서를 삭제한다.
- Update Api: 한건의 문서를 삭제한다.
문서 생성
문서를 생성하기 위해서는 Post 메서드를 이용해 요청해야 한다.
POST /movie/_doc/1
{
"moviecd": "1",
"movieNm" : "살아남은아이",
"movieNmEn": "Last Child",
"prdtYear": "2017",
"openDt" : "2017-10-20",
"typeNm" : "장편",
"prdtStatNm" : "기타" ,
"nationAlt" : "한국" ,
"genreAlt" : "드라마,가족" ,
"repNationNm " : "한국" ,
"repGenreNm" : "드라마 "
}
- 결과로 JSON 항목 중, Result 항목이 Create라는 값을 확인할 수 있다.
문서 조회
문서를 조회하기 위해서는 Get 메서드를 사용하면 된다
GET / movie/_doc/1
문서 삭제
생성된 문서의 ID를 지정하고, Delete 메서드를 이용해 삭제할 수 있다.
DELETE /movie/_doc/1
ID를 지정하지 않고 문서 생성
ID를 지정하지 않고 문서 생성 시, 엘라스틱서치가 자동으로 _ID 값을 생성하고 _ID 값은 UUID의 랜덤 값이다.
POST /movie/_doc
{
"movied" : "1",
"movieNm" : "살아남은 아이",
"movieNmEn" : "LastChild",
"prdtYear" : "2017",
"openDt" : "2017-10-20",
"typeNm" : "장편"
"prdtStatm" : "기타",
"nationAlt" : "한국"
"genreAlt" : "드라마,가족",
"repNationNm" : "한국",
"repGenreNm" : "드라마"
}
- 무작위로 생성된 id 값 때문에 해당 문서를 업데이트 할 때 문제가 발생할 수 있다.
- 색인된 문서의 _id 값을 업데이트를 고려해서 데이터베이스 테이블의 식별 값과 맞춰 주는 것이 중요하다.
검색 API
사용방식
1) Http URI 형태의 파라미터를 URI에 추가해 검색하는 방법
2) RestFul API 방식인 QueryDSL을 사용해 요청 본문에 질의 내용을 추가해 검색하는 방법
현업에서는 2) 번 방식을 선호하며, URI 방식은 간단한 쿼리 검색을 하거나 디버깅할 때 종종 사용한다.
QueryDSL을 사용하면 가독성이 높고, JSON 형식으로 다양한 표현이 가능해지며, Query의 조건을 여러 개 만들거나 통계를 위한 집계쿼리 등 복잡한 쿼리를 작성하려면 QueryDSL을 이용하는 것이 좋다.
URI 방식의 검색 질의
문서 _id 값을 사용해 문서를 조회하는 방식으로, URL에 파라미터를 붙여 조회하는 방식이다.
GET /movie/_doc/HZuX6mEB06UMLL9exnak?pretty=true
해당 용어와 일치하는 문서만 검색
POST /movie/_search?q=장편
해당 용어와 일치하는 특정 필드만 검색
POST /movie/_search?q=typeNm:장편
- JSON 포맷 헤더에는 쿼리가 실행된 총 시간과 결과를 보여준다.
- _shards에서는 성공적으로 반환한 샤드의 수와 실패한 샤드의 수를 알 수 있다.
- hits에서는 일치하는 문서의 수와 함께 점수(_score)가 가장 높은 상위 10개 문서를 보여준다.
- 검색에 실패한 샤드의 수는 검색 시 설정된 time_out에 따라 결정되며, time_out 시간이 초과하면 그때까지 검색된 내용까지만 검색 결과로 반환한다.
- 실패한 샤드 수가 많다면 time_out 시간을 적절하게 조절해야 한다.
- q 파라미터를 사용할 때 별도의 필드명을 지정하지 않으면 존재하는 모든 필드를 대상으로 검색을 수행하며, 특정 필드만 조회하고 싶으면 필드명:"검색어"를 포함해서 요청하면 된다.
Request Body 방식의 검색 질의
JSON 포맷을 이용해 RestFul 방식으로 질의하면 매우 복잡한 쿼리도 쉽게 표현할 수 있고, 여러 조건을 한 번에 처리할 수 있다.
POST /{index명)/_search
{
JSON 쿼리 구운
}
- size: 몇 개의 결과를 반환할지 결정한다(기본 10)
- from: 어느 위치부터 반환할지를 결정(기본 0)
- 0부터 시작하면, 상위 0~10건의 데이터를 반환
- _source: 특정 필드만 결과로 반환하고 싶을 때 사용
- sort: 특정 필드를 기준으로 정렬한다(asc, desc 지정 가능)
- query: 검색될 조건을 정의한다.
- filter: 검색 결과 중 특정한 값을 다시 보여준다.
- 결과 내에서 재검색할 때 사용하는 기능 중 하나다
- filter를 사용하게 되면 자동으로 score 값이 정렬되지 않는다.
집계 API
엘라스틱서치 5.0 이후부터 독자적인 집계 API를 제공했으며, 기본적으로 메모리 기반으로 동작하여 대용량 데이터 통계 작업이 가능하다.
쿼리에 사용되는 집계에 따라 수치를 계산하고 동적으로 카운팅 하거나 히스토그램 같은 작업도 가능해졌다.
데이터 집계
POST /movie/_search?size=0
{
"aggs": {
"genre" : (
"terms" : {
"field": "genreAlt"
}
}
}
}
- 버킷이라는 구조 안에 그룹화된 데이터가 포함돼 있다.
- 버킷 안에 다른 버킷의 결과를 추가할 수 있어, 다양한 집계 유형을 결합하거나 중첩, 조합이 가능하다.
데이터 집계 타입
- 버킷 집계: 집계 중 가장 많이 사용한다. 문서의 필드를 기준으로 버킷을 집계한다.
- 메트릭 집계: 문서에서 추출된 값을 가지고 Sum, Max, Min, Avg를 계산한다.
- 메트릭스 집계: 행렬의 값을 합하거나 곱한다.
- 파리프라인 집계: 버킷에서 도출된 결과 문서를 다른 필드 값으로 재분류한다.
- 다른 집계에 생성된 출력 결과를 다시 한번 집계한다.(패싯보다 강력한 이유)
'Elastic Search' 카테고리의 다른 글
| Ch03. 데이터 모델링 - 필드 데이터 타입 (0) | 2025.09.07 |
|---|---|
| Ch03. 데이터 모델링 - 메타 필드 (0) | 2025.09.07 |
| Ch03. 데이터 모델링 - 매핑 API (0) | 2025.09.07 |
| Ch02. 엘라스틱서치 살펴보기 - 엘라스틱서치 구성하는 개념 (0) | 2025.09.02 |
| Ch01. 검색 시스템 이해하기 (0) | 2025.09.02 |