🗺️ Elasticsearch, 데이터의 바다에서 보물찾기
오늘 Elasticsearch를 이용해 거대한 데이터의 바다를 항해하는 법을 더 깊이 배웠다. 단순한 키워드 매칭을 넘어, 사용자의 숨은 의도까지 파악해내는 Query DSL과, 꼬불꼬불한 한글을 똑똑하게 알아듣게 만드는 텍스트 분석의 세계를 탐험했다. 마치 뛰어난 탐정이 되어 단서를 조합해 범인을 찾아내는 과정 같았다!
💡 “진정한 검색은, 찾는 것이 아니라 발견하는 것이다.”
데이터가 넘쳐나는 시대, 우리가 원하는 정보를 정확하고 빠르게 ‘발견’하게 해주는 Elasticsearch의 능력은 정말 강력한 무기다. 특히 그 핵심에는 오늘 배운 Query DSL과 분석기가 자리 잡고 있다.
✍️ 1. Query DSL: 질문의 기술
Elasticsearch에게 어떻게 질문하느냐에 따라 검색 결과의 질이 달라진다. Query DSL은 우리가 던지는 질문을 더욱 정교하고 섬세하게 만들어주는 도구다.
쿼리 종류 | 핵심 역할 | 사용 예시 |
---|---|---|
match |
단어 기반의 Full-text 검색 | “description”: “오늘 날씨 맑음” |
term |
정확한 값으로 필터링 (분석 X) | “status”: “published” |
bool |
여러 조건을 조합 (must, should 등) | state 는 PA 이면서 address 에 Avenue 는 없는 데이터 검색 |
// state가 "PA" 이면서, address에 "Avenue"가 포함되지 않은 사람 검색
GET test/_search
{
"query": {
"bool": {
"must": [
{ "match": { "state": "PA" } }
],
"must_not": [
{ "match": { "address": "Avenue" } }
]
}
}
}
bool
쿼리의must
,should
,filter
를 조합하면 정말 원하는 결과를 쏙쏙 뽑아낼 수 있다. 마치 레고 블록을 조립하는 기분! 🎉
🔬 2. 텍스트 분석: 언어의 해부학
text
타입의 데이터가 저장될 때, Elasticsearch는 그냥 저장하지 않는다. 분석기(Analyzer) 를 통해 단어를 잘게 쪼개고(토큰화), 다듬어서(필터링) 역인덱스에 보관한다. 이 과정 덕분에 우리는 빛의 속도로 검색 결과를 받아볼 수 있다.
- 캐릭터 필터: HTML 태그처럼 불필요한 옷을 벗겨내는 단계
- 토크나이저: 문장을 의미 있는 단어(토큰)로 쪼개는 단계
- 토큰 필터: 단어를 소문자로 바꾸거나, 동의어를 처리하는 등 예쁘게 다듬는 단계
특히 한글은 조사가 붙고, 단어가 합쳐지는 등 까다로운 점이 많아 nori
같은 한글 형태소 분석기가 필수적이다.
// "안녕하세요."를 "안녕", "하세", "요" 등으로 분석하는 과정
GET _analyze
{
"tokenizer" : "nori_tokenizer",
"text": "안녕하세요. 오늘 저녁 날씨가 덥다고 하네요.",
"explain" : true
}
nori
가 한글을 형태소 단위로 똑똑하게 분해하는 것을 보니 신기했다. 이제 “맛집”으로 검색해도 “맛있는 집”을 찾아줄 수 있을 것 같다! 😄
✨ 오늘의 회고
Elasticsearch의 검색과 분석 원리를 깊게 파고들면서, 단순히 기능을 사용하는 것을 넘어 왜 이렇게 동작하는지 이해하게 된 하루였다. 특히 Query DSL의 다양한 조합과 한글 분석의 섬세함에 감탄했다. 앞으로는 더 복잡한 검색 요구사항도 자신 있게 해결할 수 있을 것 같다.
다음에는 오늘 배운 내용을 바탕으로 실제 프로젝트에 적용해서, 검색 성능을 개선하고 사용자에게 더 나은 검색 경험을 제공하는 실습을 진행해봐야겠다. 🚀