Simple query string 쿼리

Simple query string 쿼리

simple_query_string 타입을 사용해 정규 표현식으로 구분된 여러 인수를 쿼리 문자열에 직접 지정할 수 있어요. Simple query string은 문자열의 유효하지 않은 부분을 버리고 유효하지 않은 구문에 대해 오류를 반환하지 않으므로 query string보다 덜 엄격한 구문을 가집니다.

출처: 문서

본문

simple_query_string 타입을 사용해 정규 표현식으로 구분된 여러 인수를 쿼리 문자열에 직접 지정할 수 있어요. Simple query string은 문자열의 유효하지 않은 부분을 버리고 유효하지 않은 구문에 대해 오류를 반환하지 않으므로 query string보다 덜 엄격한 구문을 가져요.

이 쿼리는 특수 연산자를 기반으로 쿼리 문자열을 파싱하고 문자열을 용어로 분할하는 간단한 구문을 사용해요. 파싱 후 쿼리는 각 용어를 독립적으로 분석한 다음 일치 문서를 반환해요.

다음 쿼리는 title 필드에서 퍼지 검색을 수행해요.

GET _search
{
  "query": {
    "simple_query_string": {
      "query": "\"rises wind the\"~4 | *ising~2",
      "fields": ["title"]
    }
  }
}

Simple query string 구문 (Simple query string syntax)

쿼리 문자열은 용어와 연산자로 구성돼요. 용어는 단일 단어예요(예: 쿼리 wind rises에서 용어는 wind와 rises). 여러 용어가 따옴표로 둘러싸여 있으면 단어가 나타나는 순서대로 매칭되는 하나의 구문으로 취급돼요(예: "wind rises"). +, |, - 같은 연산자는 쿼리 문자열의 텍스트를 해석하는 데 사용되는 Boolean 논리를 지정해요.

연산자 (Operators)

Simple query string 구문은 다음 연산자를 지원해요.

연산자 설명
+ AND 연산자 역할을 함
| OR 연산자 역할을 함
* 용어 끝에 사용되면 prefix 쿼리를 나타냄
" 여러 용어를 구문으로 감쌈(예: "wind rises")
(, ) 우선순위를 위해 절을 감쌈(예: wind + (rises | rising))
~n 용어 뒤에 사용되면(예: wnid~3) 퍼지 매칭을 설정함. 구문 뒤에 사용되면 slop을 설정함.
- 용어를 부정함

앞의 모든 연산자는 예약 문자예요. 이들을 연산자가 아닌 원시 문자로 참조하려면 그 중 하나에 백슬래시를 붙여 이스케이프하세요. JSON 요청을 보낼 때는 \\를 사용해 예약 문자를 이스케이프해야 해요(백슬래시 문자 자체가 예약되어 있으므로 백슬래시로 백슬래시를 또 이스케이프해야 함).

기본 연산자 (Default operator)

기본 연산자는 OR예요(default_operator를 AND로 설정하지 않는 한). 기본 연산자는 전체 쿼리 동작을 지시해요. 예를 들어 다음 문서를 포함하는 인덱스를 생각해 볼게요.

PUT /customers/_doc/1
{
  "first_name":"Amber",
  "last_name":"Duke",
  "address":"880 Holmes Lane"
}
PUT /customers/_doc/2
{
  "first_name":"Hattie",
  "last_name":"Bond",
  "address":"671 Bristol Street"
}
PUT /customers/_doc/3
{
  "first_name":"Nanette",
  "last_name":"Bates",
  "address":"789 Madison St"
}
PUT /customers/_doc/4
{
  "first_name":"Dale",
  "last_name":"Amber",
  "address":"467 Hutchinson Court"
}

다음 쿼리는 address가 단어 street 또는 st를 포함하고 단어 madison을 포함하지 않는 문서를 찾으려 해요.

GET /customers/_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "address" ],
      "query": "street st -madison"
    }
  }
}

하지만 결과에는 예상한 문서뿐만 아니라 네 문서 모두가 포함돼요.

응답

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": 2.2039728,
    "hits": [
      {
        "_index": "customers",
        "_id": "2",
        "_score": 2.2039728,
        "_source": {
          "first_name": "Hattie",
          "last_name": "Bond",
          "address": "671 Bristol Street"
        }
      },
      {
        "_index": "customers",
        "_id": "3",
        "_score": 1.2039728,
        "_source": {
          "first_name": "Nanette",
          "last_name": "Bates",
          "address": "789 Madison St"
        }
      },
      {
        "_index": "customers",
        "_id": "1",
        "_score": 1,
        "_source": {
          "first_name": "Amber",
          "last_name": "Duke",
          "address": "880 Holmes Lane"
        }
      },
      {
        "_index": "customers",
        "_id": "4",
        "_score": 1,
        "_source": {
          "first_name": "Dale",
          "last_name": "Amber",
          "address": "467 Hutchinson Court"
        }
      }
    ]
  }
}

