Search-as-you-type 필드 타입

Search-as-you-type 필드 타입

search-as-you-type 필드 타입은 접두사(prefix)와 삽입형(infix) 완성 둘 다를 사용해 search-as-you-type 기능을 제공해요.

출처: 문서

본문

예시

search-as-you-type 필드를 매핑하면 이 필드의 n-gram 하위 필드(n은 [2, max_shingle_size] 범위)가 만들어져요. 또한 index prefix 하위 필드도 만들어져요.

search-as-you-type 필드가 있는 매핑을 만들어 볼게요.

PUT books
{
  "mappings": {
    "properties": {
      "suggestions": {
        "type": "search_as_you_type"
      }
    }
  }
}

suggestions 필드 외에도 이 설정은 suggestions._2gram, suggestions._3gram, suggestions._index_prefix 필드를 만들어요.

search-as-you-type 필드가 있는 문서를 색인해요.

PUT books/_doc/1
{
  "suggestions": "one two three four"
}

용어를 어떤 순서로든 매칭하려면 bool_prefix 또는 multi_match 쿼리를 사용해요. 이 쿼리들은 검색 용어가 지정된 순서대로 있는 문서를 순서가 뒤바뀐 문서보다 더 높이 랭킹해요.

GET books/_search
{
  "query": {
    "multi_match": {
      "query": "tw one",
      "type": "bool_prefix",
      "fields": [
        "suggestions",
        "suggestions._2gram",
        "suggestions._3gram"
      ]
    }
  }
}

응답에는 매칭된 문서가 포함돼요.

{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "suggestions" : "one two three four"
        }
      }
    ]
  }
}

용어를 순서대로 매칭하려면 match_phrase_prefix 쿼리를 사용해요.

GET books/_search
{
  "query": {
    "match_phrase_prefix": {
      "suggestions": "two th"
    }
  }
}

응답에는 매칭된 문서가 포함돼요.

{
  "took" : 23,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.4793051,
    "hits" : [
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.4793051,
        "_source" : {
          "suggestions" : "one two three four"
        }
      }
    ]
  }
}

마지막 용어들을 정확히 매칭하려면 match_phrase 쿼리를 사용해요.

GET books/_search
{
  "query": {
    "match_phrase": {
      "suggestions": "four"
    }
  }
}

응답:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "suggestions" : "one two three four"
        }
      }
    ]
  }
}

파라미터 (Parameters)

search-as-you-type 필드 타입이 받는 파라미터는 다음 표와 같아요. 모든 파라미터는 선택 사항이에요.

파라미터 설명
analyzer 이 필드에 사용될 analyzer예요. 기본적으로 색인 시점과 검색 시점 모두에서 사용돼요. 검색 시점에 재정의하려면 search_analyzer 파라미터를 설정해요. 기본값은 문법 기반 토큰화를 사용하고 Unicode Text Segmentation 알고리즘에 기반한 표준 analyzer예요. 루트 필드와 하위 필드를 구성해요.
index 필드를 검색 가능하게 할지 여부를 지정하는 불리언 값이에요. 기본값은 true예요. 루트 필드와 하위 필드를 구성해요.
index_options 검색과 하이라이팅을 위해 인덱스에 저장할 정보를 지정해요. 유효 값: docs(문서 번호만), freqs(문서 번호와 용어 빈도), positions(문서 번호, 용어 빈도, 용어 위치), offsets(문서 번호, 용어 빈도, 용어 위치, 시작·끝 문자 오프셋). 기본값은 positions예요. 루트 필드와 하위 필드를 구성해요.
max_shingle_size 최대 n-gram 크기를 지정하는 정수예요. 유효 값은 [2, 4] 범위예요. 생성할 n-gram은 [2, max_shingle_size] 범위예요. 기본값은 3이며, 2-gram과 3-gram을 만들어요. max_shingle_size 값이 클수록 더 구체적인 쿼리에 잘 작동하지만 인덱스 크기가 커져요.
norms 관련성 점수 계산 시 필드 길이를 사용할지 여부를 지정하는 불리언 값이에요. 루트 필드와 n-gram 하위 필드를 구성해요(기본값은 false). prefix 하위 필드는 구성하지 않아요(prefix 하위 필드에서는 norms가 false).
search_analyzer 검색 시점에 사용될 analyzer예요. 기본값은 analyzer 파라미터에 지정된 analyzer예요. 루트 필드와 하위 필드를 구성해요.
search_quote_analyzer 구문과 함께 검색 시점에 사용될 analyzer예요. 기본값은 analyzer 파라미터에 지정된 analyzer예요. 루트 필드와 하위 필드를 구성해요.
similarity 관련성 점수를 계산하는 랭킹 알고리즘이에요. 기본값은 BM25예요. 루트 필드와 하위 필드를 구성해요.
store 필드 값을 저장하고 _source 필드와 별도로 검색할 수 있게 할지 여부를 지정하는 불리언 값이에요. 기본값은 false예요. 루트 필드만 구성해요.
term_vector 이 필드에 대한 용어 벡터를 저장할지 여부를 지정하는 불리언 값이에요. 기본값은 no예요. 루트 필드와 n-gram 하위 필드를 구성해요. prefix 하위 필드는 구성하지 않아요.

더 알아보기 (Learn more)