ElasticSearch学习七 ES简单操作
7.1、Restful
rest是Representational State Transfer三个单词的缩写,表现层状态转移,或者表述性状态转移。
Rest是web服务的一种架构风格,一种设计风格,是一种思想;同时Rest不是针对某一种编程语言的。
以webService为例通俗解释。
非Rest设计,以往我们都会这么写:
http://localhost:8080/admin/getUser (查询用户)
http://localhost:8080/admin/addUser (新增用户)
http://localhost:8080/admin/updateUser (更新用户)
http://localhost:8080/admin/deleteUser (删除用户)
以不同的URL(主要为使用动词)进行不同的操作。
Rest架构:
GET http://localhost:8080/admin/user (查询用户)
POST http://localhost:8080/admin/user (新增用户)
PUT http://localhost:8080/admin/user (更新用户)
DELETE http://localhost:8080/admin/user (删除用户)
URL只指定资源,以HTTP方法动词进行不同的操作。用HTTP STATUS/CODE定义操作结果。
7.2、操作索引
操作语法
PUT|GET|POST|DELETE http://ip:port/索引名称
以"_"开头的表示内置的一些命令或者内置的一些属性,例如每个索引都有mappings、settings等,可以采用以下的语法访问内置的属性。
例如:http://ip:port/索引名称/_mappings
,表示查询某个索引下的mappings属性的值。
http://ip:port/_all
,表示查询所有的索引
添加索引
PUT http://ip:port/索引名称
添加所以在ES中是Put请求,并非Post请求。下面是添加索引的操作
查询索引
GET http://ip:port/索引名称
在ES的操作中,GET请求是查询索引,用GET请求查询刚才创建的索引
GET http://192.168.2.135:9200/goods_index
返回结果
{
"goods_index": {
"aliases": {},
"mappings": {},
"settings": {
"index": {
"creation_date": "1651392797166",
"number_of_shards": "1",
"number_of_replicas": "1",
"uuid": "qPbYkcIGTyKsFi0dI0JLEg",
"version": {
"created": "7040299"
},
"provided_name": "goods_index"
}
}
}
}
删除索引
DELETE http://ip:port/索引名称
在ES的操作中,DELETE是删除索引
DELETE http://192.168.2.135:9200/goods_index
{
"acknowledged": true
}
关闭索引
POST http://ip:port/索引名称/_close
在ES的操作中,POST请求是修改,关闭索引其实是修改索引,用POST请求。
POST http://192.168.2.135:9200/goods_index/_close
返回结果
{
"acknowledged": true,
"shards_acknowledged": true,
"indices": {
"goods_index": {
"closed": true
}
}
}
注意:在ES中,以"_"为开头的命令都是ES内置的命令,例如_close、_open、_all
打开索引
POST http://ip:port/索引名称/_open
在ES的操作中,POST请求是修改,关闭索引其实是修改索引,用POST请求。
POST http://192.168.2.135:9200/goods_index/_open
返回结果
{
"acknowledged": true,
"shards_acknowledged": true
}
7.3、映射Mappings
ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。
同样的, 一个number类型的mapping字段只能存储number类型的数据。
同静态语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。
mapping中字段类型一旦设定后 禁止直接修改。因为lucene实现的倒排索引生成后不允许修改。除非重建索引映射,然后做reindex操作。
mapping字段类型
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
-
嵌套类型 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" } } }}}}
-
对象 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" } } }
-
-
地理类型
-
-
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 时间评分因子,如果不关心评分可以禁用
mapping操作
映射创建完成之后,ES是不允许直接修改字段名字或者删除映射。因为后面需要对字段进行检索或者查询。
操作语法
PUT|GET http://ip:port/索引/_mapping
添加映射
创建完索引之后添加映射
PUT http://192.168.2.128:9200/person/_mappings
{
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
}
}
}
创建索引时添加映射
PUT http://192.168.2.128:9200/person
{
"mappings":{
"properties":{
"name":{
"type":"keyword"
},
"age":{
"type":"integer"
}
}
}
}
查询映射
PUT http://192.168.2.128:9200/person/_mapping
//返回的结果如下
{
"person": {
"aliases": {},
// 下面的mappings就是添加的索引
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"name": {
"type": "keyword"
}
}
},
"settings": {
"index": {
"creation_date": "1651547517051",
"number_of_shards": "1",
"number_of_replicas": "1",
"uuid": "t979BGXtS52FtEi7rGy7jg",
"version": {
"created": "7040299"
},
"provided_name": "person"
}
}
}
}
添加字段
为已经存在的索引添加字段
put http://192.168.2.135:9200/person/_mappings
{
"properties":{
"address":{
"type":"text"
}
}
}
7.4、操作文档
添加文档
语法
从es7之后,就没有类型了,所有的类型都是默认为_doc
put|post http://ip:port/索引名称/_doc/id
指定id
指定id可以用put请求,也可以用post请求
put http://192.168.2.135:9200/person/_doc/1
{
"name":"张三",
"age":20,
"address":"杭州市萧山区"
}
// 运行结果
{
"_index": "person",
"_type": "_doc",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
不指定id
不指定id,只能用post请求
post http://192.168.2.135:9200/person/_doc/
{
"name":"李四",
"age":30,
"address":"杭州市滨江区"
}
// 运行结果
{
"_index": "person",
"_type": "_doc",
"_id": "ijEGiIABZy4G6iwbrBf2", //此是id是随机生成
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
查询文档
指定Id的方式查询文档
get http://192.168.2.135:9200/person/_doc/1
//运行结果
{
"_index": "person",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"name": "张三",
"age": 20,
"address": "杭州市萧山区"
}
}
查询所有的文档
get http://192.168.2.135:9200/person/_search
{
"took": 65,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "person",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"name": "张三",
"age": 20,
"address": "杭州市萧山区"
}
},
{
"_index": "person",
"_type": "_doc",
"_id": "ijEGiIABZy4G6iwbrBf2",
"_score": 1.0,
"_source": {
"name": "李四",
"age": 30,
"address": "杭州市滨江区"
}
}
]
}
}
修改文档
修改文档与添加文档一样,如果id存在就是修改,如果id不存在就是添加
put http://192.168.2.135:9200/person/_doc/1
{
"name":"张三",
"age":30,
"address":"杭州市滨江区"
}
//运行结果
{
"_index": "person",
"_type": "_doc",
"_id": "1",
"_version": 2,
"result": "updated",//修改操作
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 5,
"_primary_term": 1
}
删除文档
delete http://192.168.2.135:9200/person/_doc/1
//运行结果
{
"_index": "person",
"_type": "_doc",
"_id": "1",
"_version": 2,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?