参考地址:https://blog.csdn.net/Zereao/article/details/89378283
基本格式
1、ElasticSearch是基于Restful API进行的数据库操作,基本格式如下:http://<ip>:<port>/<索引>/<类型>/<文档 id>
2、从ES7.0.0开始,Type就被移除了,所以路径格式变成了: http://<ip>:<port>/<索引>/_doc/<文档ID>
请求工具
1、使用elasticsearch-head插件,在页面提交请求
2、使用Postman等第三方HTTP客户
3、使用的IntelliJ IDEA的 Http Request工具,编写http文件
创建索引
http文件如下:
### 创建一个新的 people 索引,注意,将IP替换为你们自己的主机地址
PUT http://10.247.63.97:9200/people
Content-Type: application/json
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"type": {"type": "keyword"},
"name": {"type": "text"},
"country": {"type": "keyword"},
"age": {"type": "integer"},
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis"
}
}
}
}
- settings字段:用于指定我们索引的配置
- number_of_shards: 指定当前索引的分片数
- number_of_replicas: 指定当前索引的备份数
- mappings字段:指定索引的数据映射定义:
- properties:指定索引的属性定义;这里,这里,定义了 5 个字段,分别为 type、name、country、age、date;需要注意的是,这里的type,这是一个字段,和我们上文中提到的在7.0中移除了的类型(Type)并不是同一个东西;官方推荐我们的是,如果我们有 类型(Type)定义 这个需求,我们可以在字段中自定义一个字段,用来标识当前 document 属于哪个 Type;这里,我们就使用这个名为 “type” 字段(可以按照自己的习惯自定义名称),来标识当前文档属于哪个 Type;
- 后面的 {"type" : "integer"}、{"type" : "text"}分别表示当前字段数据的类型为 整数、文本,以及 关键字(keyword)、日期类型等。
- date字段中,我们可以为其指定匹配多种格式,使用 || 分隔;
数据插入
- 指定文档ID插入:
### 向 people索引中插入一条 指定ID的数据,注意请求方式为 PUT
# 路径格式为 http://<ip>:<port>/<索引>/_doc/<文档ID>,下面我们插入了一条 ID 为 1 的数据
PUT http://10.247.63.97:9200/people/_doc/1
Content-Type: application/json
{
"type": "man",
"name": "Zereao",
"country": "China",
"age": "23",
"date": "1995-11-27"
}
- 自动生成ID插入:
### 向 people索引中插入一条 自动生成ID的数据,注意,请求方式为 POST,并删除URL末尾的 ID
POST http://10.247.63.97:9200/people/_doc/
Content-Type: application/json
{
"type": "man",
"name": "AutoZereao",
"country": "China",
"age": "23",
"date": "1995-11-27 12:25:35"
}
数据修改
### 修改 ID 为 1 的文档的 name 字段值为 UpdateZereao,格式:{index}/_update/{id}
POST http://10.247.63.97:9200/people/_update/1/
Content-Type: application/json
{
"doc": {
"name": "UpdateZereao"
}
}
删除操作
- 文档删除
### 删除 people索引中 ID = 1 的文档
DELETE http://10.247.63.97:9200/people/_doc/1/
Content-Type: application/json
- 索引删除:最简单的方式是通过head插件进行删除
查询操作
ES的查询可以分为简单查询、条件查询、聚合查询。
- 简单查询:
### 简单查询,查询 book 索引中,ID为1 的文档
GET http://10.247.63.97:9200/book/_doc/1
Content-Type: application/json
- 条件查询:
### 条件查询,查询所有数据
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
{
"query": {
"match_all": {}
}
}
### 条件查询,指定返回数据大小以及从哪里开始返回
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
{
"query": {
"match_all": {}
},
"from": 1,
"size": 1
}
关键词匹配:
### 条件查询,查询标题中包含 传 字的文档
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
{
"query": {
"match": {
"title": "传"
}
}
}
这里,将会查出两条数据。默认情况下,查询出的结果 hits json数组中的数据,是按照_score字段的值大小倒序排序的。我们也可以指定排序方式:
### 条件查询,指定排序方式为 按照 publish_date 降序 排序
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
{
"query": {
"match": {
"title": "传"
}
},
"sort": [
{
"publish_date": {
"order": "desc"
}
}
]
}
聚合查询:
单个分组聚合:
### 聚合查询,按照 这一批 book 的字数进行聚合; 这是一个单个分组聚合
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
{
"aggs": {
"group_by_word_count": {
"terms": {
"field": "word_count"
}
}
}
}
注意,上面的 group_by_word_count 表示该聚合的名称,是自定义的,可以自己为该聚合命名。
多个分组聚合:
### 聚合查询,按照 这一批 book 的字数和出版日期进行聚合; 这是一个多个分组聚合
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
{
"aggs": {
"group_by_word_count": {
"terms": {
"field": "word_count"
}
},
"group_by_publish_date": {
"terms": {
"field": "publish_date"
}
}
}
}
计算某一字段的数据:
### 聚合查询,计算 word_count 字段的相关数据
POST http://10.247.63.97:9200/book/_search
Content-Type: application/json
{
"aggs": {
"grades_word_count": {
"stats": {
"field": "word_count"
}
}
}
}
这里,grades_word_count也是可以自定义的,stats表示对字段值进行计算。执行后,我们可以得到一段这样的数据:
如图,上面计算除了 word_count 字段的 最大值、最小值、均值、数量、总和等数据。