es的mapping设置 - 一只自由自在的鱼 - 博客园

标签: | 发表时间:2020-04-02 23:07 | 作者:
出处:https://www.cnblogs.com

 自定义mapping的api

PUT test_index
{
  "mappings": {           #mappings关键字
    "doc": {               #type
      "properties": {           #字段名称和类型的定义
        "name":{                 #字段名
          "type": "keyword"        #字段类型
        },
        "message":{
          "type": "text"
        },
        "age":{
          "type": "integer"
        }
      }}}}
  • mapping中字段类型一旦设定后 禁止直接修改。因为lucene实现的倒排索引生成后不允许修改
  • 除非重建索引映射,然后做reindex操作。
    1,POST _reindex
    {
      "source": {"index":"旧索引"},
      "dest": {"index":"备份索引"}
    }
    2,删除旧索引
    3,新索引建立mapping
    4,POST _reindex
    {
      "source": {"index":"备份索引"},
      "dest": {"index":"新索引"}
    }

 

Field datatypes  字段的数据类型

  • 核心数据类型
    • 字符串类型: text(分词),keyword(不分词)一个用于全文检索,一个用于聚合和排序。
    • 数值型: long,integer,short,byte,double,float,half_float,scaled_float
    • 日期:date
    • 布尔:boolean
    • 二进制:binary
    • 范围类型:integer_range,float_range,long_range,double_range,date_range
  • 复杂数据类型
    • 数组  array
    • 对象  object
      PUT test_index
      {
        "mappings": {
          "doc": {
            "properties": {
              "obj":{              #obect类型字段
                "properties": {
                  "age":{
                    "type":"integer"
                   },
                  "name":{
                    "type":"text"
                  }
                }
              }
            }
          }
        }
      }
      PUT test_index/doc/1
      {
        "obj":[
          {
            "name":"alice white",
            "age":34
          },
          {
            "name":"peter brown",
            "age":26
          }
          ]
      }
      GET test_index/_search
      {
        "query": {
          "match": {
            "obj.name": "peter"
            }
        }
      }
    • 嵌套类型  nested object
      PUT test_index
      {
        "mappings": {
          "doc": {
            "properties": {
              "man":{            #设置man字段为nested类型
                "type": "nested",  
                "properties": {
                  "age":{
                    "type":"integer"
                   },
                  "name":{
                    "type":"text"
                  }
                }}}}}}}
      PUT test_index/doc/1
      {
        "man":[
          {
            "name":"alice white",
            "age":34
          },
          {
            "name":"peter brown",
            "age":26
          }
          ]
      }
      # 嵌套类型的字段的查询和聚合:
      GET test_index/_search
      {
        "query": {       #查询
          "nested": {         #关键字
            "path": "man", 
            "query": {
              "match": {
                "man.name": "peter"  
              }
            }
          }
        },
        "size": 0, 
        "aggs": {
          "man": {   
            "nested": {    #聚合关键字
              "path": "man"
            },
            "aggs": {
              "avg_age": {
                "avg": {
                  "field": "man.age"
                }
              }
            }}}}
  • 地理类型
    • geo_point
    • geo_shape
  • 专用类型
    • 记录ip地址 ip
    • 实现自动补全 completion
    • 记录分词数 token_count
    • 记录字符串hash值 murmur3
    • percolator
    • join

