mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-08 22:14:59 +00:00
Add examples of useful dynamic templates to the docs. #17413
This commit is contained in:
parent
0b1b366fe8
commit
26a0fb37a4
@ -249,6 +249,148 @@ PUT my_index/my_type/1
|
|||||||
<1> The `english` field is mapped as a `string` field with the `english` analyzer.
|
<1> The `english` field is mapped as a `string` field with the `english` analyzer.
|
||||||
<2> The `count` field is mapped as a `long` field with `doc_values` disabled
|
<2> The `count` field is mapped as a `long` field with `doc_values` disabled
|
||||||
|
|
||||||
|
[[template-examples]]
|
||||||
|
==== Template examples
|
||||||
|
|
||||||
|
Here are some examples of potentially useful dynamic templates:
|
||||||
|
|
||||||
|
===== Structured search
|
||||||
|
|
||||||
|
By default elasticsearch will map string fields as a `text` field with a sub
|
||||||
|
`keyword` field. However if you are only indexing structured content and not
|
||||||
|
interested in full text search, you can make elasticsearch map your fields
|
||||||
|
only as `keyword`s. Note that this means that in order to search those fields,
|
||||||
|
you will have to search on the exact same value that was indexed.
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------------------------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"dynamic_templates": [
|
||||||
|
{
|
||||||
|
"strings_as_keywords": {
|
||||||
|
"match_mapping_type": "string",
|
||||||
|
"mapping": {
|
||||||
|
"type": "keyword"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
===== `text`-only mappings for strings
|
||||||
|
|
||||||
|
On the contrary to the previous example, if the only thing that you care about
|
||||||
|
on your string fields is full-text search, and if you don't plan on running
|
||||||
|
aggregations, sorting or exact search on your string fields, you could tell
|
||||||
|
elasticsearch to map it only as a text field (which was the default behaviour
|
||||||
|
before 5.0):
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------------------------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"dynamic_templates": [
|
||||||
|
{
|
||||||
|
"strings_as_text": {
|
||||||
|
"match_mapping_type": "string",
|
||||||
|
"mapping": {
|
||||||
|
"type": "text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
===== Disabled norms
|
||||||
|
|
||||||
|
Norms are index-time scoring factors. If you do not care about scoring, which
|
||||||
|
would be the case for instance if you never sort documents by score, you could
|
||||||
|
disable the storage of these scoring factors in the index and save some space.
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------------------------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"dynamic_templates": [
|
||||||
|
{
|
||||||
|
"strings_as_keywords": {
|
||||||
|
"match_mapping_type": "string",
|
||||||
|
"mapping": {
|
||||||
|
"type": "text",
|
||||||
|
"norms": false,
|
||||||
|
"fields": {
|
||||||
|
"keyword": {
|
||||||
|
"type": "keyword",
|
||||||
|
"ignore_above": 256
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
The sub `keyword` field appears in this template to be consistent with the
|
||||||
|
default rules of dynamic mappings. Of course if you do not need them because
|
||||||
|
you don't need to perform exact search or aggregate on this field, you could
|
||||||
|
remove it as described in the previous section.
|
||||||
|
|
||||||
|
===== Time-series
|
||||||
|
|
||||||
|
When doing time series analysis with elastisearch, it is common to have many
|
||||||
|
numeric fields that you will often aggregate on but never filter on. In such a
|
||||||
|
case, you could disable indexing on those fields to save disk space and also
|
||||||
|
maybe gain some indexing speed:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------------------------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"dynamic_templates": [
|
||||||
|
{
|
||||||
|
"unindexed_longs": {
|
||||||
|
"match_mapping_type": "long",
|
||||||
|
"mapping": {
|
||||||
|
"type": "long",
|
||||||
|
"index": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"unindexed_doubles": {
|
||||||
|
"match_mapping_type": "double",
|
||||||
|
"mapping": {
|
||||||
|
"type": "float", <1>
|
||||||
|
"index": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--------------------------------------------------
|
||||||
|
<1> Like the default dynamic mapping rules, doubles are mapped as floats, which
|
||||||
|
are usually accurate enough, yet require half the disk space.
|
||||||
|
|
||||||
|
|
||||||
[[override-default-template]]
|
[[override-default-template]]
|
||||||
=== Override default template
|
=== Override default template
|
||||||
|
Loading…
x
Reference in New Issue
Block a user