Elasticsearch를 사용할 때 문서의 title
필드에서 특정 단어가 포함된 문서를 찾으려고 match
나 match_phrase
쿼리를 사용했는데, 기대한 결과가 나오지 않는 경우가 있습니다. 본 글에서는 그 이유를 정리하고, Elasticsearch에 적합한 문서 제목 명명 규칙에 대해 안내합니다.
🔍 문제 상황: title
검색이 안 되는 이유
예를 들어 문서에 다음과 같은 title
값이 있다고 가정합니다.
"title": "Title_Including_Word"
이 문서에서 "Shaft" 라는 단어가 포함된 문서를 찾기 위해 아래와 같은 쿼리를 사용했지만 결과가 0이 나왔습니다.
{
"query": {
"match": {
"title": "Word"
}
}
}
혹은 아래와 같은 match_phrase 쿼리를 사용했을 때도 결과가 나오지 않았습니다.
{
"query": {
"match_phrase": {
"title": "Word"
}
}
}
✅ 이유는?
- title 필드가 text 타입이며 기본 standard analyzer를 사용하고 있는 상태에서,
- "Title_Including_Word"은 하나의 토큰(단어) 으로 분석됨
(_ 언더스코어는 기본 analyzer에서 단어 구분자가 아님) - 따라서 "Word"와 같은 개별 단어는 존재하지 않는 것으로 인식되어 검색되지 않음
✅ 해결 방법
1. regexp 쿼리 사용
text 타입 필드에서 특정 단어가 포함된 문서를 찾고 싶다면 regexp 쿼리를 사용할 수 있습니다.
{
"query": {
"regexp": {
"title": ".*[Ww]ord.*"
}
}
}
- 대소문자 구분을 피하고 싶다면 정규식 안에 [Ss]와 같이 처리
- 단점: regexp 쿼리는 느릴 수 있고, 복잡한 검색에는 부적합할 수 있음
2. wildcard 쿼리 사용 (단, keyword 필드가 있을 경우에만)
{
"query": {
"wildcard": {
"title.keyword": {
"value": "*word*",
"case_insensitive": true
}
}
}
}
- 단, title.keyword 필드가 존재해야 동작함 (text 필드의 서브 필드로 keyword 타입이 있어야 함)
- 현재 인덱스 매핑에 keyword 서브 필드가 없다면 사용 불가
📘 문서 제목(title) 명명 방식 가이드
검색 효율성과 정밀도를 높이기 위해 title
필드의 값을 어떻게 구성하는 것이 좋은지에 대한 가이드입니다.
명명 방식 | 예시 | 검색 친화도 | 비고 |
---|---|---|---|
띄어쓰기 기반 | "Title Including Word" |
✅ 매우 좋음 | analyzer가 자연스럽게 토큰화 |
kebab-case (- ) |
"title-including-word" |
✅ 좋음 | - 는 토큰 구분자로 인식됨 |
snake_case (_ ) |
"title_including_word" |
❌ 안 좋음 | _ 는 기본 analyzer가 분리 못함 |
camelCase | "titleIncludingWord" |
❌ 안 좋음 | 전체가 한 단어로 인식됨 |
✅ 추천
- 사람에게 보여질
title
,content
,summary
같은 필드는 띄어쓰기 기반 자연어 문장 사용 - 시스템에서 사용하는
id
,slug
,key
등은snake_case
또는kebab-case
+keyword
타입 필드로 구성
🧠 팁: 매핑 설정 시 title에 .keyword
필드 추가하기
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
이렇게 하면 full-text 검색(text)과 exact match / wildcard 검색(keyword)을 모두 지원할 수 있어 유연성이 높아집니다.
✨ 결론
- 기본 analyzer는
_
를 단어 구분자로 인식하지 않기 때문에 match나 match_phrase로 검색되지 않는 문제가 생길 수 있음 - 가능하다면 제목은 띄어쓰기 기반으로 작성하거나, 검색 목적에 맞는 필드(keyword)를 함께 설정하는 것이 좋음
- 정규식이나 wildcard 검색을 사용할 수는 있지만 성능을 고려해 선택적으로 사용하자
'Etc' 카테고리의 다른 글
Jira 설치 가이드 (Ubuntu) (0) | 2025.04.12 |
---|---|
Python 패키지 초기화 With poetry (0) | 2025.02.02 |
Elasticsearch 개념과 설치 가이드 (2) | 2024.12.18 |
텍스트 청크와 토큰의 차이점 이해하기 (2) | 2024.12.18 |
JVM, Node.js, Python의 환경 관리 방식 비교 (2) | 2024.12.09 |