mapping参数:

  • dynamic 参数动态添加新字段
    • -true  允许自动将检测到的新字段加到映射中(默认的)
    • -false 不允许自动新增字段,文档可以写入,但无法对字段进行搜索等操作。不会添加在映射中。且在kibana上面看到的新字段上会显示一个黄色感叹号,刷新index pattern也无效。
    • -strict 文档不能写入,写入会报错
  • analyzer   指定分词器
  • ignore_above  超过ignore_above的字符串将不会被索引或存储
    PUT test_index
    {
      "mappings": {
        "doc":{
          "properties": {
            "message":{
              "type": "keyword",
              "ignore_above": 20  #字段值超过20个字符的字符串不会被索引或者存储
            }
          }
        }
      }
    }
    POST test_index/doc/_bulk
    {"index":{"_id":1}}
    {"message":"test message"}
    {"index":{"_id":2}}
    {"message":"test message  with some long stacktrace messages test test"}
    
    GET test_index/_search
    {
      "size": 0, 
      "aggs": {
        "message": {
          "terms": {
            "field": "message",
            "size": 10
          }
        }
      }
    }----------------------->只能得到第一个桶
          "buckets": [
            {
              "key": "test message",
              "doc_count": 1
            }
          ]
    
    GET test_index/_search    
    {
      "query": {
        "query_string": {
          "default_field": "message",
          "query": "*message*"
        }
      }
    }
    ------------->只能搜索到id为1的文档
      "hits": {
        "total": 1,
        "max_score": 1,
        "hits": [
          {
            "_index": "test_index",
            "_type": "doc",
            "_id": "1",
            "_score": 1,
            "_source": {
              "message": "test message"
            }
          }
        ]
  • index    true | false  控制字段是否被索引,默认为true。
  • doc_values   本质是一个序列化的列式存储 。列式存储适用于聚合,排序,脚本操作。
    • true   默认对除了analyzed strings以外的所有字段开启。
    • false  不能用于聚合、排序和脚本操作
  • fields  对同一字段采用不同类型配置。比如string字段映射为text做全文搜索,映射为keyword做聚合和排序
    PUT test_index
    {
      "mappings": {
        "doc":{
          "properties": {
            "name":{
              "type": "text",     #text类型,用于全文检索
              "fields": {
                "keyword":{    #name.keyword
                  "type": "keyword"   #keyword类型,用于排序和聚合
                }
              }
            }
          }
        }
      }
    }
    PUT test_index/doc/1
    {
      "name":"Jack smis"
    }
    PUT test_index/doc/2
    {
      "name":"Jack"
    }
    GET test_index/_search
    {
      "query": {
        "match": {
          "name": "jack"      #text类型字段
        }
      },
      "sort": [
        {
          "name.keyword": {    #keyword类型字段
            "order": "desc"
          }
        }
      ],
      "aggs": {
        "name_count": {
          "value_count": {
            "field": "name.keyword"   #keyword类型字段
          }
        }
      }
    }
  • properties  object字段或nested字段包含子字段,称为properties。properties可以是任何数据类型
    PUT test_index
    {
      "mappings": {
        "doc": {
          "properties": {
            "dev":{                #object类型字段
              "properties": {
                "name":{
                  "type":"text"
                },
                "age":{
                  "type":"integer"
                }
              }
            },
            "rel":{
              "type": "nested",    #nested类型字段
              "properties": {
                "age":{
                  "type":"integer"
                },
                "name":{
                  "type":"text"
                }
              }
            }
          }
        }
      }
    }
    PUT test_index/doc/1
    {
      "dev":{
        "name":"john smith",
        "age":23
      },
      "rel":[
        {
          "name":"alice white",
          "age":34
        },
        {
          "name":"peter brown",
          "age":26
        }
        ]
    }
  •   norms   时间评分因子,如果不关心评分可以禁用

Dynamic mapping

es可以自动识别字段类型,依靠json文档的字段类型来实现自动识别。支持的类型如下:

json      es

null: 忽略

boolean: boolean

浮点数: float

整数: long

object: object

string:日期设为 date类型(默认开启)。

            数字设为 float或者 long类型(默认关闭)。

            设为 text类型,并附带 keyword的子字段。

 

dynamic field mapping 动态字段映射

  •  date detection   日期检测   默认开启
    #当创建一个日期格式的文档时dynamic_date_formats为
    # ["strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
    PUT t-index/doc/1
    {
      "create_date":"2018/07/03"
    }
    --------------》
    {
      "t-index": {
        "mappings": {
          "doc": {
            "properties": {
              "create_date": {
                "type": "date",   #自动识别日期为date类型
                "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
              }}}}}}
    
    #禁用日期检测 设置date_detection为false的情况
    PUT t-index
    {
      "mappings": {
        "doc":{
          "date_detection": false
        }
      }
    }
    PUT t-index/doc/2
    {
      "new_date":"2018/05/20"
    }
    GET t-index/_mapping
    --------------------------》
    {
      "t-index": {
        "mappings": {
          "doc": {
            "date_detection": false,
            "properties": {
              "new_date": {
                "type": "text",  #日期为text类型
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }}}}}}}}}
     
  •  dynamic_date_formats  自定义日期格式
    PUT t2-index
    {
      "mappings": {
        "doc": {
          "dynamic_date_formats": ["yyyy-MM-dd"]
        }
      }
    }
    PUT t2-index/doc/1
    {
      "create_time":"2018-07-03"
    }
    GET t2-index/_mapping
    --------------------》
    {
      "t2-index": {
        "mappings": {
          "doc": {
            "dynamic_date_formats": [
              "yyyy-MM-dd"
            ],
            "properties": {
              "create_time": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }}}}}}}}
     
  • numeric_detection  默认不会自动识别字符串里面的数字。可以开启
    PUT t-index
    {
      "mappings": {
        "doc": {
          "numeric_detection": true   #打开数字检测
        }
      }
    }
    PUT t-index/doc/1
    {
      "my_float":"1.2",
      "my_integer":"1"
    }
    GET t-index/_mapping 
    
    --------------------》
    {
      "t-index": {
        "mappings": {
          "doc": {
            "numeric_detection": true,
            "properties": {
              "my_float": {
                "type": "float"  #自动检测1.2为float
              },
              "my_integer": {
                "type": "long"  #自动检测1为long
              }}}}}}
     

