Rest风格介绍

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务端交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

基本命令

method

url地址

描述

PUT(创建,修改)

localhost:9200/索引名称/类型名称/文档id

创建文档(指定文档id)

POST(创建)

localhost:9200/索引名称/类型名称

创建文档(随机文档id)

POST(修改)

localhost:9200/索引名称/类型名称/文档id/_update

修改文档

DELETE(删除)

localhost:9200/索引名称/类型名称/文档id

删除文档

GET(查询)

localhost:9200/索引名称/类型名称/文档id

查询文档通过文档ID

POST(查询)

localhost:9200/索引名称/类型名称/文档id/_search

查询所有数据

测试

1.创建索引(PUT)

# put 索引名称/类型名称/文档ID
# {请求体}

put test1/type1/1
{
  "name": "dada",
  "age": 18
}

es创建索引是什么意思 es命令行创建索引_字段

由于当前的ES版本为7.15.2,可以看到右侧会有警告提示,这是因为ES在7.x版本去掉了类型名换type,所以我们创建索引的方式就变了

  • 索引操作由 PUT {index}/{type}/{id}变成PUT {index}/_doc/{id}
  • Mapping 操作由 PUT {index}/{type}/_mapping变成 PUT {index}/_mapping
  • 所有增删改查搜索操作返回结果里面的关键字_type都将被移除

但是之前的方式依然可以保存使用,推荐使用官方最新方式

es创建索引是什么意思 es命令行创建索引_java_02

当我们修改数据后再执行,就变成了修改索引

es创建索引是什么意思 es命令行创建索引_大数据_03

2.创建索引,指定字段类型(PUT)

类似于建库(建立索引和字段对应类型),也可看做规则的建立

字段类型
  • 字符串类型
  • text:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储;
  • keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
  • 数值型
  • long、Integer、short、byte、double、float、half float、scaled float
  • 日期类型
  • date
  • te布尔类型
  • boolean
  • 二进制类型
  • binary
  • 等等
PUT /test2
{
  "mappings":{
    "properties":{
      "name":{
        "type":"text"
      },
       "age":{
        "type":"long"
      },
       "birthday":{
        "type":"date"
      }
    }
  }
}

es创建索引是什么意思 es命令行创建索引_大数据_04

4.获取索引规则(GET)

GET test2

es创建索引是什么意思 es命令行创建索引_java_05

5.获取默认信息类型(GET)

PUT /test3/_doc/1
{
  "name": "haha",
  "age": 1,
  "birth": "2022-10-10"
}

GET test3

es创建索引是什么意思 es命令行创建索引_java_06

如果自己的文档字段没有指定,ES就会给我们默认配置字段类型

如上图,查看索引test3的默认规则,会发现其中name的字段类型为text,但该字段的关键字拆分却是keyword类型,不进行分词,直接索引。

所以建议我们在创建索引时,指定字段的类型及拆分规则

PUT /test3
{
  "mappings":{
    "properties":{
      "name":{
        "type":"text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

6.修改(POST)

  • 获取信息
  • 第一种,使用PUT 覆盖原来的值
  • 版本+1 version
  • 但是如果漏掉哪个字段,没有写的字段会消失
  • 第二种,使用POST的update命令
  • 需要注意doc
POST /test3/_update/1
{
  "doc": {
      "name": "qqq",
      "age": 4
  }
}
  • 版本会改变
  • 不会丢失字段

7.删除(DELETE)

GET /test2

DELETE /test2

es创建索引是什么意思 es命令行创建索引_elasticsearch_07

8.文档查询(简单条件)

# 创建索引,指定字段类型
PUT /test3
{
  "mappings":{
    "properties":{
      "name":{
        "type":"text"
      },
       "price":{
        "type":"double"
      },
       "num":{
        "type":"long"
      }
    }
  }
}

# 首先填入数据
PUT /test3/_doc/1
{
  "name" : "香蕉",
  "price" : 3.5,
  "num": 10
}

PUT /test3/_doc/2
{
  "name" : "草莓",
  "price" : 19.9,
  "num": 20
}

PUT /test3/_doc/3
{
  "name" : "香瓜",
  "price" : 9.9,
  "num": 30
}

# 最简单的查询,类似与数据库通过id来查询
GET /test3/_search?q=name:草莓

es创建索引是什么意思 es命令行创建索引_es创建索引是什么意思_08

9.复杂查询

# 查看索引中的信息
GET /test3/_search

es创建索引是什么意思 es命令行创建索引_字段_09

匹配查询
  • match 匹配(会使用分词器解析,先分析文档,在进行查询)
  • _source 过滤字段, 指定查询哪些字段
  • sort 排序,根据哪个字段排序
  • form、size 分页查询 form 从第几个开始, size 每页大小
GET /test3/_search
{
  "query":{
    "match": {
      "name": "香"
    }
  },
  "_source":["name","price"],
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 10
}

es创建索引是什么意思 es命令行创建索引_elasticsearch_10

多条件查询
  • must 相当于and
  • should 相当于or
  • must_out 相当于not(… and …)
  • filter 过滤
GET /test3/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match": {
            "name": "香"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "name": "瓜"
          }
        }
      ], 
      "filter": [
        {
          "range": {
            "price": {
              "gte": 0,
              "lte": 10
            }
          }
        }
      ]
    }   
  }
}

es创建索引是什么意思 es命令行创建索引_字段_11

精确查询
  • term 直接通过倒排索引,指定词条查询
GET /test3/_search
{
  "query":{
    "term": {
      "num": 10
    }  
  }
}

es创建索引是什么意思 es命令行创建索引_es创建索引是什么意思_12

  • 适合查询number,date,keyword,不适合text
    上图中我们知道test3中name的类型为text,我们查询一下
GET /test3/_search
{
  "query":{
    "term": {
      "name": "香瓜"
    }  
  }
}

es创建索引是什么意思 es命令行创建索引_大数据_13

text和keyword
  • text:
  • 支持分词全文检索、支持模糊、精确查询,不支持聚合,排序操作;
  • text类型的最大支持的字符长度无限制,适合大字段存储;
  • keyword:
  • 不进行分词直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。
  • keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果
PUT /test4
{
  "mappings": {
    "properties": {
      "name1":{
        "type":"text"
      },
      "name2":{
        "type":"keyword"
      }
    }
  }
}

# 设置字段数据
PUT /test4/_doc/1
{
  "name1":"测试keyword和text是否支持分词",
  "name2":"测试keyword和text是否支持分词"
}


# text 支持分词
# keyword 不支持分词
GET /test4/_search
{
  "query":{
   "match":{
      "name1":"测试"
   }
  }
}# 查的到

GET /test4/_search
{
  "query":{
   "match":{
      "name2":"测试"
   }
  }
}# 查不到,必须是 "测试keyword和text是否支持分词" 才能查到
高亮查询
GET /test3/_search
{
  "query": {
    "match": {
      "name": "草莓"
    }
  },
   "highlight": {
    "fields": {
      "name": {}
    }
  }
}

es创建索引是什么意思 es命令行创建索引_elasticsearch_14

# 自定义前缀和后缀
GET /test3/_search
{
  "query": {
    "match": {
      "name":"草莓"
    }
  }
  ,
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>",
    "post_tags": "</p>", 
    "fields": {
      "name": {}
    }
  }
}

es创建索引是什么意思 es命令行创建索引_字段_15