[ELK / term] 특정 값과 정확하게 일치하는 데이터를 조회하고 싶을 때

2025. 9. 27. 03:20·ElasticSearch
728x90
반응형
SMALL

이번에는 지난번에 사용했던 match 키워드가 있던 자리에 term을 사용해보려고 한다. 이전 블로그에서 사용했던 쿼리를 다시 사용하기 위해 일단 스니펫을 적어두겠다.

이전 코드와 다른게 있다면 이번에는 하나가 아닌 두개의 데이터를 타입을 정의하고 넣을것이다. 왜냐하면 term과 terms를 통해 하나 이상의 값이 일치하는 데이터를 조회하는 과정이기 때문이다.

 

boards_id 와 categories 이렇게 두 개를 생성하고자 한다.

DELETE /boards

PUT /boards
{
    "mappings": {
        "properties": {
            "boards_id" : {
                "type": "long"
            },
            "categories" : {
                "type" : "keyword"
            }
        }
    }
}

 

이후 데이터를 삽입하는 쿼리를 작성한다.

POST /boards/_doc
{
  "board_id": 1,
  "category": "익명 게시판"
}

POST /boards/_doc
{
  "board_id": 2,
  "category": "실명 게시판"
}

POST /boards/_doc
{
  "board_id": 3,
  "category": "공용 게시판"
}

 

이번엔 term을 먼저 사용해보겠다. term의 특징은 keyword와 연관되어있다. text는 일부 텍스트가 포함된 검색도 가능하지만(영어는 standard 에서 가능하지만 한글은 nori_tokenizer를 사용해야함) keyword는 정확히 일치하는 데이터를 조회한다.

GET /boards/_search
{
    "query": {
        "term": {
          "boards_id": 2
        }
    }
}

 

이렇게 조회하면 예상대로 딱 한개의 데이터가 hit된 것을 확인할 수 있다.

 

그럼 이번에는 두 개 이상의 데이터를 조회해서 일치하는 것을 찾아보자

예상하기로는 아래처럼 쿼리를 쓰면 될까...?하지만 이렇게 쓰면 에러가 발생한다.

GET /boards/_search
{
    "query": {
        "term": {
          "categories": "익명 게시판",
          "boards_id" : 1
        }
    }
}

term은 오직 하나의 데이터를 조회한다. 

그래서 아래와 같이 terms와 함께 must를 사용해야한다.

이때 새롭게 보이는 bool이 등장한다. must는 bool의 속성으로 must, must_not, should, filter가 있다.

 

must : SQL의 IN

must_not : SQL의 NOT

filter : SQL의 AND

should : SQL의 AND

이렇게 SQL의 동작과정과 유사한 작동을 한다.

GET /boards/_search
{
    "query": {
        "bool": {
            "must": [
              {
                "term" : {
                "categories" : "광고 게시판"
                }
              },{
                "term": {
                    "boards_id" : 3
                }
              }
            ]
        }
    }
}

결과는 다음과 같다.

filter를 사용해도 결과는 동일한 것을 볼 수 있다.

GET /boards/_search
{
    "query": {
        "bool": {
            "filter": [
              {
                "term" : {
                "categories" : "공용 게시판"
                }
              },{
                "term": {
                    "boards_id" : 3
                }
              }
            ]
        }
    }
}

 

 

이전 포스팅에도 강조했지만 그렇다면 must와 filter는 어떤 상황에서 써야 하는 것일까?

 

ElasticSearch에는 Index를 조회하고 가져오는 과정에서 역색인을 수행하는데 이때 TF(Term Frequency)가 기본값으로 설정되어 있어서 빈번하게 조회되는 인덱스를 조회하는데 이때 score라는 것이 높은 것을 먼저 반환한다.

 

1. must는 score에 영향을 준다.

must는 score를 사용하기 때문에 match와 함께 text 타입의 데이터를 조회힌다.

2. filter는 socre에 영향을 주지 않는다.

filter는 score에 영향을 주지 않기 때문에 term, terms와 함께 text를 제외한 키워드등의 데이터 타입을 조회한다.

 

이 부분을 주의하지 않고 사용해도 결과가 동일하게 나올 순 있지만 예기치않은 상황을 맞이할 수 있기 때문에 사전에 미리 알고 사용하는 것이 중요하다. 

728x90
반응형
SMALL

'ElasticSearch' 카테고리의 다른 글

[ELK / match] 검색 키워드가 포함된 데이터를 조회하고 싶을 때  (0) 2025.09.26
데이터 분석을 위한 ElastiSearch의 Query  (0) 2025.09.26
[ElasticSearch] ElasticSearch 개념  (0) 2025.02.28
[Logging] ElasticSearch와 Logstash, Kibana를 사용한 로그 모니터링  (1) 2025.02.08
'ElasticSearch' 카테고리의 다른 글
  • [ELK / match] 검색 키워드가 포함된 데이터를 조회하고 싶을 때
  • 데이터 분석을 위한 ElastiSearch의 Query
  • [ElasticSearch] ElasticSearch 개념
  • [Logging] ElasticSearch와 Logstash, Kibana를 사용한 로그 모니터링
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (329)
      • 면접 준비 (45)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (5)
      • Kafka (5)
      • Spring (60)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (39)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      자바스크립트
      스프링프레임워크
      자바 알고리즘
      리눅스마스터2급정리
      JSP
      레디스
      Spring Data Redis
      HTML
      Spring
      spring redis
      리눅스
      JS
      CSS
      자바기초
      자바 면접
      자바
      springsecurity
      jsp기초
      JavaScript
      Springframework
      jsp request
      프로그래머스
      자바 반복문
      백준
      redis
      java
      redis 채팅
      리눅스마스터2급
      자바 면접질문
      Til
    • 최근 댓글

    • 최근 글

    • 250x250
    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [ELK / term] 특정 값과 정확하게 일치하는 데이터를 조회하고 싶을 때
    상단으로

    티스토리툴바