Elasticsearch의 검색기능이 좋은 점이 뭘까?

 

Mysql로도 충분히 검색 기능을 구현할 수 있다. 하지만 Elasticseach를 활용하면 더욱 사용자를 위한 검색 기능을 구현할 수 있다. 

어떤 장점이 있길래 Elasticsearch를 고려하게 되는걸까? 

  • 검색어의 순서가 바꿔어도 검색 가능
  • 기호,부호가 포함되지 않게 검색 가능 
  • 대소문자 고려하지 않고 검색 가능 
  • 동의어를 고려한 검색 가능 
  • 중요하지 않은 문자 제외 후 검색 가능

위 같은 검색 기능을 편하게 제공해주니까 충분히 일단 RDBMS보다 검색 기능 구현시 Elasticsearch를 고려할 만 하다. 

 

 

 

 Elasticsearch의 검색기능을 제공하는 원리 

Elasticsearch는 저장할 때 문자열을 토큰으로 분리해 역인덱스(Inverted Index)로 저장한다. (text타입만 가능)

역색인 (Inverted Index)

Elasticsearch가 빠르게 텍스트를 검색할 수 있는 핵심 구조이다. 

일반적으로 문서 -> 단어 구조지만, 역색인은 단어 -> 문서 리스트 구조이기 때문

 

Lucene 엔진

Elasticsearch는 내부적으로 Lucene을 기반으로 동작하며, 색인 저장, 검색 쿼리 처리,

점수 계산 등을 실제로 수행하는 역할은 Lucene이 함.

 

즉, 문서를 저장하면 Analyzer가 텍스트를 단어 단위로 분석하고, Lucene이 이를 역색인 구조로 저장한다.

이 구조 덕분에 빠른 검색이 가능하다.

 

 

https://velog.io/@koo8624/Database-Elastic-Search-1%ED%8E%B8-%EC%97%AD%EC%83%89%EC%9D%B8Inverted-Index%EA%B3%BC-%ED%98%95%ED%83%9C%EC%86%8C-%EB%B6%84%EC%84%9D

 

 

 

 

 

 

 Elasticsearch 대략적인 score 계산 로직은?

 

역색인 구조로 검색 되는데 만약 검색어가 들어오면 어떤 방식으로 상관관계가 높다고 판단하는지 대략적으로 정리해보자!!

 

Term Frequency (TF)

- 문서 내에서 검색어가 얼마나 자주 등장하냐 

 

Inverse  Document Frequency (IDF)

- 검색어가 전체 문서 중 얼마나 희귀하냐 

 

Field Length Normalization

-문자(필드)가 짧을수록 관련도 상승

 

 

참고 이런 작동 구조는 데이터 타입 text에 한정

 

 

 

✅ 애널라이저(Analyzer)란?

 

문자열(text) 토큰으로 변환시켜 주는 장치를 보고 애널라이저(analyzer)라고 부른다. 

 

애널라이저 과정

3가지 과정이 존재한다. 

캐릭터 필터(character filter), 토크나이저(tokenizer), 토큰 필터(token filter)

 

 

캐릭터 필터(character filter)

캐릭터 필터(character filter)는 문자열을 토큰으로 자르기 전에 문자열을 다듬는 역할을 한다.
다양한 종류의 필터가 존재하며, 여러 개의 필터를 적용시킬 수 있다.

mapping 필터, pattern replace 필터 등이 존재


ex)
예시 <h1>아이폰 15 사용 후기</h1> → 아이폰 15 사용 후기

 

 

토크나이저(tokenizer)

토크나이저(tokenizer)는 문자열을 토큰으로 자르는 역할을 한다. (공백 또는 . , ! ? 와 같은 문장 부호를 기준으로 자른다.)

classic 토크나이저, keyword 토크나이저, pattern 토크나이저 등 존재 

ex)
The Brown-Foxes jumped over the roof.
-> [The, Brown, Foxes, jumped, over, the, roof]

 

 

토큰 필터(token filter)

 

최종적으로 다듬는다.  여러개 적용 가능

lowercase, stop 필터, stemmer 필터 

ex)
소문자 변환, 의미 없는 단어 제거(a, the, is 등), 단어의 원래 형태(ing -> 기본형)

 

 

 

✅ standard Analyzer

Elasticsearch의 기본 Analyzer를 보면서 전반적인 구조를 이해해보자!
애널라이저는 3가지로 구성됨 

