elasticSearch Mapping
在es中也有存储结构的定义,就像在传统的数据库中的表结果的定义
在elasticsearch7.X之后移除的type的概念
在官方的解释中,因为es底层用的Lucene,之前我们都将type类比于关系型数据库中的表,但是不同的是,关系型数据库中的表之间是独立的,每个表中即使有相同的字段也不会影响最终的查询结果,并且没有二义性。不同于传统数据库的是elasticsearch中type中的每个字段并没有相互隔离,如果不同type中有很多相同的字段,对于最终的Lucene压缩和不同类型之间的修改或者删除有很大的影响。
es中数据类型
Core datatypesedit
- string
text and keyword - Numeric datatypes
long, integer, short, byte, double, float, half_float, scaled_float - Date datatype
date - date_nanos datatype
date_nanos - Boolean datatype
boolean - Binary datatype
binary - Range datatypes
integer_range, float_range, long_range, double_range, date_range - Range datatypes
Complex datatypesedit
Array datatype
Array support does not require a dedicated type
Object datatype
object for single JSON objects
Nested datatype
nested for arrays of JSON objects - Geo datatypes
Geo datatypesedit
Geo-point datatype
geo_point for lat/lon points
Geo-Shape datatype
geo_shape for complex shapes like polygons
es 元数据
- _index :代表了这个文档属于哪个索引
- _type : 文档的类型
- _id:文档的Id
Document source meta-fields
- _source : 代表原始的JSON文档类型
- _size:_source的byte大小
- _field_names:文档中所有字段名称
- _ignored:被忽略的字段
setting 中的一些组件:
coerce
:数据的严格性,比如,定义一个字段类型为integer,但是放入“5.0”
也不会报错,但是总会需要严格的数据,如果在字段中加入coerce:false 则需要强类型的限制,如果规定字段类型为Integer,传入字符串类型的数字则会报错dynamic
- true:新增的字段会加入mapping中,默认设置
- false:新检测到的字段将被忽略。这些字段不会被编入索引,因此无法搜索,但仍会出现在_source返回的匹配字段中。这些字段不会添加到映射中,必须显式添加新字段
- strict:如果检测到新字段,则抛出异常并拒绝该文档。必须将新字段显式添加到映射中。
copy_to
将多个字段聚合到一个字段中方便查询,他是复制字段中的值,不是itemnull_value
一个null值不能被索引或搜索。当字段设置为null(或空数组或null值数组)时,它被视为该字段没有值。
动态属性Mapping
在默认情况下,我们新建文档的时候,es会通过探测类型自动建立Mapping,支持一下类型的建立:
JSON datatype | Elasticsearch datatype |
---|---|
null | No field is added. |
true or false | boolean field |
floating point number | float field |
integer | long field |
object | object field |
array | Depends on the first non-null value in the array. |
string | Either a date field (if the value passes date detection), a double or longfield (if the value passes numeric detection) or a text field, with a keywordsub-field. |
日期类型的探测:
默认的日期格式为:[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
比如:
PUT my_index/_doc/1
{
"create_date": "2015/09/02"
}
对应的mapping为:可见时间被格式化为默认时间类型
{
"my_index" : {
"mappings" : {
"properties" : {
"create_date" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
}
}
}
}
}
如果不想不自动检测类型,则可以配置:
PUT my_index
{
"mappings": {
"date_detection": false
}
}
自定义时间侦测类型
PUT my_index
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
我们在创建文档的时候,遇到这种类型的字符串才会被格式化成时间
数字类型侦探:
PUT my_index
{
"mappings": {
"numeric_detection": true
}
}
开启之后,会将文档中的字符串转为响应的数字类型
index
index
开启之后则将记录索引,否则不记录,即不可搜索
dynamic Template
可以定义将特定的类型转为另一个类型,或者匹配某一个或者某一类关系
自定义mapping建议
- 将目标文档写入es中,获取es自动生成的mapping
- 修改步骤1中获得的mapping,并自定义相关配置
- 使用步骤2中的mapping创建实际所需要的索引
索引模板:
在es中我们可能会对某个索引进行按时间切分,来达到更好的效率,这时候我们可以定义索引模板
新建索引模板:
PUT _template/template_1
{
"index_patterns": ["te*", "bar*"],//索引模板匹配规则
"order":0,//匹配顺序,如果有几个命中,则order越大,选择哪个
"settings": {
"number_of_shards": 1
},
"mappings": {
"_source": {
"enabled": true
},
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date",
"format": ["MM/dd/yyyy"]
}
}
}
}
新建文档:
PUT test_2/_doc/1
{
"created_at":"01/22/2019",
"host_name":"localhost"
}
则会命中索引模板中的设置
查看mapping设置:GET test_2/_mapping
{
"test_2" : {
"mappings" : {
"properties" : {
"created_at" : {
"type" : "date",
"format" : "[MM/dd/yyyy]"
},
"host_name" : {
"type" : "keyword"
}
}
}
}
}