Elasticsearch: 정확값 쿼리 (Exact Value Query)

Elasticsearch에서는 **풀 텍스트 검색(Full-Text Search)**과는 다르게 정확한 값(Exact Value)을 검색하는 방식도 지원합니다. 이 방식을 활용하면 특정 값과 정확히 일치하는 문서만 조회할 수 있으며, 검색 **점수(score)**가 계산되지 않기 때문에 빠른 검색 속도를 보장할 수 있습니다. 이번 글에서는 정확값 검색이란 무엇인지, 그리고 이를 구현하는 filter, keyword, range 쿼리에 대해 알아보겠습니다.


1. 정확값(Exact Value) 검색이란?

🔹 기본 개념

  • 풀 텍스트 검색은 **검색어와 문서의 연관성(relevancy)**을 계산하여 가장 관련성이 높은 결과를 반환합니다.
  • 하지만 정확값 검색정확히 일치하는 값을 찾는 방식이며, 점수(score)를 계산하지 않습니다.
  • 대표적인 쿼리로는 term, range 쿼리가 있으며, bool 쿼리의 filter 절에서 주로 사용됩니다.

🔹 RDBMS와 비교

RDBMS에서 WHERE column = '값' 같은 조건을 사용하여 정확히 일치하는 데이터만 조회하는 것과 비슷합니다.

📌 예제

검색어 풀 텍스트 검색 (match) 정확값 검색 (term)
fox "The quick brown fox" ✅ "fox" 단독으로 포함된 문서만 ✅
Brown fox brown dog "brown"과 "fox"를 포함한 모든 문서 "Brown fox brown dog"와 정확히 일치하는 문서 ✅

2. Bool 쿼리의 Filter 사용

🔹 Filter의 특징

  • 검색 점수(score)에 영향을 주지 않음
  • 쿼리 캐싱을 활용하여 성능 최적화
  • 정확한 값을 필터링할 때 주로 사용

📌 예제 1: match 쿼리 vs filter 쿼리

① match 쿼리 (연관성 기반 검색)

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

🔹 결과:

  • "The quick brown fox jumps over the lazy dog" 🆙 (연관성이 높은 문서가 우선 노출됨)
  • "The quick brown fox"

② match 쿼리 + bool must (여러 조건 검색, 점수 적용됨)

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

🔹 결과:

  • "fox"와 "quick"이 포함된 문서만 검색되며, 점수가 반영됨

③ must + filter 조합 (정확값 필터링, 점수 미반영)

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

🔹 결과 비교

  • "fox"를 포함한 모든 문서 중 "quick"이 포함된 문서만 반환됨
  • 하지만 점수(score)는 변화 없음

3. Filter 내부에서 must_not 사용

  • 특정 단어가 포함되지 않은 문서를 찾을 때 사용
  • 점수에 영향을 주지 않으며, 빠르게 검색 가능

📌 예제 2: "fox" 포함 & "dog" 제외

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "message": "fox" } }
      ],
      "filter": [
        {
          "bool": {
            "must_not": [
              { "match": { "message": "dog" } }
            ]
          }
        }
      ]
    }
  }
}

🔹 결과:

  • "fox"가 포함된 문서 중 "dog"가 포함되지 않은 문서만 검색됨
  • 점수(score)는 변화 없음

4. Keyword 타입을 활용한 정확값 검색

🔹 Keyword 타입이란?

  • keyword 필드는 분석되지 않는(Analyzed X) 문자열 필드
  • 검색어가 정확히 일치하는 데이터만 반환
  • 대소문자, 공백까지 동일해야 검색됨
  • filter 절과 함께 사용하면 빠르게 검색 가능

📌 예제 3: keyword 필드 검색

GET my_index/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "message.keyword": "Brown fox brown dog"
          }
        }
      ]
    }
  }
}

🔹 결과:

  • "Brown fox brown dog"와 완벽하게 일치하는 문서만 반환됨
  • 점수(score)는 _score: 0.0 (점수 계산 없음)

📌 Keyword 필드의 특성
빠른 검색 속도
정확한 값 비교
대소문자 및 공백 차이까지 구분


5. Filter를 활용한 성능 최적화

filter는 점수를 계산하지 않기 때문에 성능이 우수합니다.
filter 내부의 조건들은 캐싱되므로 반복적인 검색 시 더 빠르게 실행됩니다.
숫자 범위(range) 검색이나 정확한 값(term) 검색은 filter를 사용하는 것이 유리합니다.

📌 filter 절을 사용해야 하는 경우
1️⃣ 상품 검색에서 제조사, 브랜드, 가격 필터링
2️⃣ 로그 검색에서 날짜 범위 필터링
3️⃣ ID 기반 검색에서 정확한 ID 값을 찾을 때


6. 정리

개념 설명
풀 텍스트 검색 (match) 연관성을 기준으로 검색 결과 정렬
정확값 검색 (Exact Value) 값이 정확히 일치하는 문서만 검색
Bool Query - Filter 검색 점수를 계산하지 않고 문서를 필터링
Must vs Filter must는 점수를 반영하지만, filter는 점수를 무시
Keyword 필드 분석되지 않는 문자열 필드, 정확한 검색 가능
Must Not (필터 내부 사용) 특정 단어가 포함되지 않은 문서 검색

7. 학습 가이드

1️⃣ Bool Query의 filter 절을 실습하여 정확값 검색 연습
2️⃣ Match vs Term 쿼리의 차이점을 비교하며 성능 테스트
3️⃣ Keyword 타입을 사용하여 필터링 적용
4️⃣ Range, Term, Exists 쿼리를 활용한 검색 최적화


8. 마무리

Elasticsearch에서 정확한 값을 검색할 때는 풀 텍스트 검색이 아닌 filter 기반 검색을 사용하는 것이 성능적으로 더 유리합니다.
특히 상품 검색, 로그 분석, ID 조회 등의 경우 filter와 keyword 필드를 적극 활용하면 더 빠르고 정확한 검색을 할 수 있습니다.

다음 학습에서는 Range Query를 활용한 숫자 및 날짜 범위 검색 방법을 다루겠습니다! 🚀

+ Recent posts