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

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

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

目 录CONTENT

文章目录

ES教程5-ES可视化工具elasticsearch-head的使用 - 文档操作

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

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

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

image-1665191498793

1、创建索引

创建地址如下,其中 product 表示索引名称,请求方式选择PUT。

http://172.19.82.206:9200/product/

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

{
    "settings": {
        "index": {
            "number_of_shards": 3,
            "number_of_replicas": 2
        }
    },
    "mappings": {
        "properties": {
            "brandName": {
                "type": "text"
            },
            "categoryName": {
                "type": "text"
            },
            "description": {
                "type": "text"
            },
            "id": {
                "type": "long"
            },
            "productName": {
                "type": "text",
                "fields": {
                    "raw": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "utime": {
                "type": "date_nanos",
                "index": false
            }
        }
    }
}

image-1665205904133

2、文档操作

es6时,官方就提到了es7会删除type,并且es6时已经规定每一个index只能有一个type。在es7中使用默认的 _doc 作为type,官方说在8.x版本会彻底移除type。

api请求方式也发送变化,对索引的文档进行操作的时候,默认使用的Type是 _doc, 如获得某索引的某ID的文档:GET index/_doc/id, 其中index和id为具体的值。

2.1 添加文档

es数据的插入方式如下:

PUT /product/_doc/1

其中的product是索引名;_doc是类型(ES7后type都是_doc);1代表这条数据的主键;如果id不填也,ES会自动生成一条主键,不过这时就不能用PUT了,需要使用POST添加。BODY如下:

{
    "id": 10001,
    "productName": "牛肉片(花卉牌)",
    "brandName": "花卉牌",
    "categoryName": "零食",
    "utime": 1614666414
}

image-1665206163487

查询插入结果:

GET /product/_doc/1   //查询ID为1的数据

image-1665207118228

通过POST方式添加一条数据:

{
  "id": 10002,
  "productName": "森马秋冬小脚库",
  "brandName": "森马",
  "categoryName": "长裤",
  "utime": 1614667414
}

image-1665207006191

image-1665207252459

2.2 修改文档

es数据的修改方式有2种,PUT覆盖文档的方式及POST修改字段的方式。

方式一:PUT方式修改

修改文档的方式和添加一样,需要指定已经存在的id,PUT方式进行修改,是把对应的文档覆盖掉。输入地址:

PUT /product/_doc/1

body内容如下:

{
    "id": 10001,
    "productName": "牛肉片(潮汕集锦)",
    "brandName": "潮汕集锦",
    "categoryName": "零食",
    "utime": 1614666414
}

image-1665207420520

查询修改后的结果如下:

image-1665207530379

方式二:POST方式修改

POST方式修改的话,可以针对对应field来修改,比PUT要轻量。输入地址:

POST /product/_doc/1/_update

body内容如下:

{ 
  "doc": {
    "categoryName":"小吃"
  }
}

image-1665207646204

查询修改后的结果如下:

image-1665207668390

2.3 查询文档

es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。由于DSL查询更为直观也更为简易,所以大都使用这种方式。

  • DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式。

  • 这里有一个地方注意的是官方文档里面给的例子的json结构只是一部分,并不是可以直接黏贴复制进去使用的。一般要在外面加个query为key的结构。

1)基本查询

在这个页签,可以做数据进项简单的查询。选择一个索引,然后再选择不同的查询条件,勾选“显示查询语句”,最后点击搜索,可以看到具体的查询json和查询结果

image-1665209849000

2)根据ID查询

在复合查询页签,可以使用json进行复杂的查询,也可发送put请求新增及跟新索引,使用delete请求删除索引等等。

根据索引时的ID查询的文档的RESTful接口如下:

GET /product/_doc/1   //查询ID为1的数据

image-1665207118228

3)轻量搜索

轻量搜索返回结果不仅告知匹配了哪些文档,还包含了整个文档本身:显示搜索结果给最终用户所需的全部信息。

返回所有属性

RESTful接口如下:

GET /product/_search

body内容如下:

{
  "query": {
    "match_all": {}
  }
}

上述语句查询所有数据,查询结果如下:

image-1665208629652

{
	"took": 5,
	"timed_out": false,
	"_shards": {
		"total": 8,
		"successful": 8,
		"skipped": 0,
		"failed": 0
	},
	"hits": {
		"total": {
			"value": 4,
			"relation": "eq"
		},
		"max_score": 1,
		"hits": [{
				"_index": "orgnization",
				"_type": "_doc",
				"_id": "OhTqtYMB_RZohkHa1lPP",
				"_score": 1,
				"_source": {
					"id": 1,
					"name": "dss"
				}
			},
			{
				"_index": "product",
				"_type": "_doc",
				"_id": "PhQOtoMB_RZohkHaWlOV",
				"_score": 1,
				"_source": {
					"id": 10002,
					"productName": "森马秋冬小脚库",
					"brandName": "森马",
					"categoryName": "长裤",
					"utime": 1614667414
				}
			},
			{
				"_index": "product",
				"_type": "_doc",
				"_id": "QBQStoMB_RZohkHaYlO2",
				"_score": 1,
				"_source": {
					"id": 10002,
					"productName": "森马秋冬小脚库",
					"brandName": "森马",
					"categoryName": "长裤",
					"utime": 1614667414
				}
			},
			{
				"_index": "product",
				"_type": "_doc",
				"_id": "1",
				"_score": 1,
				"_source": {
					"id": 10001,
					"productName": "牛肉片(潮汕集锦)",
					"brandName": "潮汕集锦",
					"categoryName": "小吃",
					"utime": 1614666414
				}
			}
		]
	}
}