standard Analyzer는 charcater filter는 설정되어 있지 않고, tokenizer는 standard로 설정되어 있고, token filter는 lowercase인 애널라이저를 뜻한다. 

 

standard analyzer 표현 방식 (방법 1 = 방법 2 )

// 방법 1
"analyzer": "standard"

// 방법 2
"char_filter": [], 
"tokenizer": "standard", 
"filter": ["lowercase"]

 

캐릭터 필터는 없고, 토크나이저는 standard 이므로 공백  , . ! ? 와 같은 문장 부호를 기준으로 문자열을 자름 

토큰 필터는 소문자 변환으로 해석 가능하다. 

 

 

Apple 2025 맥북 에어 13 M4 10코어 문자열을 analyzer standard를 적용해서 확인해봤다. 

 

Apple -> apple  소문자 변환, 공백 기준으로 토큰 필터 적용 확인 가능하다. 

// 어떻게 analyzer가 텍스트를 나누는지 확인 가능한 문법이다. 
GET /_analyze 
{
    "text":"Apple 2025 맥북 에어 13 M4 10코어",
    "analyzer":"standard"
}

 

결과 : 

{
  "tokens": [
    {
      "token": "apple",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "2025",
      "start_offset": 6,
      "end_offset": 10,
      "type": "<NUM>",
      "position": 1
    },
    {
      "token": "맥북",
      "start_offset": 11,
      "end_offset": 13,
      "type": "<HANGUL>",
      "position": 2
    },
    {
      "token": "에어",
      "start_offset": 14,
      "end_offset": 16,
      "type": "<HANGUL>",
      "position": 3
    },
    {
      "token": "13",
      "start_offset": 17,
      "end_offset": 19,
      "type": "<NUM>",
      "position": 4
    },
    {
      "token": "m4",
      "start_offset": 20,
      "end_offset": 22,
      "type": "<ALPHANUM>",
      "position": 5
    },
    {
      "token": "10코어",
      "start_offset": 23,
      "end_offset": 27,
      "type": "<ALPHANUM>",
      "position": 6
    }
  ]
}

 

 

 

✅ 실질적인 실습을 통해서 알아보자

토큰을 어떻게 나누는지 확인하는법 

// 방법 1 
GET /_analyze
{
  "text": "Apple 2025 맥북 에어 13 M4 10코어",
  "analyzer": "standard"
}

// 방법 2
GET /_analyze
{
  "text": "Apple 2025 맥북 에어 13 M4 10코어",
  "char_filter": [],
  "tokenizer": "standard",
  "filter": ["lowercase"]
}

 

 

 

테스트 해보기!

인덱스 생성 + 매핑 정의 + Custom Analyzer 적용해보자! 

// 기존 인덱스 삭제
DELETE /products

// 인덱스 생성 + 매핑 정의 + Custom Analyzer 적용
PUT /products
{
  "settings": {
    "analysis": {
      "analyzer": {
        "products_name_analyzer": {
          "char_filter": [],
          "tokenizer": "standard",
          "filter": []
        }
      }
    }
  },
  "mappings": {
	  "properties": {
	    "name": {
	      "type": "text",
	      "analyzer": "products_name_analyzer"
	    }
	  }
	}
}

// 잘 생성됐는 지 확인
GET /products

POST /products/_create/1
{
  "name": "Apple 2025 맥북 에어 13 M4 10코어"
}

 

자 standard와 다르게 토큰 필터(lowercase)가 없다 

 

이제 apple로 검색해도 아무것도 안 나온다. 

GET /products/_search
{
  "query": {
    "match": {
      "name": "apple"
    }
  }
}

 

정확하게 Apple로 검색하면 나온다.

GET /products/_search
{
  "query": {
    "match": {
      "name": "Apple"
    }
  }
}

 

어떻게 적용 됐는지 확인하고 싶다면

// 특정 인덱스의 필드에 적용된 Analyzer를 활용해 분석
GET /products/_analyze
{
  "field": "name"
  "text": "Apple 2025 맥북 에어 13 M4 10코어"
}

 

-> 우리가 기본적인 필터에서 커스텀 필터로 바꾸고 lowercase를 빼니까 이제 대소문자를 구분한다! 

 

 

html_strip(태그 제거), stop(a an the or 등 제거), stemmer(영단어 기본형으로), synonym(동의어)

 

등의 기능도 있는데 이건 찾아서 학습하도록 하자! 

 

 

 정리 

