<aside> 💡

통합 인덱스 + SpringBoot(JPA)로 ES API 호출

</aside>

[1] 개요

이번 장에서는 전 장에서 배운 ES의 기능들을 통합하여 “한국어, 영어, 한국어+영어” 종류별로 하나의 인덱스, 하나의 조회 쿼리를 만들어 볼 것이다.

그리고 서비스를 만들어 Spring Data Elasticsearch 로 ES API 호출을 직접해보고, ES를 사용해야하는 이유 에 대해서 정리할 것이다.

마지막으로 MySQL vs ES vs PgSQL 을 비교 분석을 끝으로 ES의 대장정을 마칠 것이다.

(1) 지금까지 실습한 검색 기능 목록

기능명 설명
shoud match_phrase, match 둘 다 시도
match 단어들이 분리되어도 검색됨.
match_phrase 정확히 일치하는 문장 검색.
fuzzy 오타 교정 기능 (예: “인공지늉” → “인공지능”).
highlight 검색어를 <mark>로 하이라이팅.
boost 특정 조건에 점수 가중치 부여.
통합 쿼리 설계 다양한 쿼리 방식(should + filter + sort 등) 한 번에 구성
autocomplete prefix 기반 추천어 자동완성.
자동완성 추천어 Completion + 검색 로그 기반 추천어 노출
인기 검색어 집계 Aggregation으로 최근 N일 간 검색어 top 10 추출.
suggest Elasticsearch의 completion suggester 기반 자동완성.
불용어/조사 문제 해결 nori_tokenizer + mixed + 전처리
Kibana 시각화 검색 로그 기반 대시보드 구축

[2] 전체 기능을 포함한 통합 인덱스 설계

(1) 한국어 전용 통합 인덱스 설계

1) 인덱스

  1. 인덱스 설계

    PUT /articles_ko
    {
      "settings": {
        "analysis": {
          "tokenizer": {
            "nori_edge_tokenizer": {
              "type": "nori_tokenizer",
              "decompound_mode": "mixed"
            },
            "ko_edge_ngram_tokenizer": {
              "type": "edge_ngram",
              "min_gram": 1,
              "max_gram": 20,
              "token_chars": ["letter", "digit", "whitespace"]
            }
          },
          "analyzer": {
            "ko_search_analyzer": {
              "type": "custom",
              "tokenizer": "nori_edge_tokenizer",
              "filter": ["lowercase"]
            },
            "ko_autocomplete_analyzer": {
              "type": "custom",
              "tokenizer": "ko_edge_ngram_tokenizer",
              "filter": ["lowercase"]
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "title": {
            "type": "text",
            "analyzer": "ko_search_analyzer",
            "fields": {
              "autocomplete": {
                "type": "text",
                "analyzer": "ko_autocomplete_analyzer",
                "search_analyzer": "standard"
              },
              "keyword": { "type": "keyword" }
            }
          },
          "content": {
            "type": "text",
            "analyzer": "ko_search_analyzer"
          },
          "case_number": {
            "type": "integer"
          },
          "timestamp": {
            "type": "date"
          }
        }
      }
    }
    
  2. 인덱스 분석

  3. 샘플 데이터 삽입

    POST /articles_ko/_bulk
    { "index": {} }
    { "title": "인공지능의 미래", "content": "이 기술은 다양한 산업에 적용된다.", "case_number": 1, "timestamp": "2025-03-25T08:00:00+09:00" }
    { "index": {} }
    { "title": "기술의 발전", "content": "인공지능은 미래 사회를 변화시킬 것이다.", "case_number": 2, "timestamp": "2025-03-24T10:00:00+09:00" }
    { "index": {} }
    { "title": "로봇 산업", "content": "기술 발전에 따라 로봇과 인공지능이 융합되고 있다.", "case_number": 3, "timestamp": "2025-03-23T09:00:00+09:00" }
    

2) 데이터 조회 쿼리

  1. 데이터 조회 쿼리

    GET /articles_ko/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "multi_match": {
                "query": "인공지능의 미래",
                "type": "phrase",
                "fields": ["title^2", "content"]
              }
            },
            {
              "multi_match": {
                "query": "인공지능의 미래",
                "fields": ["title^2", "content"]
              }
            }
          ],
          "filter": [
            { "range": { "case_number": { "gte": 1, "lte": 100 } } }
          ],
          "must_not": [
            {
              "match": {
                "content": "로봇"
              }
            }
          ]
        }
      },
      "highlight": {
        "fields": {
          "title": {},
          "content": {}
        },
        "pre_tags": ["<mark>"],
        "post_tags": ["</mark>"]
      },
      "sort": [
        { "case_number": "desc" }
      ],
      "from": 0,
      "size": 5
    }
    

3) 데이터 조회 결과

{
  "took": 42,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": null,
    "hits": [
      {
        "_index": "articles_ko",
        "_id": "DHeH2pUBeb73f_H6EnPD",
        "_score": null,
        "_source": {
          "title": "기술의 발전",
          "content": "인공지능은 미래 사회를 변화시킬 것이다.",
          "case_number": 2,
          "timestamp": "2025-03-24T10:00:00+09:00"
        },
        "highlight": {
          "title": [
            "기술<mark>의</mark> 발전"
          ],
          "content": [
            "<mark>인공지능</mark>은 <mark>미래</mark> 사회를 변화시킬 것이다."
          ]
        },
        "sort": [
          2
        ]
      },
      {
        "_index": "articles_ko",
        "_id": "C3eH2pUBeb73f_H6EnPD",
        "_score": null,
        "_source": {
          "title": "인공지능의 미래",
          "content": "이 기술은 다양한 산업에 적용된다.",
          "case_number": 1,
          "timestamp": "2025-03-25T08:00:00+09:00"
        },
        "highlight": {
          "title": [
            "<mark>인공</mark><mark>지능</mark><mark>의</mark> <mark>미래</mark>"
          ]
        },
        "sort": [
          1
        ]
      }
    ]
  }
}

(2) 영어 전용 통합 인덱스 설계

1) 인덱스