[[search-analyzer]]
=== `search_analyzer`

Usually, the same <<analyzer,analyzer>> should be applied at index time and at
search time, to ensure that the terms in the query are in the same format as
the terms in the inverted index.

Sometimes, though, it can make sense to use a different analyzer at search
time, such as when using the  <<analysis-edgengram-tokenizer,`edge_ngram`>>
tokenizer for autocomplete.

By default, queries will use the `analyzer` defined in the field mapping, but
this can be overridden with the `search_analyzer` setting:

[source,js]
--------------------------------------------------
PUT my_index
{
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 20
        }
      },
      "analyzer": {
        "autocomplete": { <1>
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "my_type": {
      "properties": {
        "text": {
          "type": "text",
          "analyzer": "autocomplete", <2>
          "search_analyzer": "standard" <2>
        }
      }
    }
  }
}

PUT my_index/my_type/1
{
  "text": "Quick Brown Fox" <3>
}

GET my_index/_search
{
  "query": {
    "match": {
      "text": {
        "query": "Quick Br", <4>
        "operator": "and"
      }
    }
  }
}

--------------------------------------------------
// CONSOLE

<1> Analysis settings to define the custom `autocomplete` analyzer.
<2> The `text` field uses the `autocomplete` analyzer at index time, but the `standard` analyzer at search time.
<3> This field is indexed as the terms: [ `q`, `qu`, `qui`, `quic`, `quick`, `b`, `br`, `bro`, `brow`, `brown`, `f`, `fo`, `fox` ]
<4> The query searches for both of these terms: [ `quick`, `br` ]

See {defguide}/_index_time_search_as_you_type.html[Index time search-as-you-
type] for a full explanation of this example.

TIP: The `search_analyzer` setting must have the same setting for fields of
the same name in the same index.  Its value can be updated on existing fields
using the <<indices-put-mapping,PUT mapping API>>.