Elasticsearch 검색 기능을 제공할 때 어떻게 동작하는지 원리를 파악하였고, 구체적인  필터 적용 방법도 배웠다.

실습 내용을 더 추가할 수 있지만 스스로 검색해서 적용하는게 효율적일 듯 해서 뺐다.

 

 

 

 참고

 

 

https://velog.io/@koo8624/Database-Elastic-Search-1%ED%8E%B8-%EC%97%AD%EC%83%89%EC%9D%B8Inverted-Index%EA%B3%BC-%ED%98%95%ED%83%9C%EC%86%8C-%EB%B6%84%EC%84%9D

 

[Elasticsearch] 역색인(Inverted Index)과 형태소 분석

Elasticsearch는 Apache Lucene 기반의 오픈소스 실시간 분산 검색 엔진이다. Apache Lucene은 내부적으로 Inverted File Index를 활용하여 색인 구조를 생성한다. 이를 기반으로 하는 Elasticsearch 또한 동일한 방식

velog.io

https://rebugs.tistory.com/883


 

 

 

✅ Elasticsearch SpringBoot 설정을 위한 기본 설정 

InteliJ, JDK, Elasticsearch, kibana 가 세팅된 상태에서 RestAPI를 호출하게 jar로 프로젝트를 만들고 기본적인 기능을 사용한다.

 

필요한 의존성과 제공 기능 설명

spring-boot-devtools

  • 코드가 변경될 때 자동으로 애플리케이션을 다시 시작
  • 브라우저로 전송되는 리소스가 변경될 때 자동으로 브라우저를 새로고침 
  • 탬플릿 캐시를 자동으로 비활성화 
  • 만일 H2 데이터베이스가 사용 중이라면 자도응로 H2콘솔을 활성화 

spring-boot-starter-web

  • springMVC
  • Tomcat
  • Jackson
  • Validation
  • logback

spring-boot-starter-data-elasticsearch (이번 프로젝트의 핵심 의존성이다!)

Elasticsearch Repository 지원 : CrudRepository, ElasticsearchRepository 등 JPA처럼 사용 가능

자동 설정 : Elasticsearch 클라이언트, 연결 설정 등을 Spring Boot에서 자동 구성

Elasticsearch RestHighLevelClient 또는 새로운 Java API 지원 : 버전에 따라 적절한 클라이언트 구성

Elasticsearch와 통신 : 검색/저장/삭제 등 문서 단위 데이터 처리 지원

 

 

 

 

✅API에서 요청후  Elasticsearch에 접근해서 데이터 CRUD

기본적으로 CRUD를 구현해본 결과 JPA와 비슷하다는 느낌을 받았다. 

 

도큐먼트 애너테이션이 붙은 클래스에 해당하는 인덱스는 없으면 애플리케이션 실행시 만들어준다.

도큐먼트 클래스를 만든다. 

 

package com.example.elesticsearchbookcrud;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * 이 클래스는 Elasticsearch 인덱스에 저장될 도큐먼트를 정의합니다.
 * Spring Data Elasticsearch에서 이 클래스는 하나의 문서(Document)로 간주됩니다.
 * 없으면 인덱스를 만든다!!!!!!!
 */
@Document(indexName = "books") // Elasticsearch에서 사용할 인덱스 이름 지정
public class BookDocument {

    @Id // Elasticsearch에서 사용할 문서의 고유 ID
    private String id;

    @Field(type = FieldType.Keyword) 
    // 'bookName' 필드를 Elasticsearch의 Keyword 타입으로 설정 (정확히 일치하는 값으로 검색할 때 사용)
    private String bookName;

    @Field(type = FieldType.Long)
    // 'price' 필드를 Elasticsearch의 Long 타입으로 설정 (숫자 기반 검색/정렬에 유리)
    private Long price;

    // 생성자 - 모든 필드를 초기화
    public BookDocument(String id, String bookName, Long price) {
        this.id = id;
        this.bookName = bookName;
        this.price = price;
    }

    // Getter 및 Setter 메서드 추가 
    ......

}

 

 

 

기본 CRUD요청을 받는 Controller

package com.example.elesticsearchbookcrud;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("books")
public class BookController {

    private BookRepository bookRepository;

