超详细讲解Elasticsearch的基本操作

超详细讲解Elasticsearch的基本操作

📢📢📢📣📣📣

哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!😜😜😜

✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。

✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。

✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注【一心同学】💞💞💞

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

目录

一、Rest风格是什么?

二、索引的基本操作

2.1 创建索引并添加数据

2.2 获取规则

2.3 指定字段类型

2.4 删除索引

三、文档的基本操作

3.1 添加数据

3.2 获取数据

3.3 更新数据

第一种:使用PUT

第二种:Post _update(推荐)

3.4 简单查询

四、search查询操作

4.1 条件查询

4.2 模糊查询

4.3 结果过滤

4.4 排序

4.5 分页

4.6 多条件查询

🌴 must

🌴 should

🌴 must_not(not)

4.7 过滤器

4.8 多条件查询

🌵 环境准备

🌵 查询

4.9 精确查询

4.9.1 text与keyword

4.9.2 环境准备

4.9.3 查询

4.10 多值匹配精确查询

4.11 高亮

🚀 默认样式

🚀 自定义高亮的样式

小结

一、Rest风格是什么?

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

基本Rest命令:

methodurl地址描述PUT(创建,修改)localhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)POST(创建)localhost:9200/索引名称/类型名称创建文档(随机文档id)POST(修改)localhost:9200/索引名称/类型名称/文档id/_update修改文档DELETE(删除)localhost:9200/索引名称/类型名称/文档id删除文档GET(查询)localhost:9200/索引名称/类型名称/文档id查询文档通过文档IDPOST(查询)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" : "",

"position" : 0

},

{

"token" : "注",

"start_offset" : 1,

"end_offset" : 2,

"type" : "",

"position" : 1

},

{

"token" : "于",

"start_offset" : 2,

"end_offset" : 3,

"type" : "",

"position" : 2

},

{

"token" : "java",

"start_offset" : 3,

"end_offset" : 7,

"type" : "",

"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"

}

}

}

分析可得:

查询类型写入类型结果termtext无termkeyword有matchtext有matchkeyword有

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": "

",

"post_tags": "

",

"fields": {

"name": {}

}

}

}

输出:

小结

以上就是【一心同学】整理的关于【ElasticSearch的基本操作】,对于以上的知识点非常重要,大家务必要【掌握】,建议跟着【一心同学】的思路自己动手敲一遍,相信会掌握得【更快】!

如果这篇【文章】有帮助到你,希望可以给【一心同学】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【后端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【一心同学】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

相关推荐

姜丹尼尔为什么这么火他是怎么爆发的,他的择偶标准是怎样的?
松下投影仪
365bet娱乐场

松下投影仪

📅 07-02 👁️ 4160
王者荣耀点券怎么冲 王者荣耀点券充值方式介绍