[[multi-fields]] == Multi Fields The `fields` options allows to map several core types fields into a single json source field. This can be useful if a single field need to be used in different ways. For example a single field is to be used for both free text search and sorting. [source,js] -------------------------------------------------- { "tweet" : { "properties" : { "name" : { "type" : "string", "index" : "analyzed", "fields" : { "raw" : {"type" : "string", "index" : "not_analyzed"} } } } } } -------------------------------------------------- In the above example the field name gets processed twice. The first time is gets processed as an analyzed string and this version is accessible under the field name `name`, this is the main field and is in fact just like any other field. The second time its get processed as a not analyzed string and is accessible under the name `name.raw`. [float] === Accessing Fields The multi fields defined in the `fields` are prefixed with the name of the main field and can be accessed by their full path using the navigation notation: `name.raw`, or using the typed navigation notation `tweet.name.raw`. The `path` option allows to control how fields are accessed. If the `path` option is set to `full`, then the full path of the main field is prefixed, but if the `path` option is set to `just_name` the actual multi field name without any prefix is used. The default value for the `path` option is `full`. The `just_name` setting, among other things, allows indexing content of multiple fields under the same name. In the example below the content of both fields `first_name` and `last_name` can be accessed by using `any_name` or `tweet.any_name`. [source,js] -------------------------------------------------- { "tweet" : { "properties": { "first_name": { "type": "string", "index": "analyzed", "path": "just_name", "fields": { "any_name": {"type": "string","index": "analyzed"} } }, "last_name": { "type": "string", "index": "analyzed", "path": "just_name", "fields": { "any_name": {"type": "string","index": "analyzed"} } } } } } -------------------------------------------------- [float] === Include in All The `include_in_all` setting is ignored on any field that is defined in the `fields` options. Setting the `include_in_all` only makes sense on the main field, since the raw field value to copied to the `_all` field, the tokens aren't copied. [float] === Updating a field In the essence a field can't be updated. However multi fields can be added to existing fields. This allows for example to have a different `index_analyzer` configuration in addition to the already configured `index_analyzer` configuration specified in the main and other multi fields. Also the new multi field will only be applied on document that have been added after the multi field has been added and in fact the new multi field doesn't exist in existing documents. Another important note is that new multi fields will be merged into the list of existing multi fields, so when adding new multi fields for a field previous added multi fields don't need to be specified. [float] === Inherit settings from main field Any settings defined on the main field are automatically inherited by all multi fields and act as a default for a multi field. The first example could also be defined as in the example below: [source,js] -------------------------------------------------- { "tweet" : { "properties" : { "name" : { "type" : "string", "index" : "analyzed", "fields" : { "raw" : {"index" : "not_analyzed"} } } } } } --------------------------------------------------