    public BookController(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    @PostMapping
    public BookDocument createBook(@RequestBody BookCreateRequestDto requestDto) {
        return  bookRepository.save(new BookDocument(
                requestDto.getId(),
                requestDto.getBookName(),
                requestDto.getPrice()
        ));

    }


    @GetMapping()
    public Page<BookDocument> listBooks(){
        return bookRepository.findAll(PageRequest.of(0, 10));
    }

    @GetMapping("/{id}")
    public BookDocument selectBook(@PathVariable String id){
        return bookRepository.findById(id).orElseThrow(() -> new RuntimeException("없습니다. "));
    }


    @PutMapping("/{id}")
    public BookDocument updateBook(@PathVariable String id, @RequestBody BookUpdateRequestDto requestDto) {
        BookDocument searchBook = bookRepository.findById(id).orElseThrow(() -> new RuntimeException("없습니다."));

        searchBook.setBookName(requestDto.getBookName());
        searchBook.setPrice(requestDto.getPrice());

        return bookRepository.save(searchBook);
    }

    @DeleteMapping("/{id}")
    public void deleteBook(@PathVariable String id) {
        BookDocument searchBook = bookRepository.findById(id).orElseThrow(() -> new RuntimeException("없습니다."));

        bookRepository.delete(searchBook);
    }


}

 

 

JPA와 매우 비슷하지만 import 문 자세히 보면 elasticsearch 관련 패키지에서 가져옴을 알 수 있다. 

package com.example.elesticsearchbookcrud;

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

/**
 * ElasticsearchRepository를 상속받아 BookDocument에 대한 CRUD 및 검색 기능을 제공하는 리포지토리입니다.
 * 
 * 첫 번째 제네릭: BookDocument - 관리할 도큐먼트 클래스
 * 두 번째 제네릭: String - 도큐먼트의 ID 타입
 * 
 * Spring Data Elasticsearch가 런타임에 이 인터페이스의 구현체를 자동으로 생성합니다.
 */
public interface BookRepository extends ElasticsearchRepository<BookDocument, String> {
    
    // 기본적으로 save(), findById(), deleteById(), findAll() 등의 CRUD 메서드를 사용할 수 있습니다.

    // 필요하다면 메서드 이름 기반 쿼리 정의도 가능:
    // 예: List<BookDocument> findByBookName(String bookName);
}

 

 

그 밖의 requestDto들도 만들었다. 

 

 

 

 

✅  정리 

JPA와 매우 비슷한 API를 제공해줌을 볼 수 있다. 또 @Document 애너테이션을 붙이면 없으면 인덱스를 만들어주고 있으면 사용하는 걸 확인 할 수 있다. 

 

'DB > Elasticsearch' 카테고리의 다른 글

Elasticsearch 기본 검색 기능 및 작동 원리  (1) 2025.06.08
Elasticsearch의 기본 개념  (0) 2025.05.25

 

 

✅ Elasticsearch란?

Elasticsearch는 텍스트 검색과 실시간 분석에 특화된 고속 데이터베이스다.
로그 분석, 검색 기능, 추천 시스템 등에서 널리 사용된다.

 

Elasticsearch는 대용량 데이터를 빠르게 검색하고 분석할 수 있게 도와주는 데이터베이스 시스템이에요.

보통 우리가 사용하는 MySQL이나 PostgreSQL 같은 데이터베이스는 정확한 값을 찾거나 저장할 때 강력하지만,

  • "이런 단어가 포함된 글을 찾아줘"

"이 제품에 대한 리뷰 중에서 긍정적인 내용을 분석해줘"