기본 연산자가 OR이므로 이 쿼리는 단어 street 또는 st를 포함한 문서(문서 2와 3)와 단어 madison을 포함하지 않는 문서(문서 1과 4)를 포함해요.

쿼리 의도를 올바르게 표현하려면 -madison 앞에 +를 넣으세요.

GET /customers/_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "address" ],
      "query": "street st +-madison"
    }
  }
}

또는 기본 연산자를 AND로 지정하고 단어 street와 st에 분리(disjunction)를 사용하세요.

GET /customers/_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "address" ],
      "query": "st|street -madison",
      "default_operator": "AND"
    }
  }
}

앞의 쿼리는 문서 2를 반환해요.

응답

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 2.2039728,
    "hits": [
      {
        "_index": "customers",
        "_id": "2",
        "_score": 2.2039728,
        "_source": {
          "first_name": "Hattie",
          "last_name": "Bond",
          "address": "671 Bristol Street"
        }
      }
    ]
  }
}

연산자 제한 (Limit operators)

Simple query string 파서의 지원 연산자를 제한하려면 flags 파라미터에서 지원하려는 연산자를 |로 구분해 포함하세요. 예를 들어 다음 쿼리는 OR, AND, FUZZY 연산자만 활성화해요.

GET /customers/_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "address" ],
      "query": "bristol | madison +stre~2",
      "flags": "OR|AND|FUZZY"
    }
  }
}

다음 표는 사용 가능한 모든 연산자 플래그를 나열해요.

플래그 설명
ALL (기본값) 모든 연산자를 활성화함
AND +(AND) 연산자를 활성화함
ESCAPE \를 이스케이프 문자로 활성화함
FUZZY 단어 뒤의 ~n 연산자를 활성화함. 여기서 n은 매칭에 허용되는 편집 거리를 나타내는 정수.
NEAR 구문 뒤의 ~n 연산자를 활성화함. 여기서 n은 일치 토큰 사이에 허용되는 최대 위치 수. SLOP와 같음.
NONE 모든 연산자를 비활성화함
NOT -(NOT) 연산자를 활성화함
OR |(OR) 연산자를 활성화함
PHRASE 구문 검색을 위해 "(따옴표)를 활성화함
PRECEDENCE 연산자 우선순위를 위해 (와 )(괄호) 연산자를 활성화함
PREFIX *(prefix) 연산자를 활성화함
SLOP 구문 뒤의 ~n 연산자를 활성화함. 여기서 n은 일치 토큰 사이에 허용되는 최대 위치 수. NEAR와 같음.
WHITESPACE 텍스트가 분할되는 문자로 공백 문자를 활성화함

와일드카드 표현식 (Wildcard expressions)

* 특수 문자로 와일드카드 표현식을 지정할 수 있으며, 이는 0개 이상의 문자를 대체해요. 예를 들어 다음 쿼리는 name으로 끝나는 모든 필드에서 검색해요.

GET /customers/_search
{
  "query": {
    "simple_query_string" : {
      "query":    "Amber Bond",
      "fields": [ "*name" ] 
    }
  }
}

부스트 (Boosting)

캐럿(^) 부스트 연산자를 사용해 배수로 필드의 관련성 점수를 부스트하세요. [0, 1) 범위의 값은 관련성을 낮추고, 1보다 큰 값은 관련성을 높여요. 기본값은 1.

예를 들어 다음 쿼리는 first_name과 last_name 필드를 검색하고 first_name 필드의 일치를 2배로 부스트해요.

GET /customers/_search
{
  "query": {
    "simple_query_string" : {
      "query":    "Amber",
      "fields": [ "first_name^2", "last_name" ] 
    }
  }
}

다중 위치 토큰 (Multi-position tokens)

다중 위치 토큰의 경우 simple query string은 match phrase 쿼리를 만들어요. 따라서 ml, machine learning을 동의어로 지정하고 ml을 검색하면 OpenSearch는 ml OR "machine learning"을 검색해요.

또는 결합(conjunction)을 사용해 다중 위치 토큰을 매칭할 수 있어요. auto_generate_synonyms_phrase_query를 false로 설정하면 OpenSearch는 ml OR (machine AND learning)을 검색해요.

예를 들어 다음 쿼리는 텍스트 ml models를 검색하고 각 동의어에 대해 match phrase 쿼리를 자동 생성하지 않도록 지정해요.

