ES 学习记录
一、安装es以及kibana
参看:https://www.cnblogs.com/kakatadage/p/9922359.html
二、查看官方使用文档
参看:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/index.html
三、index相关操作
注:以下 test 均为索引名
1.创建index
(1)最简单的创建方式,参数均使用默认配置
PUT /test
(2)可以带三个参数:aliases、mappings以及settings
- aliases: 给一个或者多个index赋予另外一个别名
eg:
给单个index添加别名
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "test1", "alias" : "alias1"
}
}
]
}
or
PUT /test/_alias/alias1
给多个index添加别名
POST /_aliases
{
"actions" : [
{
"add" : {
"indices" : ["test1", "test2"], "alias" : "alias1"
}
}
]
}
创建索引时取别名
PUT /test
{
"aliases": {
"test-1": {}
}
}
- mappings:索引index里面的数据结构,就像JAVA对象一样,其里面还包含这种属性(Field;注意:ES 不支持修改已有的Filed名字和类型)
eg:
PUT /test/_mapping
{
"properties": {
"email": {
"type": "keyword"
}
}
}
获取mapping
GET /test/_mapping
获取mapping field
GET /test/_mapping/field/fieldName
删除mapping field
- settings: index的一些参数有如下参数:
-- include_type_name(是否包含mapping type;默认 false;注意:mapping types 在7.x的时候被移除,具体原因参看:https://www.elastic.co/guide/en/elasticsearch/reference/7.3/removal-of-types.html#_custom_type_field)
-- wait_for_active_shards(等待副本节点都处于活动状态才进行操作,否则一直等待直至超时;默认1,即仅等待主分片在继续操作之前处于活动状态)
-- timeout(操作超时时间;默认30s)
-- master_timeout (连接master节点超时时间;默认30s)
eg:
PUT /test
{
"settings" : { // 在7.x版本:分片数和备份数默认都是 1
"number_of_shards" : "1",
"number_of_replicas" : "1",
},
"mappings" : {
"properties" : {
"field1" : { "type" : "text" }
}
}
}
注意:由于在7.x的时候,mapping types被移除,所以每个index只存储一个实体
2.创建Mapping
(1)在创建index的时候创建
PUT /test
{
"settings" : { // 在7.x版本:分片数和备份数默认都是 1
"number_of_shards" : "1",
"number_of_replicas" : "1",
},
"mappings" : {
"properties" : {
"field1" : { "type" : "text" }
}
}
}
(2)在已有的index里创建
PUT /test/_mapping
{
"properties": {
"email": {
"type": "keyword"
}
}
}
注意:ES 不支持修改已有的Filed名字和类型
3.删除index
(1)删除单个
DELETE /twitter
(2)删除多个/全部(注意:此操作非常危险,所以此操作是可以禁止的,即将 elasticsearch.yml 配置中的 action.destructive_requires_name 设置为true,此时删除索引就需要指明明确的索引名)
DELETE _all 或者 DELETE xx*
4.获取index详情
(1)获取单个
GET /test
(2)获取多个/所有
GET _all 或者 GET xx*
5.判断某个index是否存在(存在则返回 200;否则返回 404)
HEAD /test
注意:此处 test 为索引名,但是如果不存在名为 test 的索引,但是存在别名为 test 也判断为true
6.关闭/开启索引(一旦关闭则无法对索引进行读写操作)
POST /test/_close
POST /test/_open
注意:也可以和删除操作一样使用_all关键字或模糊匹配关闭多个索引,当然也可以禁用此操作,即设置 action.destructive_requires_name 为 true。关闭索引操作非常占用磁盘空间,所以可以设置 cluster.indices.close.enable = false 禁用关闭索引操作,默认是 true.
7.收缩索引(将一个索引迁至一个主分片更少的索引,但是目标索引的分片数,必须是源索引分片数的因子。比如,源索引的分片数是:8,那么目标索引的分片数可以是:4, 2, 1;)
(1)将索引设置为只读且将所有副本迁至同一个节点(收缩前提条件:副本必须在同一节点)
PUT /my_source_index/_settings
{
"settings": {
"index.routing.allocation.require._name":
"shrink_node_name", // 强制将每个分片的副本重定位到名为shrink_node_name的节点
"index.blocks.write": true // 设置为只读
}
}
(2)创建目标索引(基于源索引复制一份)
POST my_source_index/_shrink/my_target_index?copy_settings=true
{
"settings": {
"index.routing.allocation.require._name": null, // 清除源索引 强制将每个分片的副本重定位到名为shrink_node_name的节点 配置
"index.blocks.write": null // 清除源索引 设置为只读 配置
}
}
(3)迁移
POST my_source_index/_shrink/my_target_index?copy_settings=true
{
"settings": {
"index.number_of_replicas": 1, // 副本个数
"index.number_of_shards": 1, // 分片数
"index.codec": "best_compression" // 最佳压缩仅在对索引进行新写入时生效,例如强制合并分片到单个段时
},
"aliases": {
"my_search_indices": {}
}
}
8.拓展索引(和收缩相反)
拆分规则:索引可以拆分多次,但拆分的最大分片数是由创建索引是的number_of_routing_shards决定的。拆分后的分片数量需是number_of_routing_shards的因子,即number_of_routing_shards是拆分后分片数的倍数。
例如,原有主分片为5,number_of_routing_shards=30的索引,可以按如下几种情况拆分:
5 → 10 → 30 (split by 2, then by 3)
5 → 15 → 30 (split by 3, then by 2)
5 → 30 (split by 6)
(1) 将源索引设置为只读
PUT /my_source_index/_settings
{
"settings": {
"index.blocks.write": true
}
}
(2)迁移
POST my_source_index/_split/my_target_index
{
"settings": {
"index.number_of_shards": 3
}
}
注意:拆分必须满足的条件:
- 目标索引必须不存在
- 索引的主碎片必须少于目标索引。
- 目标索引中的主碎片数量必须是源索引中的主碎片数量的一个因子。
- 处理拆分进程的节点必须有足够的空闲磁盘空间来容纳现有索引的第二个副本
9.利用别名自动抛弃旧索引而重新指向新索引
(1)创建索引并带上别名
PUT /logs-000001
{
"aliases": {
"logs_write": {}
}
}
(2)设置生成新索引规则
POST /logs_write/_rollover
{
"conditions": {
"max_age": "7d", // 7天
"max_docs": 1000, // 1000行
"max_size": "5gb" // 5GB
}
}
即logs-000001文件自创建以来存活7天或者最大文档数超过1000或者索引主分片最大超过5GB 则会自动创建logs-000002.其索引生成规则:如果现有索引的名称以 - 和数字结尾,例如 logs-000001,然后新索引的名称将遵循相同的模式,递增数字(logs-000002)。如果不是以-和数字结尾则需要自定义名字
POST /logs_write/_rollover/my_new_index_name
{
"conditions": {
"max_age": "7d",
"max_docs": 1000,
"max_size": "5gb"
}
}
10.冻结/解冻索引(被冻结的索引无法进行写入操作)
POST /my_index/_freeze
POST /my_index/_unfreeze
11. 数据从一个index迁移至另一个index
POST _reindex
{
"source": {
"index": "bigdata-event"
},
"dest": {
"index": "bigdata-event-test"
}
}
四、数据相关操作(根据ID基础操作)
1.数据插入
一共如下四种方式:_doc 和 _create 区别在于,_doc 是如果插入数据已经存在则会更新,而_create只能是插入不存在的数据;默认情况下如果插入的index以及mapping不存在则会自动创建,也可以通过设置让其不自动创建,设置参数为:action.auto_create_index
PUT /<index>/_doc/<_id> POST /<index>/_doc/ PUT /<index>/_create/<_id> POST /<index>/_create/<_id>
(1)自增ID插入(使用POST请求)
POST my-index/_doc
{
"age": 0
}
(2)自己创建ID插入(使用PUT请求)
PUT my-index/_doc/2
{
"age": 0
}
(3)upSert方法,记录不存在就插入,否则就执行脚本做更新
POST test/_doc/2/_update
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
},
"upsert" : {
"counter" : 1
}
}
(4)记录不存在就插入,否则就更新相应字段(counter),无需更新的字段不要传,否则会更新,即使字段值为null也会更新为null
POST test/_doc/1/_update
{
"doc" : {
"counter" : 7
}
}
(5)对已有数据进行更新
POST bigdata-archive/_update_by_query
{
"script": {
"source": "ctx._source['imageCount']=0"
},
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "imageCount"
}
}
]
}
}
}
2.数据查找
一共如下四种方式: GET 获取数据,HEAD 验证数据是否存在;默认情况下每次 GET 都会刷新索引以保证数据是最新的,也可以关闭此功能,通过设置:realtime = false 实现;_source 只返回 fields(可指定返回哪些field) 而 _doc 返回 index 所有信息;
GET <index>/_doc/<_id> HEAD <index>/_doc/<_id> GET <index>/_source/<_id> HEAD <index>/_source/<_id>
3.删除数据
DELETE /<index>/_doc/<_id>
4.更新数据
POST /<index>/_update/<_id>
(1)一般修改方式,当然也可以用数据插入方式覆盖已有的字段
POST test/_update/1
{
"doc" : {
"name" : "new_name"
}
}
(2)使用脚本修改(默认是使用ES脚本)
POST test/_update/1
{
"script" : {
"source": "ctx._source.counter +=
params.count",
"lang": "painless",
"params" : {
"count" : 4
}
}
}
五、查询
1.根据条件分页查询(具体有关QUERY操作参看官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/query-dsl.html)
POST test/_search
{
"query": {
"match_all": {
}
// "match": {
// "filedName": xxx
// }
},
"sort": [
{
"counter": {
"order": "asc"
}
}
],
"from": 1,
"size": 1
}
2.聚合查询(aggs:聚合查询关键词;参看官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/search-aggregations.html)
POST test/_search
{
"aggs": {
"avg_grade": {
"avg": {
"field": "counter"
}
}
}
}
概念:聚合是ES的优秀特性,理解聚合只要理解:桶和指标(详细参看官网:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_aggregation_test_drive.html)
2.1 terms桶基本操作
GET bigdata-archive/_search
{
"size" : 0,
"aggs" : {
"group_by_age" : {
"terms" : {
"field" : "age"
}
}
}
}
erms 指明了桶的类型,也就是按照age分组;注意size:0是为了提高查询速度而存在的,也就是不会对"hits" : [ ]这个值进行统计而返回空
2.2 对每个桶里面的数据进行分析
GET bigdata-archive/_search
{
"size" : 0,
"aggs" : {
"group_by_aid" : {
"terms" : {
"field" : "age"
},
"aggs": {
"man": {
"range": {
"field": "gender",
"ranges": [
{
"from": 0,
"to": 1
}
]
}
}
}
}
}
}
分析每个桶里面gender属性在0和1之间的数目
2.3 分批聚合
GET bigdata-event-test/_search
{
"size": 0,
"query" : {
"constant_score": {
"filter": {
"range": {
"aid": {
"gte": "2"
}
}
}
}
},
"aggs": {
"group_by_aid": {
"terms": {
"field": "aid",
"size": 10
}
}
}
}
3.模糊查询(具体参看官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/query-dsl-query-string-query.html)
POST test/_search
{
"query": {
"query_string": {
"query": 1,
"fields": ["counter"]
}
}
}