dyamic-templates  动态模板

 格式为:

"dynamic_templates": [  #数组,可以指定多个匹配规则
    {
      "my_template_name": {     #template名称
        "match_mapping_type":"string",   #匹配规则 
        "mapping":{    
          ...     #设置mapping信息
        }   
      }
    },
    ...
  ]
#举个栗子 以message开头的字段设为text类型,其他string设置成keyword
PUT test_index
{
  "mappings": {  
    "doc": {     # type
      "dynamic_templates":[  # 关键字
      {
        "message_as_text":{   #模板名称
          "match_mapping_type":"string",  #匹配条件
          "match":"message*",    #匹配message开头的字段
          "mapping":{      #设置mapping
            "type":"text" 
          }
        }
      },
      {
        "string_as_keyword":{      # 模板名称
          "match_mapping_type":"string",  #匹配条件
          "mapping":{          #设置mapping
            "type":"keyword",   
       "ignore_above":256 } } }]}}}

 

匹配条件有:match_mapping_type, match, match_pattern, unmatch, path_match, path_unmatch.

  • match_mapping_type

            自动检测类型有 :boolean, date, double, long, object, string

  • PUT my_index
    {
      "mappings": {
        "doc":{
          "dynamic_templates":[
            {
              "my_string":{
                "match_mapping_type":"string",
                "mapping":{
                  "type":"text",
                  "fields":{
                    "keyword":{
                      "type":"keyword",
                      "ignore_above":265
                    }
                  }
                }
              }
            }
          ]
        }
      }
    }
    
    PUT my_index/doc/1
    {
      "name":"Jahn smis"
    }
    GET my_index/_mapping
    
    ------------------->
    
    {
      "my_index": {
        "mappings": {
          "doc": {
            "dynamic_templates": [
              {
                "my_string": {
                  "match_mapping_type": "string",
                  "mapping": {
                    "fields": {
                      "keyword": {
                        "ignore_above": 265,
                        "type": "keyword"
                      }
                    },
                    "type": "text"
                  }
                }
              }
            ],
            "properties": {
              "name": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 265
                  }
                }
              }
            }
          }
        }
      }
    }
  • match,unmatch 匹配字段名称  
    PUT my_index
    {
      "mappings": {
        "_doc": {
          "dynamic_templates": [
            {
              "longs_as_strings": {
                "match_mapping_type": "string",
                "match":   "long_*",
                "unmatch": "*_text",
                "mapping": {
                  "type": "long"
                }
              }
            }
          ]
        }
      }
    }
  • path_match ,path_umatch
    PUT my_index
    {
      "mappings": {
        "_doc": {
          "dynamic_templates": [
            {
              "full_name": {
                "path_match":   "name.*",
                "path_unmatch": "*.middle",
                "mapping": {
                  "type":       "text",
                  "copy_to":    "full_name"
                }
              }
            }
          ]
        }
      }
    }

 

Index Templates 索引模板

定义在创建新索引时自动应用的模板。模板包括setting和mapping和index_patterns

api:    

 GET _cat/templates
 PUT|GET|DELETE  _template/test_template

PUT _template/nginx-access
{
    "order": 0,   # order 设置优先级
    "index_patterns": [  # 匹配索引名称 
      "nginx-access*"   #以nginx-access开头的索引会应用该模板
    ], 
    "settings": {      # 索引setting配置
      "index": {
        "number_of_shards": "6",
        "refresh_interval": "5s"
      }
    },
    "mappings": {     #mapping配置 
      "doc": {
        "date_detection": false,
        "dynamic_templates": [
          {
            "string_fields": {
              "match": "*",
              "match_mapping_type": "string",
              "mapping": {
                "type": "keyword",
                "norms": false,
                "ignore_above": 256
              }
            }
          }
        ],
        "properties": {
          "@timestamp": {
            "type": "date"
          },
          "@version": {
            "type": "keyword"
          },
          "url_args": {
            "type": "nested",
            "properties": {
              "key": {
                "type": "keyword"
              },
              "value": {
                "type": "keyword"
              }
            }
          }
      }
    }
  }
}

 

