侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 352 篇文章
  • 累计创建 135 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

ES教程4-ES可视化工具elasticsearch-head的使用 - 索引与映射

孔子说JAVA
2022-10-09 / 0 评论 / 0 点赞 / 236 阅读 / 16,961 字 / 正在检测是否收录...
广告 广告

ealsticsearch只是后端提供各种api,那么怎么直观的使用它呢?使用curl等客户端工具即可通过Restful API对Elasticsearch进行操作,但也有一些客户端工具提供对于ElasticSearch更加友好的可视化操作支持,比如 elasticsearch-head 就是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。elasticsearch-head插件是使用JavaScript开发的,依赖Node.js库,使用Grunt工具构建。

打开浏览器访问 http://172.19.82.206:9100/,在如下所示的地址栏中输入es地址如 http://172.19.82.206:9200/ ,然后点击"连接",出现下面的效果证明es连接成功了。

image-1665191498793

1、索引的使用

索引可以理解为mysql中的数据库,一个索引就好比一个数据库。

1.1 创建索引

1.1.1 方式一:使用复合查询添加索引

es创建索引的请求方式如下:PUT /<index>,请求的方法用PUT。/后面直接跟索引的名称即可。索引的设置和字段都放在Body中。

在页面上选择"复合查询": 在地址栏输入 http://172.19.82.206:9200/student/ ,选择 PUT 方式,提交内容为空的json串 {},然后点击“提交请求”,即可;这时候在页面右侧会返回索引添加成功的信息。

image-1665191809225

我们返回概览首页,点击刷新也能看到新建的索引student。

image-1665191991209

通过上图可以看到我们的节点名称为node-1,并且该节点下有1个索引 student。

查看索引信息

点击索引 student 下的【信息–>索引信息】可以查看该索引的所有信息,包括mappings、setting等等。

image-1665192336361

开启关闭索引

点击索引 student 下的【动作–> 关闭/开启】,可以关闭/开启该索引。

image-1665192482052

image-1665192498990

1.1.2 方式二:在索引页面新加索引

在索引页面可以查看到所有的索引,并且还可以创建一个新的索引,如下图:

image-1665192819095

点击索引页面的新建索引按钮,弹出新建索引对话框,输入索引名称 student_1 后点击 OK 按钮创建索引,这时候会弹出索引创建成功的提示框。

image-1665192921252

1.1.3 方式三:创建索引同时设置settings和mappings

比如我们创建一个名字叫组织机构的索引,这个索引只有两个字段,一个id,一个name。并且这个索引设置为2个分片,2个副本。如果使用 Postman 发送请求,地址如下:

http://172.19.82.206:9200/orgnization/

请求的方法选择PUT。然后在请求体(Body)中,写上索引的字段名称,索引的分片数和副本数,如下:

{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "name": {
        "type": "text"
      }
    }
  }
}

我们观察一下,请求体中分为两个部分:settings和mappings。在settings中,我们设置了分片数和副本数。

  • number_of_shards:分片的数量;
  • number_of_replicas:副本的数量;

在mappings中,我们设置索引的字段,在这里,我们只设置了id和name,id的映射类型是long,name的映射类型是text。

请求体写完后,我们点击发送,es返回的结果如下:

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "orgnization"
}

说明索引创建成功,索引的名字正是我们在请求中设置的orgnization。

使用 elasticsearch-head 创建截图如下:

image-1665195480587

我们通过elasticsearch-head插件观察一下刚才创建的索引:

image-1665195802410

我们可以看到索引orgnization已经创建好了,它有2个分片,分别是0和1,并且每个分片都是两个副本。如果我们仔细观察这个图,可以看出node-chun节点中的0分片,和node-yao节点中的1分片,它们的边框是加粗的,这说明它们是主节点,而边框没有加粗的节点是从节点,也就是我们说的副本节点。

创建索引的时候可以把索引名称写到下方的地址栏中。

image-1665202486961

