색인(Indexing)이란?

📌 Elasticsearch에서 색인(Indexing)은 데이터를 저장하고 검색할 수 있도록 변환하는 과정입니다.

  • RDBMS의 "INSERT"와 유사하지만, 단순 저장이 아닌 역색인(Inverted Index) 구조를 사용하여 빠른 검색을 지원.
  • 모든 데이터는 JSON 문서(Document) 형태로 저장됨.
  • 색인된 데이터는 샤드(Shard) 단위로 분산 저장됨.

문서 색인 (PUT /index/_doc/1)

Elasticsearch에서 데이터를 저장하는 기본 단위는 **문서(Document)**이며, JSON 형식으로 저장됩니다.

(1) 문서 색인 예제 (PUT)

PUT /products/_doc/1
{
  "name": "Elasticsearch 책",
  "category": "IT",
  "price": 30000,
  "stock": true,
  "release_date": "2023-06-01"
}

✅ products 인덱스에 ID가 1인 문서를 색인.


문서 검색 (GET /index/_search)

색인된 문서는 다양한 쿼리를 사용하여 검색할 수 있습니다.

(1) 전체 문서 검색

GET /products/_search

✅ products 인덱스의 모든 문서 검색.


(2) 특정 필드 검색 (Match Query)

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

"name" 필드에 "Elasticsearch"라는 단어가 포함된 문서 검색 (형태소 분석 적용).


(3) 정확한 단어 검색 (Term Query)

GET /products/_search
{
  "query": {
    "term": {
      "category": "IT"
    }
  }
}

✅ "category" 필드는 keyword 타입이므로 정확히 "IT"와 일치하는 문서만 반환.


(4) 여러 조건 검색 (Bool Query)

GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "Elasticsearch" } },
        { "term": { "category": "IT" } }
      ],
      "filter": [
        { "range": { "price": { "gte": 20000, "lte": 40000 } } }
      ]
    }
  }
}

bool 쿼리를 사용하여 여러 조건을 결합하여 검색 가능

  • "must" → 모든 조건을 만족하는 문서 반환.
  • "filter" → 가격이 20,000 ~ 40,000 사이인 문서 필터링 (랭킹 영향 없음).

문서 업데이트 및 삭제

색인된 문서는 업데이트(Update) 또는 삭제(Delete) 할 수 있습니다.

(1) 문서 업데이트 (POST /_update)

POST /products/_update/1
{
  "doc": {
    "price": 28000
  }
}

ID가 1인 문서의 price 값을 28000으로 변경.


(2) 여러 필드 업데이트

POST /products/_update/1
{
  "doc": {
    "price": 28000,
    "stock": false
  }
}

여러 필드를 동시에 업데이트 가능.


(3) 문서 삭제 (DELETE /_doc/1)

DELETE /products/_doc/1

ID가 1인 문서를 삭제.


Match, Term, Bool Query 기본 사용법

Elasticsearch에서는 다양한 검색 쿼리를 지원하며, 가장 기본적인 검색 방법은 다음과 같습니다.

(1) Match Query (전문 검색)

  • 텍스트 필드(text 타입)에 대해 형태소 분석을 수행한 후 검색.
  • 자연어 검색에 적합.
GET /products/_search
{
  "query": {
    "match": {
      "name": "Elasticsearch 책"
    }
  }
}

✅ "name" 필드에서 "Elasticsearch 책"과 관련된 문서를 검색.


(2) Term Query (정확한 값 검색)

  • keyword, integer, boolean 필드에 대해 정확한 일치 검색 수행.
  • 형태소 분석을 적용하지 않음.
GET /products/_search
{
  "query": {
    "term": {
      "category": "IT"
    }
  }
}

✅ "category" 필드 값이 정확히 "IT"인 문서만 검색.


(3) Bool Query (복합 검색)

  • 여러 개의 검색 조건을 조합할 때 사용.
  • must, should, must_not, filter 조건을 조합 가능.
GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "Elasticsearch" } },
        { "term": { "category": "IT" } }
      ],
      "must_not": [
        { "term": { "stock": false } }
      ],
      "filter": [
        { "range": { "price": { "gte": 20000, "lte": 50000 } } }
      ]
    }
  }
}

검색 조건 조합

  • "must" → name에 "Elasticsearch"가 포함되고, category가 "IT"인 문서.
  • "must_not" → stock이 false인 문서는 제외.
  • "filter" → 가격이 20,000 ~ 50,000 사이인 문서만 포함.

색인, 검색, 업데이트, 삭제 정리

연산 HTTP 메서드 예제
문서 색인 (저장) PUT PUT /products/_doc/1
전체 문서 검색 GET GET /products/_search
조건 검색 GET GET /products/_search { "query": { "match": { "name": "Elasticsearch" } } }
문서 업데이트 POST POST /products/_update/1 { "doc": { "price": 28000 } }
문서 삭제 DELETE DELETE /products/_doc/1

결론

  1. 색인(Indexing)은 데이터를 저장하는 과정이며, JSON 문서 형태로 저장됨.
  2. 문서 검색은 _search API를 사용하며, 다양한 쿼리(Query DSL)를 활용 가능.
  3. Match Query(전문 검색), Term Query(정확한 검색), Bool Query(복합 검색) 등 기본적인 검색 방식 제공.
  4. 업데이트 및 삭제 API를 사용하여 문서를 수정 또는 제거 가능.

 

+ Recent posts