Match Boolean prefix 쿼리

Match Boolean prefix 쿼리

match_bool_prefix 쿼리는 제공된 검색 문자열을 분석하고 문자열의 용어들로 Boolean 쿼리를 만들어요. 마지막 용어를 제외한 모든 용어를 전체 단어로 사용해 매칭하고, 마지막 용어는 접두사로 사용합니다. 어떤 순서로든 전체 단어 용어나 접두사 용어로 시작하는 용어를 포함한 문서를 반환합니다.

출처: 문서

본문

match_bool_prefix 쿼리는 제공된 검색 문자열을 분석하고 문자열의 용어들로 Boolean 쿼리를 만들어요. 마지막 용어를 제외한 모든 용어를 전체 단어로 사용해 매칭해요. 마지막 용어는 접두사로 사용돼요. match_bool_prefix 쿼리는 전체 단어 용어나 접두사 용어로 시작하는 용어를 어떤 순서로든 포함한 문서를 반환해요.

다음 예시는 기본 match_bool_prefix 쿼리를 보여줘요.

GET _search
{
  "query": {
    "match_bool_prefix": {
      "title": "the wind"
    }
  }
}

추가 파라미터를 전달하려면 확장 구문을 사용할 수 있어요.

GET _search
{
  "query": {
    "match_bool_prefix": {
      "title": {
        "query": "the wind",
        "analyzer": "stop"
      }
    }
  }
}

예시 (Example)

예를 들어 다음 문서가 있는 인덱스를 생각해 볼게요.

PUT testindex/_doc/1
{
  "title": "The wind rises"
}
PUT testindex/_doc/2
{
  "title": "Gone with the wind"
  
}

다음 match_bool_prefix 쿼리는 전체 단어 rises와 wi로 시작하는 단어를 어떤 순서로든 검색해요.

GET testindex/_search
{
  "query": {
    "match_bool_prefix": {
      "title": "rises wi"
    }
  }
}

앞의 쿼리는 다음 Boolean 쿼리와 동일해요.

GET testindex/_search
{
  "query": {
    "bool" : {
      "should": [
        { "term": { "title": "rises" }},
        { "prefix": { "title": "wi"}}
      ]
    }
  }
}

응답에는 두 문서가 모두 포함돼요.

응답

{
  "took": 15,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.73617,
    "hits": [
      {
        "_index": "testindex",
        "_id": "1",
        "_score": 1.73617,
        "_source": {
          "title": "The wind rises"
        }
      },
      {
        "_index": "testindex",
        "_id": "2",
        "_score": 1,
        "_source": {
          "title": "Gone with the wind"
        }
      }
    ]
  }
}

match_bool_prefix와 match_phrase_prefix 쿼리

match_bool_prefix 쿼리는 어떤 위치에서든 용어를 매칭하는 반면, match_phrase_prefix 쿼리는 용어를 전체 구문으로 매칭해요. 차이를 설명하기 위해 앞 섹션의 match_bool_prefix 쿼리를 다시 고려해 볼게요.

GET testindex/_search
{
  "query": {
    "match_bool_prefix": {
      "title": "rises wi"
    }
  }
}

The wind rises와 Gone with the wind 모두 검색 용어와 일치하므로 이 쿼리는 두 문서를 모두 반환해요.

이제 같은 인덱스에서 match_phrase_prefix 쿼리를 실행해 보세요.

GET testindex/_search
{
  "query": {
    "match_phrase_prefix": {
      "title": "rises wi"
    }
  }
}

어떤 문서도 지정된 순서로 rises wi라는 구문을 포함하지 않으므로 응답에 문서가 반환되지 않아요.

분석기 (Analyzer)

기본적으로 text 필드에서 쿼리를 실행하면 검색 텍스트가 필드와 연관된 인덱스 분석기를 사용해 분석돼요. analyzer 파라미터에서 다른 검색 분석기를 지정할 수 있어요.

GET testindex/_search
{
  "query": {
    "match_bool_prefix": {
      "title": {
        "query": "rise the wi",
        "analyzer": "stop"
      }
    }
  }
}

파라미터 (Parameters)

이 쿼리는 필드 이름(<field>)을 최상위 파라미터로 받아들여요.

GET _search
{
  "query": {
    "match_bool_prefix": {
      "": {
        "query": "text to search for",
        ... 
      }
    }
  }
}

<field>는 다음 파라미터를 받아들여요. query를 제외한 모든 파라미터는 선택 사항이에요.

