🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

ElasticSearch 핵심 개념 완벽 정리 - 슬라이드 1/13
A

AI Generated

2025. 11. 1. · 19 Views

ElasticSearch 핵심 개념 완벽 정리

ElasticSearch의 핵심 개념과 실무 활용법을 다룹니다. 인덱싱, 검색, 집계 등 주요 기능을 코드 예제와 함께 학습할 수 있습니다.


카테고리:Python
언어:Python
메인 태그:#ElasticSearch
서브 태그:
#Indexing#Search#Aggregation#QueryDSL

들어가며

이 글에서는 ElasticSearch 핵심 개념 완벽 정리에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 기본_인덱스_생성
  2. 문서_추가하기
  3. 전문_검색_쿼리
  4. 복합_Bool_쿼리
  5. 범위_검색
  6. 집계_통계_분석
  7. 벌크_작업
  8. 문서_업데이트
  9. 퍼지_검색
  10. 하이라이팅
  11. 멀티_필드_검색
  12. 정렬과_페이징

1. 기본 인덱스 생성

개요

ElasticSearch에서 인덱스를 생성하고 매핑을 정의하는 방법입니다. 인덱스는 RDB의 데이터베이스와 유사한 개념입니다.

코드 예제

from elasticsearch import Elasticsearch

es = Elasticsearch(['localhost:9200'])

index_body = {
    "mappings": {
        "properties": {
            "title": {"type": "text"},
            "price": {"type": "integer"}
        }
    }
}
es.indices.create(index='products', body=index_body)

설명

Elasticsearch 클라이언트를 생성하고, 텍스트와 정수 필드를 가진 products 인덱스를 생성합니다.


2. 문서 추가하기

개요

인덱스에 문서를 추가하는 방법입니다. 문서는 JSON 형태로 저장되며 자동으로 ID가 부여됩니다.

코드 예제

document = {
    "title": "MacBook Pro 16",
    "price": 2500000,
    "category": "laptop"
}

result = es.index(
    index='products',
    body=document
)
print(f"Document ID: {result['_id']}")

설명

JSON 형태의 문서를 products 인덱스에 추가하고, 생성된 문서의 ID를 반환합니다.


3. 전문 검색 쿼리

개요

Match 쿼리를 사용한 전문 검색입니다. 텍스트 필드에서 형태소 분석을 통해 관련 문서를 찾습니다.

코드 예제

query = {
    "query": {
        "match": {
            "title": "MacBook"
        }
    }
}

results = es.search(index='products', body=query)

for hit in results['hits']['hits']:
    print(f"{hit['_source']['title']} - {hit['_score']}")

설명

title 필드에서 "MacBook"을 포함하는 문서를 검색하고, 관련도 점수와 함께 결과를 출력합니다.


4. 복합 Bool 쿼리

개요

Bool 쿼리로 여러 조건을 조합합니다. must, should, filter, must_not을 사용해 복잡한 검색이 가능합니다.

코드 예제

query = {
    "query": {
        "bool": {
            "must": {"match": {"category": "laptop"}},
            "filter": {"range": {"price": {"gte": 1000000, "lte": 3000000}}},
            "should": {"match": {"title": "Pro"}}
        }
    }
}

results = es.search(index='products', body=query)

설명

카테고리가 laptop이고 가격이 100만원~300만원 사이인 제품을 검색하며, "Pro"가 포함되면 우선순위를 높입니다.


5. 범위 검색

개요

Range 쿼리로 숫자나 날짜 범위를 지정하여 검색합니다. gte(이상), lte(이하), gt(초과), lt(미만)을 사용합니다.

코드 예제

query = {
    "query": {
        "range": {
            "price": {
                "gte": 1500000,
                "lt": 2000000
            }
        }
    }
}

results = es.search(index='products', body=query)
print(f"Found {results['hits']['total']['value']} products")

설명

가격이 150만원 이상 200만원 미만인 제품을 검색하고, 검색된 문서의 총 개수를 출력합니다.


6. 집계 통계 분석

개요

Aggregation을 사용해 데이터 분석 및 통계를 생성합니다. 카테고리별 문서 수와 평균 가격을 계산합니다.

코드 예제