相关 [es mapping 自由] 推荐:

es的mapping设置 - 一只自由自在的鱼 - 博客园

- -
 自定义mapping的api. #mappings关键字. mapping中字段类型一旦设定后 禁止直接修改. 因为lucene实现的倒排索引生成后不允许修改. 除非重建索引映射,然后做reindex操作. 1,POST _reindex { "source": {"index":"旧索引"}, "dest": {"index":"备份索引"} } 2,删除旧索引 3,新索引建立mapping 4,POST _reindex { "source": {"index":"备份索引"}, "dest": {"index":"新索引"} }.

[译]elasticsearch mapping

- - an74520的专栏
es的mapping设置很关键,mapping设置不到位可能导致索引重建. 请看下面各个类型介绍^_^. 每一个JSON字段可以被映射到一个特定的核心类型. JSON本身已经为我们提供了一些输入,支持 string,  integer/ long,  float/ double,  boolean, and  null..

ES优化总结

- - 非技术 - ITeye博客
最近一直在研究ES集群,也看了很多篇前辈们总结的博客,同事借鉴了官方给出的一些建议,做了一下几点总结,希望对后来者有用:. 为了防止ES进程的内存被置换到磁盘上(会导致在检索的时候发生内存交换导致检索速度迟缓)引起性能急速下降. 候可以把config/elasticsearch.yml中的bootstrap.mlockall设置为true就可以了.

elasticsearch文档-字段的mapping

- - 开源软件 - ITeye博客
elasticsearch文档-字段的mapping. Mapping是指定义如何将document映射到搜索引擎的过程,比如一个字段是否可以查询以及如何分词等,一个索引可以存储含有不同"mapping types"的documents,ES允许每个mapping type关联多个mapping定义.

es的连接查询

- - 行业应用 - ITeye博客
在一般的关系型数据库中,都支持连接操作. 在ES这种分布式方案中进行连接操作,代价是十分昂贵的. 不过ES也提供了相类似的操作,支持水平任意扩展,实现连接的效果. 其他内容, 参考Elasticsearch官方指南整理. 在ES中支持两种连接方式:嵌套查询 和 has_child、has_parent父子查询.

ES性能优化总结

- - 互联网 - ITeye博客
    Elasticsearch是目前大数据领域最热门的技术栈之一,经过近8年的发展,已从0.0.X版升级至6.X版本,虽然增加了很多的特性和功能,但是在主体架构上,还是没有太多的变化. 下面就把我对于ES使用实践的一些经验总结一下,供大家参考;也请大家拍砖. 如果有条件,尽可能使用SSD硬盘, 不错的CPU.

es近实时搜索原理

- - 企业架构 - ITeye博客
 随着按段(per-segment)搜索的发展, 一个新的文档从索引到可被搜索的延迟显著降低了. 新文档在几分钟之内即可被检索,但这样还是不够快.  提交(Commiting)一个新的段到磁盘需要一个 . fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据. 但是  fsync 操作代价很大; 如果每次索引一个文档都去执行一次的话会造成很大的性能问题.

elasticsearch更改mapping(不停服务重建索引)

- - zzm
Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段. 但现实往往并非如此啊,有时增加一个字段,就好像打了一个补丁,一个可以,但是越补越多,最后自己都觉得惨不忍睹了. 这里有一个方法修改mapping,那就是重新建立一个index,然后创建一个新的mapping.

MySQL InnoDB 與 PostgreSQL 的 Partial Index(es) 是不一樣的東西…

- - Gea-Suan Lin's BLOG
MySQL InnoDB 指的 Partial Index 是:. An index that represents only part of a column value, typically the first N characters (the prefix) of a long VARCHAR value..

索引表和ES的一点点思考 - CSDN博客

- -
在电商项目中,物理库存系统是个极其重要的系统,订单支付后,就会开始来占用物理库存. 一般情况下,库存系统都是要分库的,因为主要的操作是写操作,例如占用/释放/取消等写操作. 使用分库可以降低数据库写的压力. 尽管写操作为主,但是读操作也是有的. 比如说,库存占用的时候,得先查询是否有库存,而这个查询操作并不都会带上分库因子(用于路由到具体的某个数据库),而是一些比较宽松的查询条件,这些查询条件对应的数据可能分布在不同的数据库上.