[[multi-fields]] === `fields` It is often useful to index the same field in different ways for different purposes. This is the purpose of _multi-fields_. For instance, a `string` field could be mapped as a `text` field for full-text search, and as a `keyword` field for sorting or aggregations: [source,js] -------------------------------------------------- PUT my_index { "mappings": { "my_type": { "properties": { "city": { "type": "text", "fields": { "raw": { <1> "type": "keyword" } } } } } } } PUT my_index/my_type/1 { "city": "New York" } PUT my_index/my_type/2 { "city": "York" } GET my_index/_search { "query": { "match": { "city": "york" <2> } }, "sort": { "city.raw": "asc" <3> }, "aggs": { "Cities": { "terms": { "field": "city.raw" <3> } } } } -------------------------------------------------- // CONSOLE <1> The `city.raw` field is a `keyword` version of the `city` field. <2> The `city` field can be used for full text search. <3> The `city.raw` field can be used for sorting and aggregations NOTE: Multi-fields do not change the original `_source` field. TIP: The `fields` setting is allowed to have different settings for fields of the same name in the same index. New multi-fields can be added to existing fields using the <>. ==== Multi-fields with multiple analyzers Another use case of multi-fields is to analyze the same field in different ways for better relevance. For instance we could index a field with the <> which breaks text up into words, and again with the <> which stems words into their root form: [source,js] -------------------------------------------------- PUT my_index { "mappings": { "my_type": { "properties": { "text": { <1> "type": "text", "fields": { "english": { <2> "type": "text", "analyzer": "english" } } } } } } } PUT my_index/my_type/1 { "text": "quick brown fox" } <3> PUT my_index/my_type/2 { "text": "quick brown foxes" } <3> GET my_index/_search { "query": { "multi_match": { "query": "quick brown foxes", "fields": [ <4> "text", "text.english" ], "type": "most_fields" <4> } } } -------------------------------------------------- // CONSOLE <1> The `text` field uses the `standard` analyzer. <2> The `text.english` field uses the `english` analyzer. <3> Index two documents, one with `fox` and the other with `foxes`. <4> Query both the `text` and `text.english` fields and combine the scores. The `text` field contains the term `fox` in the first document and `foxes` in the second document. The `text.english` field contains `fox` for both documents, because `foxes` is stemmed to `fox`. The query string is also analyzed by the `standard` analyzer for the `text` field, and by the `english` analyzer` for the `text.english` field. The stemmed field allows a query for `foxes` to also match the document containing just `fox`. This allows us to match as many documents as possible. By also querying the unstemmed `text` field, we improve the relevance score of the document which matches `foxes` exactly.