返回结果说明:

  • took字段表示该操作的耗时(单位为毫秒)。
  • timed_out字段表示是否超时。
  • hits字段表示搜到的记录,数组形式。
  • total:返回记录数,本例是4条。
  • max_score:最高的匹配程度,本例是1.0。

返回部分属性

查询结果只返回部分属性

POST product/_doc/_search
{
  "_source": [
    "id", "productName"
  ],
   "query": {
    "match_all": {}
  }
}

通过 _source 字段来指定需要返回的字段。将 _source 设置为 false, 可以不显示原始字段,部分特殊场景下会用到。

{
    "_source": {
        "includes": [
            "id"
        ],
        "excludes": [
            "utime"
        ]
    },
    "query": {
        "match_all": {}
    }
}

其中includes代表需要返回的字段,excludes代表不要返回的字段。

注:这里是POST请求。

2.4 删除文档

es数据的删除有2种,一种是根据文档id来删除单个文档,另一种是删除索引(该索引下的所有文档也随之删除)。

DELETE product/_doc/1  //删除一个文档
DELETE product    //删除索引

在较新版本中,不支持delete操作,删除所有文档使用如下方式,RESTful接口如下:

GET /product/_delete_by_query

body内容如下:

{
  "query": {
    "match_all": {}
  }
}

执行结果如下:

image-1665212210223

刷新页面,查看数据浏览页签下的product索引,可以看到已经没有任何数据。

image-1665212349309

3、批量操作之bulk

bulk是es提供的一种批量增删改的操作API。bulk对JSON串有着严格的要求。每个JSON串不能换行,只能放在同一行,同时,相邻的JSON串之间必须要有换行(Linux下是\n;Window下是\r\n)。bulk的每个操作必须要一对JSON串(delete语法除外)。语法格式如下:

{ action: { metadata }}
{ request body        }
{ action: { metadata }}
{ request body        }

3.1 bulk示例

action 为 bulk的操作类型,有以下几种:

  • create 如果文档不存在就创建,但如果文档存在就返回错误
  • index 如果文档不存在就创建,如果文档存在就更新
  • update 更新一个文档,如果文档不存在就返回错误
  • delete 删除一个文档,如果要删除的文档id不存在,就返回错误

其中index是比较常用的。另外bulk的操作中,如果某一个操作失败,是不会影响其他文档的操作的,它会在返回结果中告诉你失败的详细的原因。

格式示例:

{"index":{"_index":"home","_type":"home",""_id":"2"}}
{"id": 2, "location": "南京市栖霞区马群街道29号", "money": 3000, "area":80, "type": "三居室", "style": "整租"}
  • 说明:
    • 第一行指定请求与索引和类型,可以选择的请求有"create",“index”,“delete”,“ubdate”, "_index"指定索引名,"_type"指定类型名,"_id"指定id。
    • 第二行指定插入的内容,如request.json:
  1. 索引及mapping准备
PUT example
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2
    },
    "mappings": {
        "properties": {
            "id": {
                "type": "long"
            },
            "name": {
                "type": "text"
            },
            "counter": {
                "type": "integer"
            },
            "tags": {
                "type": "text"
            }
        }
    }
}
  1. 批量新增
PUT example/_bulk
{"index": {"_id": 1}}
{"id":1, "name": "admin", "counter":"10", "tags":["red", "black"]}

{"index": {"_id": 2}}
{"id":2, "name": "张三", "counter":"20", "tags":["green", "purple"]}

{"index": {"_id": 3}}
{"id":3, "name": "李四", "counter":"30", "tags":["red", "blue"]}

{"index": {"_id": 4}}
{"id":4, "name": "tom", "counter":"40", "tags":["orange"]}
# 这里也有个换行的

注意:bulk语法要求必须两行json后换行,末尾也必须有一个换行。

  1. 批量修改
POST example/_bulk
{"update": {"_id": 1}}
{"doc": {"id":1, "name": "admin-02", "counter":"11"}}

{"update": {"_id": 2}}
{"script":{"lang":"painless","source":"ctx._source.counter += params.num","params": {"num":2}}}

{"update":{"_id": 3}}
{"doc": {"name": "test3333name", "counter": 999}}

{"update":{"_id": 4}}
{"doc": {"name": "test444name", "counter": 888},  "doc_as_upsert" : true}
# 这里有换行符
  1. 批量删除
POST example/_bulk
{"delete": {"_id": 1}}

{"delete": {"_id": 2}}

{"delete": {"_id": 3}}

{"delete": {"_id": 4}}
#这里有换行符

3.2 执行工具

批量操作使用postman执行(因为执行的内容体是多个json合并在一起,整体结构不是json格式,使用 elasticsearch-head 执行失败)。

  • API:POST /example/_bulk
  • 在Headers中将Content-Type设置为application/x-ndjson,
  • 在Body中选择raw-Text;
  • 最后一行多一个换行;

使用postman执行,Headers设置:

image-1665365257737

使用postman执行,Body设置及执行:

image-1665365368863

查询插入结果:

image-1665365341849

0

评论区