GET /testindex/_search
{
  "query": {
    "simple_query_string": {
      "fields": ["title"],
      "query": "ml models",
      "auto_generate_synonyms_phrase_query": false
    }
  }
}

이 쿼리에 대해 OpenSearch는 다음 Boolean 쿼리를 만들어요: (ml OR (machine AND learning)) models.

파라미터 (Parameters)

다음 표는 simple_query_string 쿼리가 지원하는 최상위 파라미터를 나열해요. query를 제외한 모든 파라미터는 선택 사항이에요.

파라미터 데이터 타입 설명
query String 검색에 사용할 simple query string 구문의 표현식을 포함할 수 있는 텍스트. 필수.
analyze_wildcard Boolean OpenSearch가 와일드카드 용어를 분석하려 시도해야 하는지 여부를 지정함. 기본값은 false.
analyzer String 쿼리 문자열 텍스트를 토큰화하는 데 사용되는 분석기. 기본값은 default_field에 대해 지정된 인덱스 시점 분석기. default_field에 분석기가 지정되지 않으면 분석기는 인덱스의 기본 분석기. index.query.default_field에 대한 자세한 내용은 Dynamic index-level index settings를 참조하세요.
auto_generate_synonyms_phrase_query Boolean 다중 용어 동의어에 대해 match_phrase 쿼리를 자동으로 생성할지 여부를 지정함. 기본값은 true.
default_operator String 쿼리 문자열에 여러 검색 용어가 있을 때 문서가 일치로 간주되기 위해 모든 용어가 일치해야 하는지(AND) 아니면 하나의 용어만 일치해도 되는지(OR). 유효한 값은 다음과 같음. - OR: 문자열 to be는 to OR be로 해석됨. - AND: 문자열 to be는 to AND be로 해석됨. 기본값은 OR.
fields 문자열 배열 검색할 필드 목록(예: "fields": ["title^4", "description"]). 와일드카드를 지원함. 캐럿(^) 표기법을 사용해 특정 필드의 일치에 대한 관련성을 부스트할 수 있음. 지정하지 않으면 쿼리는 기본값이 ["*"](term 쿼리 대상이 되는 모든 필드가 포함되고 메타데이터 필드는 필터링됨)인 index.query.default_field 설정을 기본으로 함. 인덱스 설정을 덮어쓰거나 쿼리에서 명시적으로 default_field를 설정할 수 있음. 예를 들어 모든 title을 반환하려면 "default_field": "title"로 설정함. 한 번에 검색할 수 있는 최대 필드 수는 기본값 1,024인 indices.query.bool.max_clause_count로 정의됨.
flags String 활성화할 플래그의 |로 구분된 문자열(예: AND|OR|NOT). 기본값은 ALL.
fuzzy_max_expansions 양의 정수 쿼리가 확장할 수 있는 최대 용어 수. 퍼지 쿼리는 fuzziness에 지정된 거리 안에 있는 일치 용어 수로 "확장"됨. 그런 다음 OpenSearch는 그 용어들을 매칭하려 함. 기본값은 50.
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가 명백한 오타임에도 그렇음. 대부분의 사용 사례에서 기본값이 좋은 선택임.
fuzzy_prefix_length Integer 퍼지 매칭을 위해 변경되지 않은 채 남겨지는 시작 문자 수. 기본값은 0.
lenient Boolean lenient를 true로 설정하면 쿼리와 문서 필드 사이의 데이터 타입 불일치를 무시함. 예를 들어 "8.2" 쿼리 문자열은 float 타입 필드와 일치할 수 있음. 기본값은 false.
minimum_should_match 양 또는 음의 정수, 양 또는 음의 백분율, 조합 쿼리 문자열에 여러 검색 용어가 있고 or 연산자를 사용하는 경우, 문서가 일치로 간주되기 위해 일치해야 하는 용어 수. 예를 들어 minimum_should_match가 2이면 wind often rising은 The Wind Rises와 일치하지 않음. minimum_should_match가 1이면 일치함. 자세한 내용은 Minimum should match를 참조하세요.
quote_field_suffix String 이 옵션은 비정확 일치가 사용하는 것과 다른 분석 방법을 사용해 정확한 일치(따옴표로 둘러싸인)를 검색하는 것을 지원함. 예를 들어 quote_field_suffix가 .exact이고 title 필드에서 \\\"lightly\\\"를 검색하면 OpenSearch는 title.exact 필드에서 단어 lightly를 검색함. 이 두 번째 필드는 다른 타입(예: text보다는 keyword)이나 다른 분석기를 사용할 수 있음.

더 알아보기 (Learn more)