1.2 浏览索引

在数据浏览tab页面,可看到索引、类型、字段、数据信息。

image-1665193083551

我们一般把head当做数据展示工具,至于查询的实现,用 Kibana 实现效果更好。

1)查看索引

如果我们要查看一个索引的设置,可以通过如下请求方式:

GET /<index>

在本例中,我们查看 orgnization 索引的设置,在Postman中发送如下的请求,请求方式为GET:

http://172.19.82.206:9200/orgnization/

返回结果如下:

{
	"orgnization": {
		"aliases": {},
		"mappings": {
			"properties": {
				"id": {
					"type": "long"
				},
				"name": {
					"type": "text"
				}
			}
		},
		"settings": {
			"index": {
				"routing": {
					"allocation": {
						"include": {
							"_tier_preference": "data_content"
						}
					}
				},
				"number_of_shards": "2",
				"provided_name": "orgnization",
				"creation_date": "1665195204858",
				"number_of_replicas": "2",
				"uuid": "0e_qG01pT_aKNyQSq7MnYQ",
				"version": {
					"created": "7170399"
				}
			}
		}
	}
}

我们可以看到索引的具体设置,比如:mapping的设置,分片和副本的设置。这些和我们创建索引时候的设置是一样的。

通过elasticsearch-head插件查询如下图:

image-1665196064451

2)查看索引中的字段映射

如果我们要查看已知索引的字段映射,可以向ES发送如下的请求:

GET /orgnization/_mapping

请求的方法是GET,请求的路径是我们索引的名称my-index,再加上一个_mapping,得到的返回结果如下:

image-1665202851490

1.3 修改索引

最佳实践

我们可以完全参考手册编写 Mapping ,但不建议这样做,容易出错,调试也麻烦,可以通过创建一个测试索引并插入测试文档,然后查看ElasticSearch为这个索引自动创建的Mapping,基于这个Mapping进行修改来构建我们自己的 Mapping。

1)设置mapping(映射)信息

索引一旦创建,我们是无法修改里边的内容的,比如说修改索引字段的名称。但是我们是可以向索引中添加其他字段的,添加字段的方式如下:

PUT /<index>/_mapping

然后在我们的请求体中,写好新添加的字段。在复合查询页面,请求url输入 http://172.19.82.206:9200/student/,其中 student 表示索引名,地址栏下方输入 _mapping 为固定格式,请求类型为 PUT,body中输入创建索引的语句(添加的字段及其类型),如下:

  • 如果是使用postman等工具,完整url为:http://172.19.82.206:9200/student/_mapping
{
	"properties": {
		"id": {
			"type": "long"
		},
		"name": {
			"type": "text"
		},
		"createTime": {
			"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
			"type": "date"
		},
		"createId": {
			"type": "keyword"
		}
	}
}

image-1665194120667

2)已有索引新加type字段

在orgnization中新添加一个type字段,它的类型我们定义为long,请求如下:

http://localhost:9200/orgnization/_mapping

请求类型要改为PUT,请求体如下:

{
  "properties": {
    "type": {
      "type": "long"
    }
  }
}

添加索引字段成功,我们再使用GET查看一下索引,返回如下结果:

{
    "orgnization": {
        "aliases": {},
        "mappings": {
            "properties": {
                "id": {
                    "type": "long"
                },
                "name": {
                    "type": "text"
                },
                "type": {
                    "type": "long"
                }
            }
        },
        "settings": {
            "index": {
                "routing": {
                    "allocation": {
                        "include": {
                            "_tier_preference": "data_content"
                        }
                    }
                },
                "number_of_shards": "2",
                "provided_name": "orgnization",
                "creation_date": "1636182188268",
                "number_of_replicas": "2",
                "uuid": "93U8-D3FSf2ZsVveV6uPUw",
                "version": {
                    "created": "7100299"
                }
            }
        }
    }
}

我们可以成功的查询到新添加的索引字段了。

