<aside> 💡
통합 인덱스 + SpringBoot(JPA)로 ES API 호출
</aside>
이번 장에서는 전 장에서 배운 ES의 기능들을 통합하여 “한국어, 영어, 한국어+영어” 종류별로 하나의 인덱스, 하나의 조회 쿼리를 만들어 볼 것이다.
그리고 서비스를 만들어 Spring Data Elasticsearch 로 ES API 호출을 직접해보고, ES를 사용해야하는 이유 에 대해서 정리할 것이다.
마지막으로 MySQL vs ES vs PgSQL 을 비교 분석을 끝으로 ES의 대장정을 마칠 것이다.
| 기능명 | 설명 |
|---|---|
| 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 시각화 | 검색 로그 기반 대시보드 구축 |
인덱스 설계
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"
}
}
}
}
인덱스 분석
전체 구성 요약
| 요소 | 역할 |
|---|---|
| nori_edge_tokenizer | Nori 형태소 분석기 (decompound_mode: mixed) – 문법적으로 쪼갬 |
| ko_edge_ngram_tokenizer | edge_ngram – 자동완성용 접두어 토크나이징 |
| ko_search_analyzer | 본문 검색용 분석기 (nori + lowercase) |
| ko_autocomplete_analyzer | 자동완성용 분석기 (edge_ngram + lowercase) |
필드별 설명
| 필드명 | 타입 | 설명 |
|---|---|---|
| title | text | 제목 (Nori 기반 검색) |
| title.autocomplete | text | 자동완성용 edge_ngram 분석기 적용 |
| title.keyword | keyword | 정렬/집계용 |
| content | text | 본문 내용 (Nori 기반 검색) |
| case_number | integer | 필터 또는 정렬용 숫자 필드 |
| timestamp | date | 최근 일주일 인기 검색어 집계에 사용 가능 |
샘플 데이터 삽입
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" }
데이터 조회 쿼리
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
}
설명표
| 기능 | 설명 |
|---|---|
| should | match_phrase, match 둘 다 시도해서 연관도 높은 문서 검색 |
| multi_match + phrase | 정확한 문장 우선 일치 |
| fallback multi_match | 일반 match 검색 |
| boost (title^2) | 제목 필드 가중치 부여 |
| filter + range | 숫자 범위 필터링(case_number가 1~100 사이의 문서만 포함) |
| highlight | 검색어 키워드를 <mark> 로 감싸서 강조 |
| sort | 최신 case_number 기준 정렬 |
| from/size | 페이지네이션 |
| must_not | “로봇” 이 포함된 문서는 제외 |
{
"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
]
}
]
}
}