Elasticsearch Bool Query: Should 사용법

Elasticsearch의 bool 쿼리는 여러 개의 검색 조건을 조합할 수 있도록 도와줍니다. 그중에서도 should 절은 검색 결과의 가중치를 조정하여 더 관련성이 높은 문서를 상위에 배치할 때 유용합니다.

이번 글에서는 should 절이 어떻게 동작하는지, 그리고 match_phrase와 결합하여 검색 품질을 향상시키는 방법을 살펴보겠습니다.


1. Bool Query의 Should 절이란?

🔹 기본 개념

  • should 절은 검색 결과의 점수(score)를 조정하는 데 사용됩니다.
  • must 절과 다르게 should 절의 조건을 만족하지 않아도 검색 결과에 포함될 수 있습니다.
  • 하지만 should 조건을 만족하는 문서는 더 높은 점수를 부여받아 상위에 노출됩니다.

🔹 RDBMS와 비교

RDBMS에서는 단순히 조건을 만족하는 데이터만 반환할 뿐, 어느 데이터가 더 중요한지는 판단하지 않습니다.
Elasticsearch에서는 should 절을 활용하여 특정 키워드가 포함된 문서에 더 높은 점수를 부여할 수 있습니다.


2. Should 절을 활용한 검색 예제

🔹 예제 1: 특정 키워드에 가중치 부여

먼저, "fox"라는 단어가 포함된 문서를 검색하는 match 쿼리를 실행합니다.

GET my_index/_search
{
  "query": {
    "match": {
      "message": "fox"
    }
  }
}

📌 검색 결과:

  • "The quick brown fox jumps over the lazy dog"
  • "The quick brown fox"

이제 should 절을 추가하여 "lazy"가 포함된 문서에 가중치를 부여해 보겠습니다.

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "fox"
          }
        }
      ],
      "should": [
        {
          "match": {
            "message": "lazy"
          }
        }
      ]
    }
  }
}

📌 검색 결과 변경:

  • "The quick brown fox jumps over the lazy dog" 🆙 (점수 증가, 최상위 노출)
  • "The quick brown fox" (점수 변화 없음)

"lazy"라는 단어가 포함된 문서는 더 높은 점수를 받아 상위에 표시됩니다.


3. Should 절 + Match Phrase로 정확도 향상

should 절을 match_phrase와 함께 사용하면 정확한 구문이 포함된 문서를 최상위에 배치할 수 있습니다.

📌 예제 2: "lazy" 또는 "dog"가 포함된 문서 검색 + "lazy dog" 구문 포함 문서 가중치 부여

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "lazy dog"
          }
        }
      ],
      "should": [
        {
          "match_phrase": {
            "message": "lazy dog"
          }
        }
      ]
    }
  }
}

📌 검색 결과:
1️⃣ "The quick brown fox jumps over the lazy dog" 🆙 (최상위 노출, 점수 증가)
2️⃣ "Lazy jumping dog"

"lazy"나 "dog"가 포함된 모든 문서를 검색하면서, "lazy dog"라는 정확한 구문을 포함한 문서는 더 높은 점수를 받습니다.


4. Should 절을 활용한 검색 최적화

1) 쇼핑몰 검색 최적화

쇼핑몰에서는 "스키 장갑"을 검색할 때 스키 용품과 장갑을 모두 표시하되, "스키 장갑"이 포함된 상품을 최상위에 배치할 수 있습니다.

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "product_name": "스키 장갑"
          }
        }
      ],
      "should": [
        {
          "match_phrase": {
            "product_name": "스키 장갑"
          }
        }
      ]
    }
  }
}

🔹 결과:

  • "스키 장갑 방한용" 🆙 (점수 증가, 최상위 노출)
  • "방수 장갑 (스키 가능)"
  • "스키 장비 풀세트"

"스키 장갑"이 정확히 포함된 상품이 가장 위에 표시됩니다.


2) Slop 옵션을 활용한 유연한 검색

slop 옵션을 추가하면 단어 간의 순서가 바뀌어도 검색이 가능합니다.

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "product_name": "스키 장갑"
          }
        }
      ],
      "should": [
        {
          "match_phrase": {
            "product_name": "스키 장갑",
            "slop": 1
          }
        }
      ]
    }
  }
}

📌 slop 옵션 설명:

  • "스키 보드 장갑" ✅
  • "스키 방한 장갑" ✅
  • "방한용 스키 장갑" ✅
  • "스키 장갑" ✅ (가장 높은 점수)

"스키 장갑"이 정확히 일치하지 않더라도 일정한 간격 내에서 허용하여 검색 유연성을 높일 수 있습니다.


5. 정리

개념 설명
Bool Query 여러 검색 조건을 조합하는 Elasticsearch의 강력한 기능
Must 절 검색 결과에 반드시 포함되어야 하는 조건
Should 절 점수를 조정하여 특정 문서를 상위에 배치
Match Phrase 정확한 구문 검색
Slop 옵션 단어 간 순서를 유연하게 허용

6. 학습 가이드

1️⃣ Should 절을 사용하여 가중치를 조절하는 방법을 실습
2️⃣ Match Phrase와 Slop 옵션을 결합하여 검색 최적화 적용
3️⃣ Boosting, Function Score Query와 비교 학습
4️⃣ Elasticsearch에서 실제 데이터(상품, 뉴스, 블로그 등)로 실습 진행


7. 마무리

Elasticsearch의 should 절을 사용하면 검색 결과의 가중치를 조정하여 더 적절한 결과를 상위에 배치할 수 있습니다.

다음 학습에서는 Function Score Query를 활용하여 검색 결과의 점수를 더욱 정밀하게 조정하는 방법을 살펴보겠습니다! 🚀

+ Recent posts