123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- [[analyzer]]
- === `analyzer`
- [IMPORTANT]
- ====
- Only <<text,`text`>> fields support the `analyzer` mapping parameter.
- ====
- The `analyzer` parameter specifies the <<analyzer-anatomy,analyzer>> used for
- <<analysis,text analysis>> when indexing or searching a `text` field.
- Unless overridden with the <<search-analyzer,`search_analyzer`>> mapping
- parameter, this analyzer is used for both <<analysis-index-search-time,index and
- search analysis>>. See <<specify-analyzer>>.
- [TIP]
- ====
- We recommend testing analyzers before using them in production. See
- <<test-analyzer>>.
- ====
- [[search-quote-analyzer]]
- ==== `search_quote_analyzer`
- The `search_quote_analyzer` setting allows you to specify an analyzer for phrases, this is particularly useful when dealing with disabling
- stop words for phrase queries.
- To disable stop words for phrases a field utilising three analyzer settings will be required:
- 1. An `analyzer` setting for indexing all terms including stop words
- 2. A `search_analyzer` setting for non-phrase queries that will remove stop words
- 3. A `search_quote_analyzer` setting for phrase queries that will not remove stop words
- [source,console]
- --------------------------------------------------
- PUT my_index
- {
- "settings":{
- "analysis":{
- "analyzer":{
- "my_analyzer":{ <1>
- "type":"custom",
- "tokenizer":"standard",
- "filter":[
- "lowercase"
- ]
- },
- "my_stop_analyzer":{ <2>
- "type":"custom",
- "tokenizer":"standard",
- "filter":[
- "lowercase",
- "english_stop"
- ]
- }
- },
- "filter":{
- "english_stop":{
- "type":"stop",
- "stopwords":"_english_"
- }
- }
- }
- },
- "mappings":{
- "properties":{
- "title": {
- "type":"text",
- "analyzer":"my_analyzer", <3>
- "search_analyzer":"my_stop_analyzer", <4>
- "search_quote_analyzer":"my_analyzer" <5>
- }
- }
- }
- }
- PUT my_index/_doc/1
- {
- "title":"The Quick Brown Fox"
- }
- PUT my_index/_doc/2
- {
- "title":"A Quick Brown Fox"
- }
- GET my_index/_search
- {
- "query":{
- "query_string":{
- "query":"\"the quick brown fox\"" <6>
- }
- }
- }
- --------------------------------------------------
- <1> `my_analyzer` analyzer which tokens all terms including stop words
- <2> `my_stop_analyzer` analyzer which removes stop words
- <3> `analyzer` setting that points to the `my_analyzer` analyzer which will be used at index time
- <4> `search_analyzer` setting that points to the `my_stop_analyzer` and removes stop words for non-phrase queries
- <5> `search_quote_analyzer` setting that points to the `my_analyzer` analyzer and ensures that stop words are not removed from phrase queries
- <6> Since the query is wrapped in quotes it is detected as a phrase query therefore the `search_quote_analyzer` kicks in and ensures the stop words
- are not removed from the query. The `my_analyzer` analyzer will then return the following tokens [`the`, `quick`, `brown`, `fox`] which will match one
- of the documents. Meanwhile term queries will be analyzed with the `my_stop_analyzer` analyzer which will filter out stop words. So a search for either
- `The quick brown fox` or `A quick brown fox` will return both documents since both documents contain the following tokens [`quick`, `brown`, `fox`].
- Without the `search_quote_analyzer` it would not be possible to do exact matches for phrase queries as the stop words from phrase queries would be
- removed resulting in both documents matching.
|