Search API 개요

  • Elasticsearch의 **가장 핵심적인 기능은 검색(Querying)**입니다.
  • _search API는 인덱스 단위로 검색을 수행합니다.
  • 기본 사용법:
    GET <인덱스명>/_search
    
    • 쿼리를 입력하지 않으면 **모든 문서(match_all)**를 검색합니다.

URI 검색

  • _search?q=검색어 형식으로 간단한 검색이 가능합니다.
  • URI 검색의 장점
    • 웹 브라우저 주소창에서도 쉽게 사용 가능
    • 단순 검색에 적합

예제 1: 전체 인덱스에서 "value" 검색

GET test/_search?q=value
  • 결과 (hits.total.value에 검색된 문서 개수 표시)
    {
      "hits": {
        "total": { "value": 1 },
        "hits": [ {...} ]
      }
    }
    

예제 2: "value" AND "three" 검색

GET test/_search?q=value AND three
  • 설명
    • AND, OR, NOT 연산자 사용 가능 (대문자로 입력해야 함)
    • "value"와 "three"를 모두 포함하는 문서 검색

예제 3: 특정 필드에서 검색

GET test/_search?q=field:value
  • 설명
    • field 필드에서 "value"를 검색

URI 검색의 한계

  • 복잡한 검색 불가능 (예: 여러 개의 필드 조합, 필터링)
  • Query DSL보다 기능이 제한적
  • 권장: 단순 검색에만 사용하고, 복잡한 검색은 Query DSL 사용

데이터 본문(Data Body) 검색

  • Elasticsearch의 Query DSL을 이용한 검색 방식
  • JSON 형식의 검색 쿼리를 사용하며, 보다 강력한 검색 기능 제공

예제 1: match 쿼리 (기본 검색)

GET test/_search
{
  "query": {
    "match": {
      "field": "value"
    }
  }
}
  • 설명
    • "field" 필드에서 "value"를 검색
    • match 쿼리자연어 검색에 적합 (부분 일치 가능)

예제 2: match_all (전체 문서 조회)

GET test/_search
{
  "query": {
    "match_all": {}
  }
}
  • 설명: 모든 문서를 검색 (특정 조건 없이 전체 조회)

예제 3: 특정 필드에서 여러 키워드 검색

GET test/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "field1": "value1" } },
        { "match": { "field2": "value2" } }
      ]
    }
  }
}
  • 설명
    • "field1"에서 "value1"을 찾고
    • "field2"에서 "value2"도 함께 검색
    • AND 조건 검색

멀티테넌시 (Multitenancy)

  • 여러 개의 인덱스를 한 번에 검색할 수 있음
  • **주로 로그 데이터 분석(Log Analysis)**에 사용됨

예제 1: 쉼표(,)로 여러 인덱스 검색

GET logs-2018-01,logs-2018-02/_search
  • "logs-2018-01" 과 "logs-2018-02" 인덱스에서 검색

예제 2: 와일드카드(*)를 이용한 다중 인덱스 검색

GET logs-2018-*/_search
  • "logs-2018-"로 시작하는 모든 인덱스에서 검색

예제 3: 모든 인덱스에서 검색 (_all)

GET _all/_search
  • ⚠ 주의: _all은 시스템 부하를 초래할 수 있음
    • Elasticsearch 클러스터 내의 모든 인덱스를 검색하므로, 대량 데이터 환경에서는 권장되지 않음
    • 특정 인덱스 패턴을 지정하는 것이 좋음

Search API 정리

기능 방법 예제
전체 검색 (match_all) Query DSL GET test/_search {"query": {"match_all": {}}}
단순 검색 (URI 검색) _search?q=검색어 GET test/_search?q=value
특정 필드 검색 _search?q=필드:검색어 GET test/_search?q=field:value
match 쿼리 (부분 검색 가능) Query DSL GET test/_search {"query": {"match": {"field": "value"}}}
AND 조건 검색 URI 검색 GET test/_search?q=value AND three
여러 개의 인덱스 검색 (쉼표) _search GET logs-2018-01,logs-2018-02/_search
여러 개의 인덱스 검색 (와일드카드) _search GET logs-2018-*/_search
모든 인덱스 검색 (_all) _search GET _all/_search

🎯 추가 학습 추천

  1. 복합 쿼리(Query DSL - bool 쿼리)
    • 필터링과 랭킹을 조합한 강력한 검색 방식
  2. 검색 결과 정렬 및 페이징 (from, size)
  3. 어그리게이션(Aggregation) 사용법
  4. Highlighting (검색어 하이라이트)

 

Elasticsearch의 도큐먼트 URL 구조

  • Elasticsearch에서는 단일 도큐먼트마다 고유한 URL을 갖습니다.
  • 도큐먼트 접근 URL 구조:
    http://<호스트>:<포트>/<인덱스>/_doc/<도큐먼트 ID>
    
  • Elasticsearch 6.x 이전 버전에서는 다음과 같은 구조였으나,
    http://<호스트>:<포트>/<인덱스>/<도큐먼트 타입>/<도큐먼트 ID>
    
    Elasticsearch 7.0부터도큐먼트 타입 개념이 제거되고 _doc으로 접근해야 합니다.

