Database/NOSQL

Elastic Search - 기초 쿼리 (2)

류큐큐 2024. 4. 4. 17:07

검색을 할때 여러 조건들을 넣어야 하는데 1 단원에 나온 내용으론 기능이 제한적이라

bool 쿼리를 사용하고 그안에 다른 쿼리들을 넣는 식으로 복합적인 쿼리를 사용해야 한다.

나 또한 상품 검색 기능을 만들때 이 부분에 대해 제대로 숙지하지 않고 무작정 검색 기능을 개발하여 내 뜻대로 원하는 결과가 나오지 않았는데 이 부분에 대해 어느정도 이해하고 넘어가면 검색 기능을 만들때 분명 무엇이 잘못되었는지 감이라도 쉽게 잡을수 있다.


 

 

bool 쿼리에는 4개의 인자가 있다.

must 

쿼리가 참인 도큐먼트들을 검색 

must_not 

쿼리가 거짓인 도큐먼트들을 검색

should

검색 결과 중 이 쿼리에 해당하는 도큐먼트의 점수를 높인다

filter 

쿼리가 참인 도큐먼트를 검색하지만 스코어를 계산하지 않는다  must 보다 검색 속도가 빠르고 캐싱이 가능하다

 

 

자 그럼 이제 사용법에 대해 알아보자.


"24 S/S 펜디 키즈 FF로고 V넥 가디건(버건디) JUG152 AOCH F1MTW 12,12"
"24 S/S 펜디 키즈 FF로고 V넥 가디건(버건디) JUG152 AOCH F1MTW"
"메종키츠네 폭스헤드 우먼즈 반팔티 블랙 AW00103KJ0005-P199"

"메종 키츠네 폭스 헤드 여성 반팔 티 블랙 AW00103KJ0005-P199"
"메종키츠네 폭스헤드 우먼즈 반팔티 화이트 AW00103KJ0005-P100"
"디몬트 24 S/S 톰브라운 남성 백삼선 스트라이프 반팔(화이트) MJS056A 00050 100"
"디몬트 24 S/S 톰브라운 남성 백삼선 스트라이프 반팔(그레이) MJS056A 00050 055"
"제이린드버그 남성 골프 자켓 GMOW06812 6855"
"제이린드버그 남성 카라 반팔티 GMJT06857 9999"
"셀린느 벨트 라지 트리오페 벨트 카멜 45BIE3AJG 04FZ"


우선 샘플로 인덱스에 위와 같은 상품명을 넣어놨다.


내가 펜디 라는 브랜드의 상품을 검색하고 싶다면 

아래와 같이 must(쿼리가 참인) 곳에 match 쿼리를 사용하면 된다.



아까 match는 기본적으로 or 조건이 들어간다고 했던걸 기억하고 있는가?

제이린드버그 라는 브랜드까지 같이 결과로 보고 싶다면 그냥 검색어에 추가하면 제이린드버그 상품까지 같이 나오는걸 볼 수 있다.



이제 복합 쿼리를 사용해보자.

메종 키츠네이면서 블랙만 노출되게 하고 싶다면 
복합 쿼리를 구성해서 must_not에 화이트를 적으면 메종키츠네이면서 블랙인 상품만 나오게 된다

 

 

 

 

그리고 복합적 쿼리는 아래와 같이 알맞은 인자에  원하는 조건을 넣으면 된다.

{
  "query": {
    "bool": {
      "must": [
        { <쿼리> }, …
      ],
      "must_not": [
        { <쿼리> }, …
      ],
      "should": [
        { <쿼리> }, …
      ],
      "filter": [
        { <쿼리> }, …
      ]
    }
  }
}

 

근데 사실 위와같은 쿼리는 실제론 개발에 사용할수 없다. 왜냐하면 우리는

"메종키츠네 폭스헤드 우먼즈 반팔티 블랙 AW00103KJ0005-P199"

"메종 키츠네 폭스 헤드 여성 반팔 티 블랙 AW00103KJ0005-P199"
"메종키츠네 폭스헤드 우먼즈 반팔티 화이트 AW00103KJ0005-P100"


위와 같은 상품명이 이미 있다는걸 알고있기 때문에 작성할수 있었던 쿼리였고
결과 또한 잘보면 

"메종키츠네 폭스헤드 우먼즈 반팔티 블랙 AW00103KJ0005-P199"

"메종 키츠네 폭스 헤드 여성 반팔 티 블랙 AW00103KJ0005-P199"

위의 두개가 나와야하는데 주황색 상품명은 검색결과에 나오질 않았다. 이 부분은 차차 알아가도록 하고 



자 이제 좀 더 실무적으로 검색의 예를 들어보자.

내가 메종키츠네 반팔티 블랙 을 찾고 싶다라고 하면 어떻게 검색을 구성해야할까

그냥 메종키츠네 반팔티 블랙이라 검색하면 or 조건으로 

메종키츠네
반팔티
블랙

이 세가지 단어가 있는 모든 검색 결과가 나오게 된다.

문제 자체는 없어 보이지만 소비자 입장에서 쇼핑몰에서 검색을 하는 목적은 원하는 상품만 정확하고 빠르게 보기위한 목적이 있기때문에
아래와 같은 결과는 좋지 않은 결과이다. 또한 검색결과를 보면 _id: 4가 _id 10보다 검색 조건에 부합하지 않아 아래에 있어야할거같은데  반팔티 화이트임에도 위에 노출되고 있다.

다음 포스팅에선 해당 부분을 어떻게 개선해야할지 알아보자.



출처: https://esbook.kimjmin.net/05-search/5.2-bool