파라미터 데이터 타입 설명
query String 검색에 사용할 텍스트, 숫자, Boolean 값 또는 날짜. 필수.
analyzer String 쿼리 문자열 텍스트를 토큰화하는 데 사용되는 분석기. 기본값은 default_field에 대해 지정된 인덱스 시점 분석기. default_field에 분석기가 지정되지 않으면 분석기는 인덱스의 기본 분석기. index.query.default_field에 대한 자세한 내용은 Dynamic index-level index settings를 참조하세요.
fuzziness AUTO, 0 또는 양의 정수 용어가 값과 일치하는지 결정할 때 한 단어를 다른 단어로 바꾸는 데 필요한 문자 편집 수(삽입, 삭제, 대체). 예를 들어 wined와 wind 사이의 거리는 1. 기본값 AUTO는 검색 용어의 길이에 따라 편집 거리를 동적으로 선택함. AUTO:[low],[high] 구문을 사용해 임계값을 사용자 지정할 수 있는데, 여기서 low와 high는 문자 길이 경계를 정의함. 생략하면 OpenSearch는 기본값으로 AUTO:3,6을 사용하며, 이는 다음 규칙을 적용함. - 0–2자의 용어: 정확히 일치 필요(편집 0). - 3–5자의 용어: 최대 1개 편집 허용. - 6자 이상의 용어: 최대 2개 편집 허용. 예를 들어 AUTO:4,7은 0–3자의 용어에서 정확히 일치를 요구하고, 4–6자의 용어에서 최대 1개 편집을 허용하며, 7자 이상의 용어에서 최대 2개 편집을 허용함. 대부분의 시나리오에서는 AUTO 사용을 권장함.
fuzzy_rewrite String OpenSearch가 쿼리를 어떻게 재작성할지 결정함. 유효한 값은 constant_score, scoring_boolean, constant_score_boolean, top_terms_N, top_terms_boost_N, top_terms_blended_freqs_N. fuzziness 파라미터가 0이 아니면 쿼리는 기본적으로 top_terms_blended_freqs_${max_expansions}의 fuzzy_rewrite 방식을 사용함. 기본값은 constant_score.
fuzzy_transpositions Boolean fuzzy_transpositions를 true(기본값)로 설정하면 fuzziness 옵션의 삽입, 삭제, 대체 연산에 인접 문자 교체가 추가됨. 예를 들어 fuzzy_transpositions가 true이면 wind와 wnid 사이의 거리는 1("n"과 "i"를 교체)이고, false이면 2("n"을 삭제, "n"을 삽입). fuzzy_transpositions가 false이면 rewind와 wnid는 wind로부터 같은 거리(2)를 가지며, 더 인간 중심적인 의견상 wnid가 명백한 오타임에도 그렇음. 대부분의 사용 사례에서 기본값이 좋은 선택임.
max_expansions 양의 정수 쿼리가 확장할 수 있는 최대 용어 수. 퍼지 쿼리는 fuzziness에 지정된 거리 안에 있는 일치 용어 수로 "확장"됨. 그런 다음 OpenSearch는 그 용어들을 매칭하려 함. 기본값은 50.
minimum_should_match 양 또는 음의 정수, 양 또는 음의 백분율, 조합 쿼리 문자열에 여러 검색 용어가 있고 or 연산자를 사용하는 경우, 문서가 일치로 간주되기 위해 일치해야 하는 용어 수. 예를 들어 minimum_should_match가 2이면 wind often rising은 The Wind Rises와 일치하지 않음. minimum_should_match가 1이면 일치함. 자세한 내용은 Minimum should match를 참조하세요.
operator String 쿼리 문자열에 여러 검색 용어가 있을 때 문서가 일치로 간주되기 위해 모든 용어가 일치해야 하는지(and) 아니면 하나의 용어만 일치해도 되는지(or). 유효한 값은 or와 and. 기본값은 or.
prefix_length 음이 아닌 정수 fuzziness에서 고려되지 않는 선행 문자 수. 기본값은 0.

fuzziness, fuzzy_transpositions, fuzzy_rewrite, max_expansions, prefix_length 파라미터는 마지막 용어를 제외한 모든 용어에 대해 구성된 term 하위 쿼리에 적용될 수 있어요. 이들은 마지막 용어에 대해 구성된 prefix 쿼리에는 아무 효과도 없어요.

더 알아보기 (Learn more)