  • "로그 데이터 중에서 에러가 포함된 것만 모아줘"

같이 검색 중심 또는 로그 분석, 텍스트 분석 같은 작업에는 한계가 있다.

 

특징: 

검색 특화 단어 포함, 유사 단어, 오타까지도 잘 찾아냄 (ex. 구글 검색처럼)
빠른 속도 내부적으로 Inverted Index 구조를 사용해서 매우 빠른 검색 가능
확장성 수십억 건의 데이터를 여러 서버로 나눠 저장하고 분석할 수 있음
REST API 지원 HTTP 요청으로 데이터를 넣고, 검색하고, 수정할 수 있어서 프론트/백엔드 어디서든 쉽게 연동 가능
ELK Stack의 중심 Logstash(수집), Kibana(시각화)와 함께 로그 분석 시스템에 자주 사용됨

 

 

 

 

✅ Elasticsearch의 주요 활용 사례

최근 현업에서 Elasticsearch는 크게 2가지 용도로 사용된다. 


1.데이터 수집 및 분석 :Elasticsearch는 대규모 데이터(ex. 로그 등)를 수집 및 분석하는 데 최적화되어 있다. 주로 Elasticsearch(데이터 저장), Logstash(데이터 수집 및 가공), Kibana(데이터 시각화)를 같이 활용해 데이터를 수집 및 분석한다.

 

2.검색 최적화 : Elasticsearch는 데이터가 많더라도 뛰어난 검색 속도를 가지고 있고, 오타동의어를 고려해서 유연하게 검색할 수 있는 기능을 가지고 있다. (다른 대기업에서도 많이 사용 단 !네이버나 구글은 자체적인 검색 엔진을 구축해서 사용한다.)


 

 

✅ Elasticsearch 설치하기

도커는 설치됐다고 가정한다. 

 

compose.yml 파일 작성

services:
  elastic:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.17.4 # Elastic 8.17.4 버전의 이미지
    ports:
    - 9200:9200 # 9200번 포트에서 Elasticsearch 실행
    environment:
    # 아래 설정은 개발/테스트 환경에서 간단하게 테스트하기 위한 옵션 (운영 환경에서는 설정하면 안 됨)
    - discovery.type=single-node # 단일 노드 (지금은 알 필요 없음)
    - xpack.security.enabled=false # 보안 설정
    - xpack.security.http.ssl.enabled=false # 보안 설정

 

compose 실행

compose.yml 파일이 존재하는 경로에서 아래 명령어를 실행시켜야 함

# compose.yml 파일이 존재하는 경로에서 아래 명령어를 실행시켜야 함
docker compose up

 

