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版本为7.15.2,可以看到右侧会有警告提示,这是因为ES在7.x版本去掉了类型名换type,所以我们创建索引的方式就变了
- 索引操作由 PUT {index}/{type}/{id}变成PUT {index}/_doc/{id}
- Mapping 操作由 PUT {index}/{type}/_mapping变成 PUT {index}/_mapping
- 所有增删改查搜索操作返回结果里面的关键字
_type
都将被移除
但是之前的方式依然可以保存使用,推荐使用官方最新方式
当我们修改数据后再执行,就变成了修改索引
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"
}
}
}
}
4.获取索引规则(GET)
GET test2
5.获取默认信息类型(GET)
PUT /test3/_doc/1
{
"name": "haha",
"age": 1,
"birth": "2022-10-10"
}
GET test3
如果自己的文档字段没有指定,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
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:草莓
9.复杂查询
# 查看索引中的信息
GET /test3/_search
匹配查询
- match 匹配(会使用分词器解析,先分析文档,在进行查询)
- _source 过滤字段, 指定查询哪些字段
- sort 排序,根据哪个字段排序
- form、size 分页查询 form 从第几个开始, size 每页大小
GET /test3/_search
{
"query":{
"match": {
"name": "香"
}
},
"_source":["name","price"],
"sort": [
{
"price": {
"order": "asc"
}
}
],
"from": 0,
"size": 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
}
}
}
]
}
}
}
精确查询
- term 直接通过倒排索引,指定词条查询
GET /test3/_search
{
"query":{
"term": {
"num": 10
}
}
}
- 适合查询number,date,keyword,不适合text
上图中我们知道test3中name的类型为text,我们查询一下
GET /test3/_search
{
"query":{
"term": {
"name": "香瓜"
}
}
}
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": {}
}
}
}
# 自定义前缀和后缀
GET /test3/_search
{
"query": {
"match": {
"name":"草莓"
}
}
,
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}