目录
一、Rest风格是什么?
基本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 | 查询所有数据 |
二、索引的基本操作
2.1 创建索引并添加数据
语法:
PUT /索引名/类型名/文档id
{
请求体
}
代码:
PUT /yixin/user/1
{
"name":"一心",
"age":18
}
结果:
2.2 获取规则
语法:
GET 索引名
输入:
GET yixin
结果:
可以发现如果我们在创建索引的时候,没有指定字段类型,那么其会默认给我们的字段赋予类型的。
2.3 指定字段类型
常用的字段数据类型:
类型 | 属性 |
字符串类型 | text:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储; keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。 |
数值型 | long、Integer、short、byte、double、float、half float、scaled float |
日期类型 | date |
布尔类型 | boolean |
二进制类型 | binary |
代码:
PUT /test1
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}
获取规则:
现在我们只需要根据对应的类型进行插入数据即可:
PUT /test1/_doc/1
{
"name":"一心",
"age":18,
"birthday":"2000-01-01"
}
2.4 删除索引
语法:
DELETE /索引名
输入:
DELETE /test1
三、文档的基本操作
3.1 添加数据
代码:
PUT /yixin/user/1
{
"name":"yixin",
"age":18
}
查看索引的数据:
3.2 获取数据
代码:
GET yixin/user/1
结果:
3.3 更新数据
第一种:使用PUT
代码:
PUT /yixin/user/2
{
"name":"一心同学",
"age":18
}
输出:
第二种:Post _update(推荐)
代码:
POST yixin/user/2/_update
{
"doc":{
"name":"一心呀"
}
}
输出:
3.4 简单查询
需求:查询某条数据。
GET yixin/user/1
输出:
需求:查询所有数据。
GET yixin/user/_search
输出:
四、search查询操作
4.1 条件查询
需求:查询名字带有“一心”并且年龄为18岁的用户。
GET yixin/user/_search?q=name:"一心",age:18
输出:
4.2 模糊查询
关键字:match
需求:查询命中带有“一心”的用户。
GET yixin/user/_search
{
"query": {
"match": {
"name": "一心"
}
}
}
输出:
4.3 结果过滤
关键字:source
作用:如果我们不希望展示那么多信息,可以使用_source进行结果过滤。
需求:输出的字段中,只显示name。
GET yixin/user/_search
{
"query": {
"match": {
"name": "一心"
}
},
"_source": ["name"]
}
输出:
4.4 排序
关键字:sort
- 降序:desc
- 升序:asc
需求:匹配带有“一心”的名字,并且根据年龄进行降序排列。
GET yixin/user/_search
{
"query": {
"match": {
"name": "一心"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
输出:
4.5 分页
关键词:
from:从第几个数据开始,下标从0开始。
size:单页面返回多少条数据。
需求:匹配带有“一心”的名字,并且按年龄进行降序,每一页只显示1条数据,返回第一页。
GET yixin/user/_search
{
"query": {
"match": {
"name": "一心"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 1
}
输出:
4.6 多条件查询
关键词:
bool:布尔值查询
must(and):所有的条件都要符合 where id=1 and name = xxx
should(or):所有的条件都要符合 where id=1 or name = xxx
must_not(not):非,不符合的条件
🌴 must
需求:查询名字带有“一心”并且年龄为19的用户。
GET yixin/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "一心"
}
},
{
"match": {
"age": "19"
}
}
]
}
}
}
输出:
🌴 should
需求:查询名字带有“一心”或“张”的用户。
GET yixin/user/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "一心"
}
},
{
"match": {
"name": "张"
}
}
]
}
}
}
输出:
🌴 must_not(not)
需求:查询年龄不是18岁的用户。
GET yixin/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": "18"
}
}
]
}
}
}
输出:
4.7 过滤器
关键字:filter
- gt 大于
- gte 大于等于
- lt 小于
- lte 小于等于
需求1:查询年龄小于20岁的用户,但不能等于18岁。
GET yixin/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": "18"
}
}
],
"filter": {
"range": {
"age": {
"lt": 20
}
}
}
}
}
}
输出:
需求2:查询年龄为15-20岁之间的用户。
GET yixin/user/_search
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 15,
"lte": 20
}
}
}
}
}
}
输出:
4.8 多条件查询
🌵 环境准备
PUT /yixin2/user/1
{
"name":"一心同学",
"age":18,
"tags":["技术","运动","社交"]
}
PUT /yixin2/user/2
{
"name":"张三",
"age":20,
"tags":["游戏","运动","喝咖啡"]
}
PUT /yixin2/user/3
{
"name":"李四",
"age":21,
"tags":["滑雪","技术"]
}
🌵 查询
需求:查询标签拥有“技术”或“运动”的用户。
GET yixin2/user/_search
{
"query": {
"match": {
"tags": "技术 运动"
}
}
}
输出:
4.9 精确查询
关键词:term
4.9.1 text与keyword
对keyword进行查询:
GET _analyze
{
"analyzer": "keyword",
"text": "你好,世界"
}
输出:
可以发现不会对词汇进行拆分!
对普通类型进行查询:
GET _analyze
{
"analyzer": "standard",
"text": "你好,世界"
}
输出:
4.9.2 环境准备
PUT /yixin3
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"age":{
"type": "long"
},
"desc":{
"type": "text"
}
}
}
}
PUT /yixin3/_doc/1
{
"name":"一心同学",
"age":18,
"desc":"专注于Java"
}
4.9.3 查询
关键字分词
我们来对“一心同学”进行分词,由于name属于 keyword,所以利用keyword进行分词:
GET _analyze
{
"analyzer": "keyword",
"text": "一心同学"
}
输出:
{
"tokens" : [
{
"token" : "一心同学",
"start_offset" : 0,
"end_offset" : 4,
"type" : "word",
"position" : 0
}
]
}
也就是说对于精确查询我们只能查询“一心同学”才会显示成功!
非关键字分词
GET _analyze
{
"analyzer": "standard",
"text": "专注于java"
}
输出:
{
"tokens" : [
{
"token" : "专",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "注",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "于",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "java",
"start_offset" : 3,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 3
}
]
}
也就是说,对于精确查询,我们只要输入与分词后的任意词汇就可以查询成功!
🚀 查询成功:
GET yixin3/_search
{
"query": {
"term": {
"name":"一心同学"
}
}
}
🚀 查询成功:
GET yixin3/_search
{
"query": {
"term": {
"desc":"专"
}
}
}
🚀 查询成功:
GET yixin3/_search
{
"query": {
"term": {
"desc":"java"
}
}
}
🚀查询失败:
GET yixin3/_search
{
"query": {
"term": {
"name":"一心"
}
}
}
🚀查询失败:
GET yixin3/_search
{
"query": {
"term": {
"desc":"专注于Java"
}
}
}
分析可得:
查询类型 | 写入类型 | 结果 |
---|---|---|
term | text | 无 |
term | keyword | 有 |
match | text | 有 |
match | keyword | 有 |
4.10 多值匹配精确查询
需求:查询名字为“张三”和“一心同学”的用户。
GET yixin3/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"name": "张三"
}
},{
"term": {
"name": "一心同学"
}
}
]
}
}
}
输出:
4.11 高亮
关键词:highlight
🚀 默认样式
需求:让搜索词汇高亮显示。
GET yixin/_search
{
"query": {
"match": {
"name": "一心"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
输出:
🚀 自定义高亮的样式
pre_tags:前缀
post_tags:后缀
代码:
GET yixin/_search
{
"query": {
"match": {
"name": "一心"
}
},
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}
输出:
小结
以上就是【一心同学】整理的关于【ElasticSearch的基本操作】,对于以上的知识点非常重要,大家务必要【掌握】,建议跟着【一心同学】的思路自己动手敲一遍,相信会掌握得【更快】!