본문 바로가기
Opensearch

OpenSearch QueryDSL - 용어 수준 쿼리 - exists, fuzzy

by #Glacier 2024. 4. 3.
반응형

용어 수준 쿼리는 분석된 텍스트필드가 아닌 경우, 정확한 검색어가 포함된 문서의 색인을 검색한다.

OpenSearch가 제공하는 Docs를 따라가보자.

 

용어 수준 쿼리에서는 여러 쿼리 형태가 있다. 처음으로 볼 것은 "exists"이다.

exists는 "특정 필드가 포함된 문서"를 검색하는 쿼리이다.

 

1) exists

PUT testindex/_doc/1
{
  "title": "The wind rises"
}
PUT testindex/_doc/2
{
  "title": "Gone with the wind",
  "description": "A 1939 American epic historical film"
}

 

이렇게 testindex 밑에 1, 2번 문서가 포함된 인덱스가 있게 된다. (PUT으로 입력/삽입)

 

그러면 조회할 때는, 

GET testindex/_search
{
  "query": {
    "exists": {
      "field": "description"
    }
  }
}

 

이렇게 GET으로 조회명령을 보내면,

응답으로 여러 정보가 오면서, hits (일치하는) 부분이 보인다.

"hits": [
      {
        "_index": "testindex",
        "_id": "2",
        "_score": 1,
        "_source": {
          "title": "Gone with the wind",
          "description": "A 1939 American epic historical film"
        }
      }
    ]

 

반대로, description이 없는 문서를 검색하기 위해서는 must_not 부울 쿼리를 사용한다.

GET testindex/_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "description"
        }
      }
    }
  }
}

 

마찬가지로 첫 번째로 넣었던 데이터가 "description"이 누락된 값으로 hits 부분에 보인다.

"hits": [
      {
        "_index": "testindex",
        "_id": "1",
        "_score": 0,
        "_source": {
          "title": "The wind rises"
        }
      }
    ]

 

2) Fuzzy

 

퍼지 쿼리는 허용하는 최대의 레벤슈타인 거리 알고리즘으로 유사한 용어가 포함된 문서를 검색한다.

단 마찬가지로, Fuzzy 검색도 매개변수가 field를 최상위 매개변수로 허용하기 때문에 "필드"를 검색하는데 사용한다.

또한 주어진 단어와 주어진 허용 범위 내에서 유사한 String을 찾는 것이라고 보면 된다.

 

Levenshtein(레벤슈타인) 거리는 한 용어를 다른 용어로 변경하는 데 필요한 한 문자 변경 횟수를 측정한다.

4가지로 측정되며 다음과 같다.

1) 대체 : cat to bat ( c to b)

2) 삽입 : cat to cats (  +s )

3) 삭제 : cat to at ( -c )

4) 전치 : cat to act (ca to ac)

 

즉 이것이 몇번 필요한지 허용하는 필드는 "max_expansions" 이며,

docs의 예제로서 HAMLET을 검색해야하는 데 철자가 틀린 HALET으로 퍼지검색을 하는 예제이다.

GET shakespeare/_search
{
  "query": {
    "fuzzy": {
      "speaker": {
        "value": "HALET"
      }
    }
  }
}

 

화자가 햄릿이 아닌 하렛을 검색하여 퍼지검색을 한 것이며,

fuzzy 밑, Field 밑에 추가적으로 고급 매개변수를 설정할 수 있다.

 

GET shakespeare/_search
{
  "query": {
    "fuzzy": {
      "speaker": {
        "value": "HALET",			
        // 필드 검색 시 사용할 용어
        "fuzziness": "2",
        // 용어가 다른 단어로 변경되는데 필요한 문자 편집 횟수, 기본은 AUTO
        "max_expansions": 40,
        // 쿼리를 확장할 수 있는 최대 용어 수, 
         fuzziness에 따라 2의 거리에 있는 용어들의 수, 기본값 50
        "prefix_length": 0,
        // 퍼지로 관주되지 않게 할 선두 문자의 수, 기본값 0
        "transpositions": true,=
        // 앞서 설명했던 전치를 허용할 지 말지 여부
        "rewrite": "constant_score"
        // OpenSearch가 다중 용어 쿼리를 작성하고 점수를 매기는 방식
           기본값은 constant_score이며, scoring_boolean, constant_score_boolean,
           top_terms_N, top_terms_boost_N, top_terms_blended_freqs_N 등이 있다.
      }
    }
  }
}

 

max_expansions 매개변수의 값을 늘리는 것은 수 많은 결과값을 낳기 때문에

퍼포먼스적으로 검색 성능이 안좋아질 수 있다.

마찬가지로, prefix_length도 0으로 셋하는 경우에는 모든 단어의 거리를 재기 때문에 

퍼포먼스적으로 좋지 않다.

 

즉, 검색하기 위해서 최대한 불필요한 연산을 제거하고 쿼리를 수행하여야 한다.

반응형