본문 바로가기

Elastic Search

[Elastic Search] Query 스터디-3편 필드 가중치, 논리 쿼리, 패턴 검색

반응형

필드에 가중치 두기

특정 필드에 가중치를 두는 방법을 사용 - 부스팅 기법. 즉 검색하는 여러 필드 중 중요한 필드를 알고 있다면 그 필드에 가중치를 두어 더 상위로 검색 결과를 올리는 방법

GET product/_search
{
  "query": {
    "multi_match": {
      "query": "맨투맨",
      "fields": [
        "category2",
        "title^2"
        ]
    }
  }
}

특정 필드에 가중치를 줘서 특정 필드의 스코어 값을 N배 해주는 효과를 준다. 위 쿼리에서는 title 필드에 2배의 효과를 주었다. 즉 title 필드에서 검색한 결과 스코어에 2배의 효과를 주어 검색 결과를 상위로 올렸다.

논리 쿼리

논리 쿼리는 복합 쿼리로, match, multi_math, match_phrase 등을 조합하여 사용할 수 있다.

Must 타입 - 쿼리를 실행하여 참인 도큐먼트를 찾는다. 복수의 쿼리를 사용하면 And 의 효과

Must Not 타입 - 쿼리를 실행하여 거짓인 도큐먼트를 찾는다. 다른 타입과 같이 사용할 경우 도큐먼트에서 제외한다.

Should 타입 - 단독으로 사용 시 쿼리를 실행하여 참인 도큐먼트를 찾는다. 복수의 쿼리를 실행하면 OR 연산. 다른 타입과 같이 사용할 경우 스코어에만 활용된다.

filter - 쿼리를 실행하여 bool 형태의 필터 검색을 수행한다.

위 조합을 사용하여 쿼리를 한번 만들어보면 다음과 같다.

조건

여성의 리뷰를 찾는다. “오버핏” 또는 “마음(마음에 들어요 등)”이라는 키워드가 포함된 리뷰이면서 “여자친구”라는 단어는 포함하지 않는다(여자친구가 사줬어요, 여자친구에게 사줬어요 등 남성이 작성하는 문구는 제외). 또한 성별 예측값에서 여성 성별값은 2배 부스팅 한다. 그리고 예측 값에서 여성의 값이 0.5 이상(여성일 확률이 50%가 넘는)인 리뷰만 가져온다.

GET review/_search
{
  "query": {
    "bool": {
// 오버핏 이라는 단어와 마음이라는 단어가 포함되어야 한다.
      "must": [
        {"match": {"review": "오버핏 마음"}}
        ],
// 여자친구 라는 단어는 포함되지 않아야 한다.
      "must_not": [
        {"match": {"review": "여자친구"}}
      ]
// gender 예측 값에서 여성 값에 부스트를 적용
      , "should": [
        {
            "rank_feature": {"field": "genders.female", "boost": 2}
        }
      ],
// gender 예측 값에서 0.5 이상, 즉 여성이 작성한 리뷰일 가능성이 높은 리뷰만 필터링
      "filter": {
        "range": {
          "gender.female": {
            "gte": 0.5
          }
        }
      }
    }
  }
}

패턴 검색

와일드카드 쿼리

와일드카드 검색 시에 ‘*’ , ‘?’ 라는 두 가지 기호를 사용할 수 있다.

‘*’ 는 공백까지 포함하여 글자 수에 상관없이 모든 문자를 매칭할 수 있고, ‘?’는 오직 한 문자만 매칭할 수 있다.

검색하려는 용어 맨 앞에 ‘*’, ‘?’를 사용하면 속도가 매우 느려진다.

정규식 쿼리

엘라스틱 서치 쿼리에서 정규식을 사용해 데이터를 조회할 수 있다.

GET review_pos/_search
{
  "query": {
    "regexp": {
      "review.nori_noun": "맨투."
    }
  }
}
🔥 패턴 검색으로 원하는 내용을 검색할 수 있다. 하지만 일반적인 쿼리보다는 속도가 느리다. 실제 서비스에서 사용은 어려울 듯 하다.
반응형