  • 잘 실행됐는 지 확인하기
  • Elasticsearch는 9200번 포트에서 실행되므로 Postman에서 localhost:9200으로 요청을 보내보자. 아래와 같이 응답을 받았다면 정상적으로 잘 실행이 된 것이다.

Elasticsearch가 잘 작동하는 지 확인하는 용도로 호출

 

GET / : Elasticsearch 작동 여부 확인

 

 

 

 

 

 

✅ Elasticsearch 작동 방식 

elasticsearch의 동작 방식

RestAPI 방식으로 동작

데이터 베이스지만  RestAPI를 사용한다.
MySql은 SQL문으로 요청을 보내는 것과 다르게 RestAPI 방식으로 호출하면 응답을 얻을 수 있다!

 

Elasticsearch의 데이터 삽입 RestAPI 형식 

curl -X POST "localhost:9200/users/_doc" -H 'Content-Type: application/json' -d'
{
  "name": "Alice",
  "email": "alice@example.com"
}'

 

 

 

 

 

✅ Elasticsearch  GUI 툴  Kibana

MySQL은 관련 GUI툴로는 MySQL Workbench, Dbeaver 등 GUI툴이 있는 걸 알 것 이다. 

 

Elasticsearch GUI 툴 kibana

 


Kibana는 Elastic Stack의 중요한 구성 요소 중 하나로, 데이터 시각화 및 분석 도구이다. Elasticsearch에서 저장된 데이터를 쉽게 시각화 하고 탐색할 수 있는 웹 인터페이스를 제공한다. Kibana는 사용자가 Elasticsearch에 쿼리를 실행하고, 결과를 다양한 형태로 시각화 하여 분석할 수 있도록 도와준다. Kibana의 기능은 크게 세가지 정도로 분류될 수 있다.

Kibana를 포함한 구조


이전에 실행중이던 도커 콤포즈를 control + c 로 종료  vi compose.yml 입력  직전 내용 지우고 

compose.yml 변경
Elasticsearch와 kibana를 뛰우는 도커 컴포즈 명령어!

services:
  elastic:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.17.4 # 8.17.4 버전
    ports:
      - 9200:9200 # 9200번 포트에서 Elasticsearch 실행
    environment:
      # 아래 설정은 개발/테스트 환경에서 간단하게 테스트하기 위한 옵션 (운영 환경에서는 설정하면 안 됨)
      - discovery.type=single-node # 단일 노드 (지금은 알 필요 없음)
      - xpack.security.enabled=false # 보안 설정
      - xpack.security.http.ssl.enabled=false # 보안 설정
  kibana:
    image: docker.elastic.co/kibana/kibana:8.17.4 # 8.17.4 버전
    ports:
      - 5601:5601 # 5601번 포트에서 kibana 실행
    environment:
      - ELASTICSEARCH_HOSTS=http://elastic:9200 # kibana가 통신할 Elasticsearch 주소 알려주기


compose 실행

# compose.yml 파일이 존재하는 경로에서 아래 명령어를 실행시켜야 함
$ docker compose up -d # -d : 백그라운드에서 실행


http://localhost:5601 접속

url에 검색해보면 잘 나온다.

카테고리 탭 누르고 맨 밑에  Dev Tools 들어가보자!

키바나를 통해서 Postman으로 했던 요청을 보낸다.


키바나로 해서 Elasticsearch에 요청을 보내보자! 잘 동작한다. 

 

 

 

 

 

✅ Elasticsearch 의 기본 용어 정리(인덱스, 도큐먼트,  매핑, 필드)

MySQL과 Elasticsearch 둘다 데이터 베이스 이므로 이미 잘 아는 MySQL에서 모르는 Elasticsearch를 비교하면서 배워보자!

MySQL은 데이터베이스이다.

데이터를 저장/조회/수정/삭제할 수 있다.

데이터를 저장하기 위해 가장 먼저 테이블(table)을 만든다.

테이블을 만들 때 어떤 유형의 데이터를 넣을 지 스키마(schema)를 정의한다.

테이블의 컬럼(column)에 맞게 데이터를 저장한다.

 

Elasitcsearch도 데이터베이스다.

Elasticsearch에 데이터를 저장/조회/수정/삭제할 수 있다.

데이터를 저장하기 위해 가장 먼저 인덱스(index)를 만든다.

인덱스를 만들 때 **어떤 유형의 데이터를 넣을 지 매핑(mapping)**을 정의한다.

테이블의 필드(field)에 맞게 데이터를 저장한다.

 

어떤 단어가 같은 역할을 하는지 확인해보자!

MySQL Elasticsearch
테이블(table) 인덱스(index)
컬럼(column) 필드(field)
레코드(record), 로우(row) 도큐먼트(document)
스키마(schema) 매핑(mapping)

(두 개의 데이터베이스에서 인덱스는 완전 다른 개념이다.)

 

 

 

 

✅ 도큐먼트 저장, 조회, 수정, 삭제하기 

Elasticsearch의 검색에 최적화된 기능을 공부하기 전에 기본적인 기능들에 대해서 먼저 배우는게 맞을 것이다. 


PUT /users  ## 인덱스 생성 (mysql로 치면 테이블 생성)

GET /users ## 조회

GET /abc  ## 없는거 조회하면 index_not_found_exception

PUT /boards

GET /boards

DELETE /boards  ## 인덱스 삭제 

PUT /users/_mappings  ##  프로퍼티 정의 
{
    "properties":{
        "name":{"type" : "keyword"},
        "age": {"type" : "integer"},
        "is_active" : {"type" : "boolean"}
    }
}

POST /users/_doc ## 데이터 삽입
{
    "name":"Alice",
    "age":28,
    "is_active":true
}

POST /users/_doc ## 데이터 삽입
{
    "name":"Bob",
    "age":30,
    "is_active":false
}


GET /users/_search ## 조회  hits:검색결과    _id : Elasticsearch가 만들어준 랜덤 값,    _source: 우리가 넣은 데이터 

POST /users/_doc ## 데이터 삽입
{
    "name":"Jaeseong",
    "age":20,
    "is_active":false
}

GET /users/_search

POST /users/_create/1 ## _id를 직접 지정  ## 이미 있는데 삽입할 경우 version conflict
{
    "name":"jscode",
    "age":30,
    "is_active": true
}

GET /users/_search

PUT /users/_doc/2
{
    "name":"json",
    "age":30,
    "is_active": true
}

GET /users/_search


GET /users/_doc/2 ## 특정 도큐먼트(mysql의 row)를 조회


GET /users/_doc/1

PUT /users/_doc/1  ## 없으면 저장 있으면수정  ## 없는 값은 삭제됨 즉 name만 남음 
{
    "name":"new"
}

POST /users/_update/2
{
    "doc":{
        "age":10,
        "is_active":false
    }
}

GET /users/_doc/2


DELETE /users/_doc/2  ## 도큐먼트 지우는법 도큐먼트(=row)


대표 인덱스 users를 만들어서 진행했는데 추후에 필요에 따라서 다른 인덱스명으로 사용하면 될 것이다. 




✅  참고자료


박재성 - ElasticSearch 강의 

https://jscode.notion.site/GUI-Elasticsearch-feat-Kibana-1d111062ff078021842feb07236d0533

+ Recent posts