query = {
    "size": 0,
    "aggs": {
        "category_stats": {
            "terms": {"field": "category.keyword"},
            "aggs": {
                "avg_price": {"avg": {"field": "price"}}
            }
        }
    }
}

results = es.search(index='products', body=query)

설명

카테고리별로 문서를 그룹화하고, 각 카테고리의 평균 가격을 계산합니다. size:0으로 문서는 반환하지 않습니다.


7. 벌크 작업

개요

Bulk API로 여러 문서를 한 번에 처리합니다. 대량의 데이터를 효율적으로 색인할 수 있습니다.

코드 예제

from elasticsearch.helpers import bulk

actions = [
    {"_index": "products", "_source": {"title": "iPhone 15", "price": 1200000}},
    {"_index": "products", "_source": {"title": "Galaxy S24", "price": 1100000}},
    {"_index": "products", "_source": {"title": "iPad Pro", "price": 950000}}
]

success, failed = bulk(es, actions)
print(f"Success: {success}, Failed: {failed}")

설명

여러 문서를 배열로 준비하고 bulk 함수로 한 번에 색인하여, 네트워크 오버헤드를 줄입니다.


8. 문서 업데이트

개요

기존 문서의 일부 필드만 수정합니다. script를 사용하면 필드 값을 계산하여 업데이트할 수 있습니다.

코드 예제

es.update(
    index='products',
    id='document_id_here',
    body={
        "script": {
            "source": "ctx._source.price *= params.multiplier",
            "params": {"multiplier": 1.1}
        }
    }
)

설명

지정된 문서의 가격을 10% 인상합니다. ctx._source로 현재 문서에 접근하고 스크립트로 값을 변경합니다.


9. 퍼지 검색

개요

Fuzzy 쿼리로 오타나 유사한 단어를 포함하는 문서를 찾습니다. 편집 거리 기반으로 검색합니다.

코드 예제

query = {
    "query": {
        "fuzzy": {
            "title": {
                "value": "MacBok",
                "fuzziness": "AUTO"
            }
        }
    }
}

results = es.search(index='products', body=query)

설명

"MacBok"이라는 오타가 있어도 "MacBook"을 찾을 수 있습니다. fuzziness는 허용할 편집 거리를 지정합니다.


10. 하이라이팅

개요

검색 결과에서 매칭된 부분을 강조 표시합니다. 사용자에게 어떤 부분이 검색어와 일치하는지 보여줍니다.

코드 예제

query = {
    "query": {"match": {"title": "MacBook"}},
    "highlight": {
        "fields": {"title": {}},
        "pre_tags": ["<strong>"],
        "post_tags": ["</strong>"]
    }
}

results = es.search(index='products', body=query)
print(results['hits']['hits'][0]['highlight'])

설명

검색어와 일치하는 부분을 <strong> 태그로 감싸서 반환합니다. 검색 결과 UI에 활용할 수 있습니다.


11. 멀티 필드 검색

개요

Multi-match 쿼리로 여러 필드를 동시에 검색합니다. 각 필드에 가중치를 부여할 수 있습니다.

코드 예제

query = {
    "query": {
        "multi_match": {
            "query": "laptop",
            "fields": ["title^2", "category", "description"],
            "type": "best_fields"
        }
    }
}

results = es.search(index='products', body=query)

설명

title, category, description 필드에서 "laptop"을 검색하며, title 필드에 2배의 가중치를 부여합니다.


12. 정렬과 페이징

개요

검색 결과를 정렬하고 페이징 처리합니다. from과 size로 페이지네이션을 구현합니다.

코드 예제

query = {
    "query": {"match_all": {}},
    "sort": [{"price": {"order": "desc"}}],
    "from": 0,
    "size": 10
}

results = es.search(index='products', body=query)

for hit in results['hits']['hits']:
    print(f"{hit['_source']['title']}: {hit['_source']['price']}원")

설명

모든 문서를 가격 내림차순으로 정렬하고, 첫 10개 문서만 반환합니다. from 값으로 다음 페이지를 요청할 수 있습니다.


마치며

이번 글에서는 ElasticSearch 핵심 개념 완벽 정리에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#ElasticSearch #Indexing #Search #Aggregation #QueryDSL

#ElasticSearch#Indexing#Search#Aggregation#QueryDSL#Python

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.