又一个例子:

image-1665202606140

使用PUT方式,索引名称再接上_mapping,请求体中是我们新添加的映射字段,我们指定了字段的类型为keyword,index索引为false,说明这个字段只用于存储,不会用于搜索,搜索这个字段是搜索不到的。

  • 我们在更新字段时候,是不能修改字段的类型的。如果我们要修改字段的类型,最好是新建一个新的字段,指定正确的类型,然后再更新索引,以后我们只需要查询这个新增的字段就可以了。

3)修改mapping中的字段类型

mapping中字段类型一旦设定后禁止直接修改。因为lucene实现的倒排索引生成后不允许修改,除非重建索引映射,然后做reindex操作。以上面例子的索引orgnization为例。

  1. 创建一个备份索引orgnization_bak
{
    "settings":{
        "number_of_shards":2,
        "number_of_replicas":2
    },
    "mappings":{
        "properties":{
            "id":{
                "type":"long"
            },
            "name":{
                "type":"text"
            }
        }
    }
}
  1. reindex操作
POST http://localhost:9200/_reindex

请求体:

{
  "source": {"index":"旧索引"},
  "dest": {"index":"备份索引"}
}

其中旧索引就是orgnization,备份索引是orgnization_bak。

  1. 删除旧索引orgnization
  2. 创建新索引orgnization,重新指定字段类型
{
    "settings":{
        "number_of_shards":2,
        "number_of_replicas":2
    },
    "mappings":{
        "properties":{
            "id":{
                "type":"long"
            },
            "name":{
                "type":"keyword"
            }
        }
    }
}
  1. 再reindex操作
POST http://localhost:9200/_reindex

请求体为:

{
  "source": {"index":"备份索引"},
  "dest": {"index":"新索引"}
}

此时的备份索引是orgnization_bak,新索引就是我们刚刚创建的orgnization。

注:在大数据量的情况,reindex操作效率较低,慎用。

1.4 删除索引

如果要删除一个索引,请求方式如下:

DELETE /<index>

假如我们要删除刚才创建的orgnization索引,我们只要把请求的方法改成DELETE,然后访问索引就可以。

http://172.19.82.206:9200/orgnization

1.5 关闭/开启索引

如果索引被关闭,那么关于这个索引的所有读写操作都会被阻断。索引的关闭也很简单,请求方式如下:

POST /<index>/_close

在本例中,如果要关闭索引orgnization,将请求方法改成POST,然后发送如下请求:

http://172.19.82.206:9200/orgnization/_close

与关闭索引相对应的是打开索引,请求方式如下:

POST /<index>/_open

在本例中,如果要开启索引orgnization,将请求方法改成POST,然后发送如下请求:

http://172.19.82.206:9200/orgnization/_open

1.7 冻结/解冻索引

冻结索引和关闭索引类似,关闭索引是既不能读,也不能写。而冻结索引是可以读,但是不能写。冻结索引的请求方式如下:

POST /<index>/_freeze

在本例中,如果要冻结索引orgnization,将请求方法改成POST,然后发送如下请求:

http://172.19.82.206:9200/orgnization/_freeze

与冻结索引对应的是解冻索引,方式如下:

POST /<index>/_unfreeze

对应我们的例子:

http://172.19.82.206:9200/orgnization/_unfreeze

1.8 索引别名

索引别名就是给一个索引或者多个索引起的另一个名字,下面为给索引blog取别名为blog1;

POST /_aliases
{
    "actions": [
        {
            "add": {
                "index": "blog",
                "alias": "blog1"
            }
        }
    ]
}

查询索引别名

GET /_aliases

返回结果

{
    ".kibana_1": {
        "aliases": {
            ".kibana": {}
        }
    },
    "blog": {
        "aliases": {
            "blog1": {}
        }
    }
}

2、静态映射和动态映射