데이터 입력 (Create & Update)

PUT 요청으로 도큐먼트 입력

PUT my_index/_doc/1
{
  "name": "Jongmin Kim",
  "message": "안녕하세요 Elasticsearch"
}
  • 결과 예시
    {
      "_index": "my_index",
      "_type": "_doc",
      "_id": "1",
      "_version": 1,
      "result": "created",
      "_shards": {"total": 2, "successful": 1, "failed": 0},
      "_seq_no": 0,
      "_primary_term": 1
    }
    
  • 같은 ID로 다시 입력하면 기존 데이터가 덮어쓰기(Overwrite)되며 "result": "updated" 로 변경됩니다.

데이터 덮어쓰지 않고 새 도큐먼트만 입력 (_create 사용)

PUT my_index/_create/1
{
  "name": "Jongmin Kim",
  "message": "안녕하세요 Elasticsearch"
}
  • 이미 ID가 존재하는 경우 오류 발생:
    {
      "error": {
        "type": "version_conflict_engine_exception",
        "reason": "document already exists"
      },
      "status": 409
    }
    

데이터 조회 (Read)

GET 요청으로 도큐먼트 조회

GET my_index/_doc/1
  • 응답 예시:
    {
      "_index": "my_index",
      "_type": "_doc",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
        "name": "Jongmin Kim",
        "message": "안녕하세요 Elasticsearch"
      }
    }
    
  • 삭제된 도큐먼트 또는 없는 도큐먼트 조회 시
    {
      "_index": "my_index",
      "_type": "_doc",
      "_id": "1",
      "found": false
    }
    

데이터 수정 (Update)

부분 업데이트 (_update API 사용)

  • 특정 필드만 수정할 때 사용 (doc 키워드 활용)
POST my_index/_update/1
{
  "doc": {
    "message": "안녕하세요 Kibana"
  }
}
  • 응답 결과 (_version 증가)
    {
      "_index": "my_index",
      "_type": "_doc",
      "_id": "1",
      "_version": 2,
      "result": "updated",
      "_shards": {"total": 2, "successful": 1, "failed": 0}
    }
    
  • 주의사항: 내부적으로 기존 도큐먼트를 가져와 변경 후 새 도큐먼트로 재저장하는 방식이므로 부분 업데이트처럼 보이지만 실제로는 전체 덮어쓰기가 발생합니다.

데이터 삭제 (Delete)

도큐먼트 삭제

DELETE my_index/_doc/1
  • 응답 결과
    {
      "_index": "my_index",
      "_type": "_doc",
      "_id": "1",
      "result": "deleted"
    }
    
  • 삭제된 도큐먼트 조회 시
    {
      "_index": "my_index",
      "_type": "_doc",
      "_id": "1",
      "found": false
    }
    

전체 인덱스 삭제

DELETE my_index
  • 응답 결과
    {
      "acknowledged": true
    }
    
  • 삭제된 인덱스의 도큐먼트 조회 시 오류 발생
    {
      "error": {
        "type": "index_not_found_exception",
        "reason": "no such index"
      },
      "status": 404
    }
    

자동 생성되는 도큐먼트 ID 활용

POST 요청으로 자동 생성되는 도큐먼트 ID

POST my_index/_doc
{
  "name": "Jongmin Kim",
  "message": "안녕하세요 Elasticsearch"
}
  • 응답 결과 (_id가 자동 생성됨)
    {
      "_index": "my_index",
      "_type": "_doc",
      "_id": "ZuFv12wBspWtEG13dOut",
      "_version": 1,
      "result": "created"
    }
    

Elasticsearch 6.x 이전 버전과의 차이점

항목 6.x 이전 버전 7.0 이후
도큐먼트 URL 구조 /index/type/id /index/_doc/id
새 도큐먼트 입력 PUT index/type/id/_create PUT index/_create/id
부분 업데이트 (_update API) POST index/type/id/_update POST index/_update/id

정리

작업 HTTP 메서드 예제
도큐먼트 입력 PUT PUT my_index/_doc/1
자동 ID 생성 POST POST my_index/_doc
부분 업데이트 POST POST my_index/_update/1 {"doc": {"message": "변경됨"}}
도큐먼트 조회 GET GET my_index/_doc/1
도큐먼트 삭제 DELETE DELETE my_index/_doc/1
전체 인덱스 삭제 DELETE DELETE my_index

🎯 추가로 알아두면 좋은 개념

  1. 버전 관리 (_version): Elasticsearch는 도큐먼트의 변경 시 버전을 증가시킵니다.
  2. 샤드 & 레플리카: 데이터를 분산 저장하여 고가용성을 유지합니다.
  3. Query DSL: 복잡한 검색 기능을 위한 JSON 기반의 질의 언어입니다.
  4. Bulk API: 대량의 데이터를 한 번에 처리할 수 있는 API입니다.

 

