以下操作均在Kibana控制台中操作,如果没有安装Kibana,请参考
索引操作
创建索引
PUT 索引名称
返回结果
{ "acknowledged" : true, #相应结果 "shards_acknowledged" : true, #分片结果 "index" : "shopping" #索引名称 }
查看所有索引
GET _cat/indices?v
返回结果
#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.17/security-minimal-setup.html to enable security. health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .geoip_databases jJzJ8NqKTy-8FgNaf5SdJA 1 1 40 0 76mb 38mb green open .kibana_7.17.5_001 wWYEv87aQJKj5SqVg4D0Bg 1 1 319 13 4.9mb 2.4mb green open .apm-custom-link 9VGGjqf6Tauky2jvVF5S3w 1 1 0 0 452b 226b green open .apm-agent-configuration oSAFVMXORBGFStCo99Pbpg 1 1 0 0 452b 226b green open .kibana_task_manager_7.17.5_001 EQjofbqeRQa-g1X2q8FdHw 1 1 17 4608 1.6mb 872.4kb green open .tasks SfWxf58PTFWCxl2Cr_E9Ig 1 1 4 0 37.2kb 21.6kb green open shopping nalws8zmTwGgnBG7DCzrZQ 1 1 0 0 452b 226b
表头 | 含义 |
health | 当前服务器健康状态:green(集群完整) yellow(单点正常、集群不完整) red(单点不正常) |
status | 索引打开、关闭状态 |
index | 索引名 |
uuid | 索引统一编号 |
pri | 主分片数量 |
rep | 副本数量 |
docs.count | 可用文档数量 |
docs.deleted | 文档删除状态(逻辑删除) |
store.size | 主分片和副分片整体占空间大小 |
pri.store.size | 主分片占空间大小 |
查看单个索引
GET 索引名
返回结果
{ "shopping" : { "aliases" : { }, "mappings" : { }, "settings" : { "index" : { "routing" : { "allocation" : { "include" : { "_tier_preference" : "data_content" } } }, "number_of_shards" : "1", "provided_name" : "shopping", "creation_date" : "1656925110403", "number_of_replicas" : "1", "uuid" : "nalws8zmTwGgnBG7DCzrZQ", "version" : { "created" : "7170599" } } } } }
{ "shopping"【索引名】: { "aliases"【别名】: {}, "mappings"【映射】: {}, "settings"【设置】: { "index"【设置 - 索引】: { "creation_date"【设置 - 索引 - 创建时间】: "1614265373911", "number_of_shards"【设置 - 索引 - 主分片数量】: "1", "number_of_replicas"【设置 - 索引 - 副分片数量】: "1", "uuid"【设置 - 索引 - 唯一标识】: "eI5wemRERTumxGCc1bAk2A", "version"【设置 - 索引 - 版本】: { "created": "7080099" }, "provided_name"【设置 - 索引 - 名称】: "shopping" } } } }
删除索引
DELETE shopping
文档操作
创建文档
POST shopping/_doc { "title":"小米手机", "category":"小米", "images":"http://www.gulixueyuan.com/xm.jpg", "price":3999.00 }
返回结果
{ "_index"【索引】: "shopping", "_type"【类型-文档】: "_doc", "_id"【唯一标识】: "Xhsa2ncBlvF_7lxyCE9G", #可以类比为 MySQL 中的主键,随机生成 "_version"【版本】: 1, "result"【结果】: "created", #这里的 create 表示创建成功 "_shards"【分片】: { "total"【分片 - 总数】: 2, "successful"【分片 - 成功】: 1, "failed"【分片 - 失败】: 0 }, "_seq_no": 0, "_primary_term": 1 }
上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下,ES 服务器会随机生成一个。
如果想要自定义唯一性标识,需要在创建时指定:POST shopping/_doc/1
此处需要注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT
查看文档
查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询
GET shopping/_doc/id
修改文档
和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖
POST shopping/_doc/1 { "title":"小米手机", "category":"小米", "images":"http://www.gulixueyuan.com/xm.jpg", "price":3999.00 }
修改和新增是一样的
修改字段
修改数据时,也可以只修改某一给条数据的局部信息
POST shopping/_update/1 { "doc": { "price":100 } }
删除文档
DELETE shopping/_doc/1
条件删除文档
删除价格为4000的数据
POST shopping/_delete_by_query { "query":{ "match":{ "price" : 4000 } } }
映射操作
有了索引库,等于有了数据库中的 database。
接下来就需要建索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。
创建映射
PUT student/_mapping { "properties": { "name": { "type": "text", "index": true }, "sex": { "type": "text", "index": false }, "age": { "type": "long", "index": false } } }
映射数据说明:
字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price
type:类型,Elasticsearch 中支持的数据类型非常丰富,说几个关键的:
String 类型,又分两种:text:可分词 、keyword:不可分词,数据会作为完整字段进行匹配
Numerical:数值类型,分两类
基本数据类型:long、integer、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float
Date:日期类型
Array:数组类型
Object:对象
index:是否索引,默认为 true,也就是说你不进行任何配置,所有字段都会被索引。
true:字段会被索引,则可以用来进行搜索
false:字段不会被索引,不能用来搜索
store:是否将数据进行独立存储,默认为 false
原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
analyzer:分词器,这里的 ik_max_word 即使用 ik 分词器
查看映射
GET shopping/_mapping
查询
POST /student/_doc/1001 { "name":"zhangsan", "nickname":"zhangsan", "sex":"男", "age":30 } POST /student/_doc/1002 { "name":"lisi", "nickname":"lisi", "sex":"男", "age":20 } POST /student/_doc/1003 { "name":"wangwu", "nickname":"wangwu", "sex":"女", "age":40 } POST /student/_doc/1004 { "name":"zhangsan1", "nickname":"zhangsan1", "sex":"女", "age":50 } POST /student/_doc/1005 { "name":"zhangsan2", "nickname":"zhangsan2", "sex":"女", "age":30 }
查询全部文档
GET student/_search { "query": { "match_all": {} } } # "query":这里的 query 代表一个查询对象,里面可以有不同的查询属性 # "match_all":查询类型,例如:match_all(代表查询所有), match,term , range 等等 # {查询条件}:查询条件会根据类型的不同,写法也有差异
返回数据字段解释
{ "took【查询花费时间,单位毫秒】" : 1116, "timed_out【是否超时】" : false, "_shards【分片信息】" : { "total【总数】" : 1, "successful【成功】" : 1, "skipped【忽略】" : 0, "failed【失败】" : 0 }, "hits【搜索命中结果】" : { "total"【搜索条件匹配的文档总数】: { "value"【总命中计数的值】: 3, "relation"【计数规则】: "eq" # eq 表示计数准确, gte 表示计数不准确 }, "max_score【匹配度分值】" : 1.0, "hits【命中结果集合】" : [ 。。。 } ] } }
匹配查询
GET student/_search { "query": { "match": { "name": "zhangsan" } } }
字段匹配查询
multi_match 与 match 类似,不同的是它可以在多个字段中查询。
查询name和nickname中为zhangsan的数据
GET student/_search { "query": { "multi_match": { "query": "zhangsan", "fields": ["name","nickname"] } } }
关键字精确查询
GET student/_search { "query": { "term": { "name": { "value": "zhangsan" } } } }
多关键字查询
GET student/_search { "query": { "terms": { "name": ["zhangsan", "lisi"] } } }
指定查询字段
只查询name、nickname字段,并且nickname是zhangsan
GET student/_search { "_source": ["name", "nickname"], "query": { "terms": { "nickname": ["zhangsan"] } } }
过滤
includes:来指定想要显示的字段
excludes:来指定不想要显示的字段
GET student/_search { "_source": { "includes": ["name", "nickname"] }, "query": { "terms": { "nickname": ["zhangsan"] } } }