📢📢📢📣📣📣
哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!😜😜😜
✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。
✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。
✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注【一心同学】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
目录
一、Rest风格是什么?
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
}
结果:
这样是创建成功的,但其提示告诉我们type 在未来的版本中会逐渐弃用,因此产生一个默认类型_doc 进行代替。
2.2 获取规则
作用:通过 GET 可以请求获取具体的信息,查看我们的索引信息。
语法:
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
注意:如果只是要删除某一条文档则是DELETE /test1/_doc/1。
三、文档的基本操作
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
}
输出:
分析:“version”代表这个数据被改动的次数,每次执行PUT,无论是否进行改动,verson值都会增加,而且如果PUT的文档属性没有传递值,则会进行覆盖操作。
第二种:Post _update(推荐)
代码:
POST yixin/user/2/_update
{
"doc":{
"name":"一心呀"
}
}
输出:
分析:“verson”同样是指变动的次数,如果多次执行POST,但不修改,那么verson值不变,而且我们的字段没有设置值不会进行覆盖操作,灵活性高!
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
term: 精确查询,对查询的值不分词,直接进倒排索引去匹配。
match; 模糊查询,对查询的值分词,对分词的结果一一进入倒排索引去匹配
4.9.1 text与keyword
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的基本操作】,对于以上的知识点非常重要,大家务必要【掌握】,建议跟着【一心同学】的思路自己动手敲一遍,相信会掌握得【更快】!
如果这篇【文章】有帮助到你,希望可以给【一心同学】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【后端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【一心同学】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!