es中有三个概念要清楚,分别为: 索引、映射和文档

  • 索引可理解为MySQL数据库;
  • 映射可理解为MySQL的表结构;
  • 文档可理解为MySQL表中的每行数据

静态映射和动态映射

映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就是动态映射;而静态映射是指,在创建文档时,手动添加文档映射,类似于MySQL创建表结构一样;

下面为es根据插入的数据推断出的字段类型规则:

image-1665205105599

2.1 查询文档映射

如果对es检索依赖比较严重的话,并不推荐开启动态映射;

GET /{索引}/_mappings

响应(此映射为es根据文档创建的动态映射)

{
    "blog": {
        "mappings": {
            "properties": {
                "content": {
                    "type": "text", // text类型
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "title": {
                    "type": "text", // text类型
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

2.2 创建静态映射

PUT /{索引名称}
{
    "properties":{
        "content":{
            "type":"text",
            "fields":{
                "keyword":{
                    "type":"keyword",
                    "ignore_above":256
                }
            }
        },
        "title":{
            "type":"text",
            "fields":{
                "keyword":{
                    "type":"keyword",
                    "ignore_above":256
                }
            }
        }
    }
}

响应

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "user"
}

2.3 创建索引并添加映射

PUT /{索引名称}
{
  "mappings": {
    "properties": {
      "name":{
      "type":"keyword"
      },
      "age":{
        "type":"integer"
      },
      "address":{
        "type":"text"
      }
    }
  }
}

3、Setting和mapping配置

索引的创建需要配置mapping与setting两部分。基本格式:

{
    "mappings":{
		"_all":{
			"enabled":false  #默认情况,ElasticSarch自动使用_all所有的文档的域都会被加到_all中进行索引。可以使用"_all" : {"enabled":false} 开关禁用它。如果某个域不希望被加到_all中,可以使用"include_in_all":false关闭
		},
		"properties":{
			"uuid":{
				"type":"text",
				"copy_to":"_search_all", #对应_search_all字段,可以对其进行全文检索
				"fields":{
					"keyword":{
						"type":"keyword",  
						"ignore_above":150  #ignore_above 默认值是256,当字段文本的长度大于指定值时,不做倒排索引。
					}
				}
			},
			"name":{
				"type":"text",
				"copy_to":"_search_all",
				"analyzer":"ik_max_word",  # ik_max_word 插件会最细粒度分词
				"search_analyzer":"ik_smart",  # ik_smart 粗粒度分词
				"fields":{
					"keyword":{
						"type":"keyword",
						"ignore_above":150
					}
				}
			},
			"dt_from_explode_time":{
				"type":"date",
				"copy_to":"_search_all",
				"format":"strict_date_optional_time||epoch_millis"
			},
			"_search_all":{
				"type":"text"
			}
		},
		"date_detection":false,  #关闭日期自动检测,如果开启,会对于设置为日期格式的字段进行判断
		"dynamic_templates":[   #用于自定义在动态添加field的时候自动给field设置的数据类型
			{
				"strings":{
					"match_mapping_type":"string",
					"mapping":{
						"type":"text",
						"copy_to":"_search_all",
						"fields":{
							"keyword":{
								"type":"keyword",
								"ignore_above":150
							}
						}
					}
				}
			}
		]
        
    },
    "settings":{
        "index":{
            "number_of_shards":6, #分片数量
            "number_of_replicas":1  #副本数量
        }
    }
}

3.1 Setting配置

setting为ES索引的配置属性,索引的配置项按是否可以更改分静态(static)属性与动态配置。静态配置即索引创建后不能修改,静态配置只能在创建索引时或者在状态为 closed index的索引(闭合的索引)上设置。

3.1.1 索引静态配置

  • index.number_of_shards 主分片数,默认为5。只能在创建索引时设置,不能修改。

  • index.shard.check_on_startup 是否在索引打开前检查分片是否损坏,当检查到分片损坏将禁止分片被打开。可选值:false:不检测;checksum:只检查物理结构;true:检查物理和逻辑损坏,相对比较耗CPU;fix:类同与false,7.0版本后将废弃。默认值:false。

  • index.codec 数据存储的压缩算法,默认算法为LZ4,也可以设置成best_compression,best_compression压缩比较好,但存储性能比LZ4差。

  • index.routing_partition_size 路由分区数,默认为 1,只能在索引创建时设置。此值必须小于index.number_of_shards,如果设置了该参数,如果设置了该参数,其路由算法为: (hash(_routing) + hash(_id) % index.routing_parttion_size ) % number_of_shards。如果该值不设置,则路由算法为 hash(_routing) % number_of_shardings_routing默认值为_id

3.1.2 索引动态配置

  • index.refresh_interval 执行刷新操作的频率,这使得索引的最近更改可以被搜索。默认为 1s。可以设置为 -1 以禁用刷新。

  • index.max_result_window 用于索引搜索的 from+size 的最大值。默认为 10000。

  • index.max_docvalue_fields_search 一次查询最多包含开启doc_values字段的个数,默认为100。

  • index.number_of_replicas 每个主分片的副本数,默认为 1,该值必须大于等于0

  • index.auto_expand_replicas 基于可用节点的数量自动分配副本数量,默认为 false(即禁用此功能)

  • index.blocks.read_only 设置为 true 使索引和索引元数据为只读,false 为允许写入和元数据更改。

  • index.max_rescore_window 在搜索此索引中 rescore 的 window_size 最大值

  • index.blocks.read_only_allow_delete 与index.blocks.read_only基本类似,唯一的区别是允许删除动作。

  • index.blocks.write 设置为 true 可禁用对索引的写入操作。

  • index.blocks.read 设置为 true 可禁用对索引的读取操作

  • index.blocks.metadata 设置为 true 可禁用索引元数据的读取和写入。

  • index.max_refresh_listeners 索引的每个分片上可用的最大刷新侦听器数。

对于已存在的索引,我们想要修改它的动态配置,可以使用_settings方法。

PUT  /test_setting/_settings
{
    "number_of_replicas": "0"              
}

3.2 mapping配置

通常索引的 Mapping 结构可以在创建索引时由 ElasticSearch 帮我们自动构建,字段类型由 ElasticSearch 自动推断,但这样做有一些问题,比如字段类型推断不准确,默认所有字段都会构建倒排索引等,自定义Mapping就可以解决上述这些问题。

我们在创建索引的时候,指定了mapping属性,mapping属性中规定索引中有哪些字段,字段的类型是什么。在mapping中,我们可以定义如下内容:

  • 类型为String的字段,将会被全文索引;
  • 其他的字段类型包括:数字、日期和geo(地理坐标);
  • 日期类型的格式;
  • 动态添加字段的映射规则;

3.2.1 字段类型

字段的可用类型如下:

  • 简单的类型,比如:text(分词),keyword(不分词),date,long,double,boolean,ip。我们可以看到,类型当中没有String,字符串的类型是text,所有text类型的字段都会被全文索引。数字类型有两个,long(长整型)和double(浮点型)。
  • JSON的层级类型:Object(对象)和Nested(数组对象)。Object类型时,该字段可以存储一个JSON对象;Nested类型时,该字段可以存储一个数组对象。
  • 复杂的类型:包括 geo_point、geo_shape和completion。

常用数据类型text、keyword、number、array、range、boolean、date、geo_point、ip、nested、object介绍:

  • text:默认会进行分词,支持模糊查询(5.x之后版本string类型已废弃,请大家使用text)。
  • keyword:不进行分词,默认开启doc_values来加速聚合排序操作,占用了大量磁盘io 如非必须可以禁用doc_values。
  • number:如果只有过滤场景 用不到range查询的话,使用keyword性能更佳,另外数字类型的doc_values比字符串更容易压缩。
  • range:对数据的范围进行索引,目前支持 number range、date range 、ip range。
  • array:es不需要显示定义数组类型,只需要在插入数据时用’[]‘表示即可。[]中的元素类型需保持一致。
  • boolean: 只接受true、false,也可以是字符串类型的“true”、“false”。
  • date:支持毫秒、根据指定的format解析对应的日期格式,内部以long类型存储。
  • geo_point:存储经纬度数据对。
  • ip:将ip数据存储在这种数据类型中,方便后期对ip字段的模糊与范围查询。
  • ested:嵌套类型,一种特殊的object类型,存储object数组,可检索内部子项。
  • object:嵌套类型,不支持数组。
{
  "mappings": {
    "properties": {
      "price": {
        "type": "long"
      },
      "color": {
        "type": "keyword"
      },
      "brand": {
        "type": "keyword"
      },
      "sold_date": {
        "type": "date", // 使用date类型时要指定format,否则在使用range查询+时间表达式now/d等时,会特别坑爹
        "format":"yyyyMMdd"
      }
    }
  }
}

3.2.2 字段参数

字段参数如下:

"field": {  
	 "type":  "text", //文本类型  ,指定类型
   
	 "index": "false"// ,设置成false,字段将不会被索引  
	 
	 "analyzer":"ik"//指定分词器  
	 
	 "boost":1.23//字段级别的分数加权  
	 
	 "doc_values":false//对not_analyzed字段,默认都是开启,analyzed字段不能使用,对排序和聚合能提升较大性能,节约内存,如果您确定不需要对字段进行排序或聚合,或者从script访问字段值,则可以禁用doc值以节省磁盘空间:
	 
	 "fielddata":{"loading" : "eager" }//Elasticsearch 加载内存 fielddata 的默认行为是 延迟 加载 。 当 Elasticsearch 第一次查询某个字段时,它将会完整加载这个字段所有 Segment 中的倒排索引到内存中,以便于以后的查询能够获取更好的性能。
	 
	 "fields":{"keyword": {"type": "keyword","ignore_above": 256}} //可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词  
	 
	 "ignore_above":100 //超过100个字符的文本,将会被忽略,不被索引
	   
	 "include_in_all":ture//设置是否此字段包含在_all字段中,默认是true,除非index设置成no选项  
	 
	 "index_options":"docs"//4个可选参数docs(索引文档号) ,freqs(文档号+词频),positions(文档号+词频+位置,通常用来距离查询),offsets(文档号+词频+位置+偏移量,通常被使用在高亮字段)分词字段默认是position,其他的默认是docs  
	 
	 "norms":{"enable":true,"loading":"lazy"}//分词字段默认配置,不分词字段:默认{"enable":false},存储长度因子和索引时boost,建议对需要参与评分字段使用 ,会额外增加内存消耗量  
	 
	 "null_value":"NULL"//设置一些缺失字段的初始化值,只有string可以使用,分词字段的null值也会被分词  
	 
	 "position_increament_gap":0//影响距离查询或近似查询,可以设置在多值字段的数据上火分词字段上,查询时可指定slop间隔,默认值是100  
	 
	 "store":false//是否单独设置此字段的是否存储而从_source字段中分离,默认是false,只能搜索,不能获取值  
	 
	 "search_analyzer":"ik"//设置搜索时的分词器,默认跟ananlyzer是一致的,比如index时用standard+ngram,搜索时用standard用来完成自动提示功能  
	 
	 "similarity":"BM25"//默认是TF/IDF算法,指定一个字段评分策略,仅仅对字符串型和分词类型有效  
	 
	 "term_vector":"no"//默认不存储向量信息,支持参数yes(term存储),with_positions(term+位置),with_offsets(term+偏移量),with_positions_offsets(term+位置+偏移量) 对快速高亮fast vector highlighter能提升性能,但开启又会加大索引体积,不适合大数据量用  
   }

字段参数中常用的有:

  • type:field的类型。
  • index:该field是否会被索引。
  • analyzer:指定的分词器。
  • doc_values:开启后对聚合入分组或排序有增益,默认开启。

3.3 mapping之date date_nanos

JSON没有date数据类型,但我们可以把以下类型的数据作为日期时间存入ES。在ES的内部,这些数据都是按照毫秒数(长整型)存储的,展现形式有如下多种。

类型 说明
字符串 日期格式的字符串,如"2015-01-01"或"2015/01/01 12:10:30"
长整型 从开始纪元(1970-01-01 00:00:00 UTC)开始的毫秒数
整型 从开始纪元(1970-01-01 00:00:00 UTC)开始的秒数

上面的UTC(Universal Time Coordinated) 叫做世界统一时间,中国大陆和 UTC 的时差是 + 8 ,也就是 UTC+8。在ES内部,时间以毫秒数的UTC存储。

date的格式(日期格式)可以被指定的,如果没有特殊指定,默认格式是"strict_date_optional_time||epoch_millis",这段话可以理解为格式为strict_date_optional_time或者epoch_millis。

(1)什么是epoch_millis?

epoch_millis就是从开始纪元(1970-01-01 00:00:00 UTC)开始的毫秒数-长整型。

如下图,2020/8/31 14:57:56是我们常用的日期格式,它距离1970-01-01 00:00:00 有 1598857076000豪秒。所以可以用长整型1598857076000表示2020/8/31 14:57:56。

image-1665203282598

(2)什么是strict_date_optional_time?

strict_date_optional_time是date_optional_time的严格级别,这个严格指的是年份、月份、天必须分别以4位、2位、2位表示,不足两位的话第一位需用0补齐。

常见的格式如下:

  • yyyy
  • yyyyMM
  • yyyyMMdd
  • yyyyMMddHHmmss
  • yyyy-MM
  • yyyy-MM-dd
  • yyyy-MM-ddTHH:mm:ss
  • yyyy-MM-ddTHH:mm:ss.SSS
  • yyyy-MM-ddTHH:mm:ss.SSSZ

工作常见到是"yyyy-MM-dd HH:mm:ss",但是ES是不支持这格式的,需要在dd后面加个T,这个是固定格式。上面最后一个大写的"Z"表示时区。

就是想用yyyy-MM-dd HH:mm:ss怎么办?

date类型,还支持一个参数format,它让我们可以自己定制化日期格式。

比如format配置了“格式A||格式B||格式C”,插入一个值后,会从左往右匹配,直到有一个格式匹配上。

{
    "mappings":{
        "properties":{
            "birthday":{
                "type":"date",
                "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            }
        }
    }
}

(3)date_nanos类型,支持纳秒

date类型支持到毫秒,如果特殊情况下用到纳秒得用date_nanos这个类型。

4、ES7为什么废弃type类型

以下两种场景,大家应该都见过:

  • 同一个index下,不同的type,命名名称一样的字段名。

  • 同一个数据库下,不同的表,命名名称一样的字段名。

在关系型数据库中,不同的表中,包含相同的字段名是很常见的,而且它们可以做到互不干扰。而在ElasticSearch中,不同的type,如果包含相同的字段名,它们是一样的,es会认为是一个字段,模糊掉不同type的概念。所以在es里边,type这个概念没必要存在,因此在es7中就废弃了type。

  • 想尝试的朋友们可以试一下,在同一个index中,不同的type,创建一个同名的字段,但是类型不要弄成一样的,看能否成功创建。

    • 答案是不可以,它会提示你,不可以将这个字段的类型更改为这个类型。
illegla_argument_exception
mapper [create_time_] cannot be changed from type [date] to [keyword]

结论就是,es确实把不同type中的同名字段,当成了一个字段。因此在设计索引库的时候,同名问题一定要注意,最简单的方法就是一个index,一个type,想要其他类型,另外创建index,当然你可以用别的字段名。

  • 注意:ES7废弃,但还在用,ES8才真正的去掉了type。
0

评论区