OpenSearch/docs/reference/analysis/specify-analyzer.asciidoc

203 lines
5.4 KiB
Plaintext

[[specify-analyzer]]
=== Specify an analyzer
{es} offers a variety of ways to specify built-in or custom analyzers:
* By `text` field, index, or query
* For <<analysis-index-search-time,index or search time>>
[TIP]
.Keep it simple
====
The flexibility to specify analyzers at different levels and for different times
is great... _but only when it's needed_.
In most cases, a simple approach works best: Specify an analyzer for each
`text` field, as outlined in <<specify-index-field-analyzer>>.
This approach works well with {es}'s default behavior, letting you use the same
analyzer for indexing and search. It also lets you quickly see which analyzer
applies to which field using the <<indices-get-mapping,get mapping API>>.
If you don't typically create mappings for your indices, you can use
<<indices-templates,index templates>> to achieve a similar effect.
====
[[specify-index-time-analyzer]]
==== How {es} determines the index analyzer
{es} determines which index analyzer to use by checking the following parameters
in order:
. The <<analyzer,`analyzer`>> mapping parameter for the field.
See <<specify-index-field-analyzer>>.
. The `analysis.analyzer.default` index setting.
See <<specify-index-time-default-analyzer>>.
If none of these parameters are specified, the
<<analysis-standard-analyzer,`standard` analyzer>> is used.
[[specify-index-field-analyzer]]
==== Specify the analyzer for a field
When mapping an index, you can use the <<analyzer,`analyzer`>> mapping parameter
to specify an analyzer for each `text` field.
The following <<indices-create-index,create index API>> request sets the
`whitespace` analyzer as the analyzer for the `title` field.
[source,console]
----
PUT my_index
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
}
}
}
}
----
[[specify-index-time-default-analyzer]]
==== Specify the default analyzer for an index
In addition to a field-level analyzer, you can set a fallback analyzer for
using the `analysis.analyzer.default` setting.
The following <<indices-create-index,create index API>> request sets the
`simple` analyzer as the fallback analyzer for `my_index`.
[source,console]
----
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
}
}
}
}
}
----
[[specify-search-analyzer]]
==== How {es} determines the search analyzer
// tag::search-analyzer-warning[]
[WARNING]
====
In most cases, specifying a different search analyzer is unnecessary. Doing so
could negatively impact relevancy and result in unexpected search results.
If you choose to specify a separate search analyzer, we recommend you thoroughly
<<test-analyzer,test your analysis configuration>> before deploying in
production.
====
// end::search-analyzer-warning[]
At search time, {es} determines which analyzer to use by checking the following
parameters in order:
. The <<analyzer,`analyzer`>> parameter in the search query.
See <<specify-search-query-analyzer>>.
. The <<search-analyzer,`search_analyzer`>> mapping parameter for the field.
See <<specify-search-field-analyzer>>.
. The `analysis.analyzer.default_search` index setting.
See <<specify-search-default-analyzer>>.
. The <<analyzer,`analyzer`>> mapping parameter for the field.
See <<specify-index-field-analyzer>>.
If none of these parameters are specified, the
<<analysis-standard-analyzer,`standard` analyzer>> is used.
[[specify-search-query-analyzer]]
==== Specify the search analyzer for a query
When writing a <<full-text-queries,full-text query>>, you can use the `analyzer`
parameter to specify a search analyzer. If provided, this overrides any other
search analyzers.
The following <<search-search,search API>> request sets the `stop` analyzer as
the search analyzer for a <<query-dsl-match-query,`match`>> query.
[source,console]
----
GET my_index/_search
{
"query": {
"match": {
"message": {
"query": "Quick foxes",
"analyzer": "stop"
}
}
}
}
----
// TEST[s/^/PUT my_index\n/]
[[specify-search-field-analyzer]]
==== Specify the search analyzer for a field
When mapping an index, you can use the <<analyzer,`search_analyzer`>> mapping
parameter to specify a search analyzer for each `text` field.
If a search analyzer is provided, the index analyzer must also be specified
using the `analyzer` parameter.
The following <<indices-create-index,create index API>> request sets the
`simple` analyzer as the search analyzer for the `title` field.
[source,console]
----
PUT my_index
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace",
"search_analyzer": "simple"
}
}
}
}
----
[[specify-search-default-analyzer]]
==== Specify the default search analyzer for an index
When <<indices-create-index,creating an index>>, you can set a default search
analyzer using the `analysis.analyzer.default_search` setting.
If a search analyzer is provided, a default index analyzer must also be
specified using the `analysis.analyzer.default` setting.
The following <<indices-create-index,create index API>> request sets the
`whitespace` analyzer as the default search analyzer for the `my_index` index.
[source,console]
----
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
},
"default_search": {
"type": "whitespace"
}
}
}
}
}
----