'Elastic Search > Elastic 데이터 처리' 카테고리의 다른 글

[Elasticsearch] Search API  (0) 2025.02.03
[Elasticsearch] REST API  (0) 2025.02.03

REST API 개요

  • Elasticsearch는 HTTP 프로토콜 기반의 REST API를 제공합니다.
  • 자원(Resource)마다 고유한 URL을 사용하며, **HTTP 메서드(PUT, POST, GET, DELETE)**로 데이터를 처리합니다.
  • 이러한 시스템을 RESTFul 시스템이라고 합니다.

REST API 방식과 비 REST 방식 비교

방식 요청 방식 예제
비REST 방식 개별 페이지 접근 또는 매개변수 방식 http://user.com/input.jsp?name=kim&age=38&gender=m
RESTFul 방식 단일 URL과 HTTP 메서드 활용 PUT http://user.com/kim -d {"name":"kim", "age":38, "gender":"m"}

예제: 사용자 정보(name=kim, age=38, gender=m) 처리 방식 비교

  비REST 방식 RESTFul 방식
입력 http://user.com/input.jsp?name=kim&age=38&gender=m PUT http://user.com/kim -d {"name":"kim", "age":38, "gender":"m"}
조회 http://user.com/get.jsp?name=kim GET http://user.com/kim
삭제 http://user.com/delete.jsp?name=kim DELETE http://user.com/kim

Elasticsearch REST API 활용

(1) 클러스터 정보 조회

  • HTTP 요청 방법: GET http://localhost:9200
  • curl 명령어 사용 예제
    curl -XGET "http://localhost:9200"
    
  • 응답 예시 (JSON)
    {
      "name" : "Jongminui-MacBook-Pro.local",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "hpmT8TPiR1Kk69YNao9V3w",
      "version" : {
        "number" : "7.3.0",
        "build_flavor" : "default",
        "build_type" : "tar",
        "build_hash" : "de777fa",
        "build_date" : "2019-07-24T18:30:11.767338Z",
        "lucene_version" : "8.1.0"
      },
      "tagline" : "You Know, for Search"
    }
    
  • 응답 정보 설명
    필드명 설명
    name 노드명
    cluster_name 클러스터명
    cluster_uuid 클러스터 고유 ID
    version.number Elasticsearch 버전
    lucene_version Lucene 버전
    tagline 기본 태그라인

Kibana Dev Tools

  • REST API를 쉽게 실행하기 위한 도구
  • Kibana 실행 방법
    1. Elastic 공식 웹사이트에서 Kibana 다운로드: https://www.elastic.co
    2. 압축 해제 후 실행
      • 리눅스/Mac: bin/kibana
      • 윈도우: bin/kibana.bat
    3. 기본 실행 포트: 5601
    4. 실행 후 웹 브라우저에서 접속: http://localhost:5601
  • 설정 파일 (kibana.yml) 수정
    • Elasticsearch가 다른 호스트에서 실행될 경우: 
    • elasticsearch.url: "http://localhost:9200"
    • Kibana 실행 포트를 변경하려면:
      server.port: 5601
      
  • Dev Tools 주요 기능
    기능 설명
    쿼리 자동 완성 API 호출 시 자동 완성 기능 제공
    호스트 경로 자동 적용 기본적으로 http://localhost:9200를 사용
    curl 명령 복사 기능 입력한 명령을 curl 명령어로 변환 가능

REST API를 활용한 Elasticsearch 데이터 조작

작업 HTTP 메서드 예제
문서 생성/업데이트 PUT PUT http://localhost:9200/index/_doc/1 -d '{"name":"kim", "age":38}'
문서 조회 GET GET http://localhost:9200/index/_doc/1
문서 삭제 DELETE DELETE http://localhost:9200/index/_doc/1
검색(Query DSL 사용) POST POST http://localhost:9200/index/_search -d '{"query": {"match": {"name": "kim"}}}'

추가적으로 알아야 할 내용

개념 설명
Index 관계형 DB의 "테이블" 개념
Document 하나의 데이터 레코드 (JSON 형식)
Shard & Replica 데이터를 분산 저장하고 백업하는 구조
Query DSL Elasticsearch의 강력한 검색 기능을 지원하는 JSON 기반의 질의 언어

정리

  • Elasticsearch는 HTTP REST API를 활용하여 데이터를 관리합니다.
  • RESTFul 방식을 사용하여 단일 URL과 HTTP 메서드(GET, PUT, DELETE 등)로 요청을 처리합니다.
  • curl 명령어를 이용하여 쉽게 API 요청을 보낼 수 있습니다.
  • Kibana Dev Tools를 활용하면 REST API 호출을 간편하게 실행할 수 있습니다.
  • 문서 조회, 생성, 수정, 삭제 등의 작업은 REST API를 통해 JSON 기반으로 수행됩니다.

 

+ Recent posts