1. term 쿼리 - 정확한 단어 일치 검색
term 쿼리는 검색어를 분석하지 않고 전체 문자열로 처리하여 정확한 매칭을 수행합니다. 이는 분석되지 않은 필드(예: keyword)에서만 효과적입니다.
GET shop/_search
{
"query": {
"term": {
"name.keyword": "Java 프로그래밍의 진수"
}
}
}
1.1 terms 쿼리 - 여러 값 중 하나 매칭
terms는 여러 값을 동시에 검색할 때 사용되며, SQL의 IN과 유사합니다.
GET shop/_search
{
"query": {
"terms": {
"name.keyword": [
"Java 프로그래밍의 진수",
"자바 동시성 프로그래밍 기술"
]
}
}
}
2. prefix 쿼리 - 접두사 기반 검색
특정 문자로 시작하는 문서를 검색합니다. 그러나 모든 인덱스 항목을 스캔해야 하므로 성능이 저하될 수 있습니다.
GET shop/_search
{
"query": {
"prefix": {
"name": "자바"
}
}
}
3. wildcard 쿼리 - 와일드카드 패턴 검색
문자열 내부에 *(0개 이상) 또는 ?(1개)를 포함한 패턴으로 검색합니다.
GET shop/_search
{
"query": {
"wildcard": {
"name": "자바*"
}
}
}
4. regexp 쿼리 - 정규 표현식 검색
정규 표현식을 사용해 복잡한 패턴을 기반으로 검색합니다. 성능 저하가 심하기 때문에 주의 필요.
GET shop/_search
{
"query": {
"regexp": {
"name": "자바[a-z]*"
}
}
}
5. fuzzy 쿼리 - 오타 보정 검색
유사한 단어나 오타를 포함한 결과를 반환합니다. 기본적으로 최대 2회 오류 허용.
GET shop/_search
{
"query": {
"match": {
"name": {
"query": "자바",
"fuzziness": 1,
"operator": "and"
}
}
}
}
6. boost 점수 조정 - 문서 우선순위 설정
특정 조건을 만족하는 문서의 점수를 높여 상단에 배치할 수 있습니다.
GET shop/_search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "진수" } }
],
"should": [
{
"match": {
"name": {
"query": "기술",
"boost": 2.5
}
}
}
]
}
}
}
7. dis_max - 최고 점수 기반 병합 전략
7.1 문제 제기
다중 필드에서 일부 단어만 일치하는 문서가, 전체 단어가 일치하는 문서보다 높은 점수를 받는 경우가 발생할 수 있음.
7.2 사용 예시
dis_max는 각 쿼리의 최고 점수를 선택하고, tie_breaker를 통해 추가적인 점수 조정이 가능합니다.
GET shop/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "가상 머신" } },
{ "match": { "description": "클래식" } }
],
"tie_breaker": 0.3
}
}
}
GET shop/_search
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"title": {
"query": "가상 머신",
"minimum_should_match": "60%",
"boost": 3
}
}
},
{
"match": {
"description": {
"query": "클래식",
"minimum_should_match": "50%",
"boost": 2.5
}
}
}
],
"tie_breaker": 0.4
}
}
}
8. exist 쿼리 - 필드 존재 여부 확인 (비공식 기능)
이전 버전에서 사용되었으나, 현재는 권장되지 않으며 대체 방법(예: exists 쿼리)을 사용해야 합니다.
9. 복합 검색 시나리오 예제
9.1 다중 조건 필터링
출간일이 2012년 7월 이후이며, 이름에 '동시성' 포함 또는 설명에 '자바' 포함, 출판사명에 '전자' 포함하지 않는 문서 검색.
GET shop/_search
{
"query": {
"bool": {
"filter": {
"range": {
"date": { "gte": "2012-07" }
}
},
"should": [
{ "match": { "name": "동시성" } },
{
"bool": {
"must": { "match": { "desc": "자바" } },
"must_not": { "match": { "publisher": "전자" } }
}
}
],
"minimum_should_match": 1
}
},
"sort": [
{ "price": { "order": "desc" } }
]
}
9.2 조건 결합 + 범위 + 정렬
이름에 '자바' 포함, '가상 머신'은 제외; 가격 범위 40 ~ 80 사이; 결과는 가격 오름차순으로 정렬.
GET shop/_search
{
"query": {
"bool": {
"must": { "match": { "name": "자바" } },
"must_not": { "match": { "name": "가상 머신" } },
"filter": {
"range": {
"price": {
"gte": 40,
"lte": 80,
"boost": 1.8
}
}
}
}
}
}
9.3 사용자 정의 정렬 규칙
점수(_score)가 의미 없거나 동일할 경우, 특정 필드 기준으로 정렬 가능.
GET website/_search
{
"query": {
"constant_score": {
"filter": {
"term": { "author_id": 5520 }
}
}
},
"sort": [
{ "post_date": { "order": "asc" } }
]
}