原文網址:ES之API系列--dynamic template(動態(tài)模板)的用法(有實例)_IT利刃出鞘的博客-CSDN博客
簡介
說明
? ? ? ? 本文介紹ElasticSearch的dynamic template(動態(tài)模板)的用法(有實例)。
官網網址
https://www.elastic.co/guide/en/elasticsearch/reference/8.0/dynamic-templates.html
動態(tài)模板的作用
作用概述
????????動態(tài)模板是針對某個具體的索引來設定的,即在創(chuàng)建某個具體的索引時指定。
使用場景
根據ES自動識別字段類型的這個特性,去設置一些特殊字段的名稱為某些特定的類型。例如:
- 設置所有字符串類型的字段都為 keyword
- is 開頭的字符串都設置成為 boolean 類型
match-mapping-type
概述
? ? ? ? 在沒有設置_mapping時,ES根據文檔字段的類型進行動態(tài)映射。在這種方式下,會對JSON的數據類型動態(tài)定義ES的數據類型。
JSON數據類型 |
ES數據類型 |
null |
不添加字段 |
true / false |
boolean |
double |
float |
long |
long |
object |
object |
array |
根據數組中第一個非null值的類型 |
通過日期檢測的string |
date |
通過數字檢測的string |
float 或 long |
沒有通過上面2個檢測的string |
帶.keyword子字段的text類型 |
實例
PUT /es-learn-doc-person/_create/1
{
? ? "name":"zhang san",
? ? "age":29
}
動態(tài)映射下的mapping:
{
"es-learn-doc-person" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
????????這個文檔中age自動映射成了long,但是integer類型完全滿足當前數據的存儲。假設這樣一種場景,對于公司的數據中的整數數值部分,絕大部分integer能夠滿足存儲需求,那么我們可以使用Dynamic Template來動態(tài)的映射。 方法是:
PUT es-learn-000002
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
}
]
}
}
對于索引es-learn-000002使用的動態(tài)模板,我們插入同樣的用戶信息。?
PUT es-learn-000002/_doc/1
{
"name":"zhang san",
"age":29
}
查看相應的mapping
match與unmatch
概述
????????match與unmatch是對字段名稱進行匹配處理。
????????對于嵌套對象,match 和 unmatch 只作用于最后一級字段名。
- match:字段名稱匹配某規(guī)則
- unmatch :字段名稱不匹配某規(guī)則
- match_pattern:匹配使用的模式。如果設置為regex,則match 和 unmatch 支持正則表達式。例如:
"match_pattern": "regex", "match": "^profit_\d+$"
示例
需求
- 設置所有字符串類型的字段都為 keyword
- is 開頭的字符串都設置成為 boolean 類型
方法
PUT my_index
{
"mappings": {
"dynamic_templates": [{
"strings_as_boolean": {
"match_mapping_type": "string",
"match": "is*",
"mapping": {
"type": "boolean"
}
}
}, {
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
path_match 和 path_unmatch
概述
????????match 和 unmatch 只作用于最后一級的字段名,對于一個有多層的內嵌對象,可以用path_match 和 path_unmatch。(ES是支持存儲對象的),例如:some_object.*.some_field。
示例
若值是對象類型,以name開頭且不以middle結尾則copy到full_name字段中。
設置mapping:
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"full_name": {
"path_match": "name.*",
"path_unmatch": "*.middle",
"mapping": {
"type": "text",
"copy_to": "full_name"
}
}
}
]
}
}
插入數據
PUT my_index/_doc/1
{
"name": {
"first": "John",
"middle": "Winston",
"last": "Lennon"
}
}
查看數據文章來源:http://www.zghlxwxcb.cn/news/detail-415636.html
GET my_index/_search?q=full_name:John
索引模板與動態(tài)模板結合
本處我沒有嘗試,但我猜測索引模板與動態(tài)模板可以同時使用,例如:文章來源地址http://www.zghlxwxcb.cn/news/detail-415636.html
PUT _index_template/event_log_template
{
"index_patterns": ["event_log_*"],
"template": {
"settings": {
"number_of_shards": 5,
"number_of_shards": 1
},
"mappings": {
"dynamic_templates": [{
"dynamicFields": {
"match_mapping_type": "string",
"path_match": "dynamicFields.*_sku_attr",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"id": {
"type": "keyword"
},
"category_first_id": {
"type": "keyword"
},
"category_first": {
"type": "keyword"
}
}
}
}
}
到了這里,關于ES之API系列--dynamic template(動態(tài)模板)的用法(有實例)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!