Create a custom analyzer
Elastic Cloud Serverless projects are autoscaled environments, fully managed by Elastic and available on Elastic Cloud. Availability This functionality is generally available and ready for production usage. Serverless interfaces and procedures might differ from classic Elastic Stack deployments. The Elastic Stack includes Elastic's core products such as Elasticsearch, Kibana, Logstash, and Beats. Availability This functionality is generally available and ready for production usage. Unless stated otherwise on the page, this functionality is available when your Elastic Stack is deployed on Elastic Cloud Hosted, Elastic Cloud Enterprise, Elastic Cloud on Kubernetes, and self-managed environments. This documentation corresponds to the latest patch available for each minor version. If you're not using the latest patch, check the release notes for changes.
Serverless
Generally available
Stack
Generally available
When the built-in analyzers do not fulfill your needs, you can create a custom analyzer which uses the appropriate combination of:
- zero or more character filters
- a tokenizer
- zero or more token filters.
The custom analyzer accepts the following parameters:
type- Analyzer type. Accepts built-in analyzer types. For custom analyzers, use
customor omit this parameter. tokenizer- A built-in or customised tokenizer. (Required)
char_filter- An optional array of built-in or customised character filters.
filter- An optional array of built-in or customised token filters.
position_increment_gap- When indexing an array of text values, Elasticsearch inserts a fake "gap" between the last term of one value and the first term of the next value to ensure that a phrase query doesn’t match two terms from different array elements. Defaults to
100. Seeposition_increment_gapfor more.
Here is an example that combines the following:
- Character Filter
- Tokenizer
- Token Filters
PUT my-index-000001{ "settings": { "analysis": { "analyzer": { "my_custom_analyzer": { "type": "custom", "tokenizer": "standard", "char_filter": [ "html_strip" ], "filter": [ "lowercase", "asciifolding" ] } } } } }POST my-index-000001/_analyze{ "analyzer": "my_custom_analyzer", "text": "Is this <b>déjà vu</b>?" }
- For
customanalyzers, use atypeofcustomor omit thetypeparameter.
The above example produces the following terms:
[ is, this, deja, vu ]
The previous example used tokenizer, token filters, and character filters with their default configurations, but it is possible to create configured versions of each and to use them in a custom analyzer.
Here is a more complicated example that combines the following:
- Character Filter
-
- Mapping Character Filter, configured to replace
:)with_happy_and:(with_sad_
- Mapping Character Filter, configured to replace
- Tokenizer
-
- Pattern Tokenizer, configured to split on punctuation characters
- Token Filters
-
- Lowercase Token Filter
- Stop Token Filter, configured to use the pre-defined list of English stop words
Here is an example:
PUT my-index-000001{ "settings": { "analysis": { "analyzer": { "my_custom_analyzer": { "char_filter": [ "emoticons" ], "tokenizer": "punctuation", "filter": [ "lowercase", "english_stop" ] } }, "tokenizer": { "punctuation": { "type": "pattern", "pattern": "[ .,!?]" } }, "char_filter": { "emoticons": { "type": "mapping", "mappings": [ ":) => _happy_", ":( => _sad_" ] } }, "filter": { "english_stop": { "type": "stop", "stopwords": "_english_" } } } } }POST my-index-000001/_analyze{ "analyzer": "my_custom_analyzer", "text": "I'm a :) person, and you?" }
- Assigns the index a default custom analyzer,
my_custom_analyzer. This analyzer uses a custom tokenizer, character filter, and token filter that are defined later in the request. This analyzer also omits thetypeparameter. - Defines the custom
punctuationtokenizer. - Defines the custom
emoticonscharacter filter. - Defines the custom
english_stoptoken filter.
The above example produces the following terms:
[ i'm, _happy_, person, you ]