Elasticsearch从入门到精通
目录
🧂1.简单介绍
🥓2.安装与下载
🌭3.安装启动es
🍿4.安装启动kibana
🥞5.初步检索
🧈6.进阶检索
🫓7.Elasticsearch整合
1.简单介绍🚗🚗🚗
Elaticsearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎,是整个ElasticStack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
官方地址:来这哈
2.安装与下载🚗🚗🚗
- 1.docker pull elasticsearch:7.4.2
在docker中使用命令拉取镜像,安装到docker
- 2.docker pull kibana:7.4.2
安装es可视化工具
安装需要时间,莫着急哦~
3.安装启动es🚗🚗🚗
- 1.创建挂载目录
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticssearch/data
- 2.设置允许远程访问
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
- 3.给文件赋权限
给elasticsearch下全部文件赋可读可写可执行的权限
chomd -R 777 /mydata/elasticsearch/
- 4..启动elasticsearch
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2
- --name : 容器名字
- -p: 暴露端口、9200:访问端口,9300:做集群时内部暴露端口
- -e "discovery.type=single-node" : 单机启动
- -e ES_JAVA_OPTS="-Xms64m -Xmx128m" : 初始64m,最大128m
- -v: 将容器中的文件挂在到自己的机器上
- -d: 启动镜像的名称
5.访问
端口
4.安装启动kibana 🚗🚗🚗
- 1.查看docker对外暴露的ip
docker inspect elasticsearch | grep IPAddress
- 2.启动kibana
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://刚刚查出来的docker暴露的ip:9200 -p 5610:5610 -d kibana:7.4.2
ELASTICSEARCH_HOSTS= “不是自己的Linux上的ip地址,而是步骤一查出来docker地址”
- 3.访问
5.初步检索 🚗🚗🚗
5.1_cat
使用postman发送请求~,使用自己虚拟机的IP地址!!!全部为GET请求
- 1.查看所有节点信息 /_cat/nodes
http://192.168.20.130:9200/_cat/nodes
- 2.查看es健康状况 /_cat/health
http://192.168.20.130:9200/_cat/health
- 3.查看主页节点 /_cat/master
http://192.168.20.130:9200/_cat/master
- 4.查看所有索引 /_cat/indices
http://192.168.20.130:9200/_cat/indices
5.2索引一个文档(保存)
保存一个数据,保存在哪个索引的那个类型下指定用哪个唯一标识
- 1.使用命令保存一条记录(put/post请求、发送json)
http://192.168.20.130:9200/customer/external/1
注:
- 1.同一个请求,发送多次,就变为修改~
- 2.POST新增。如果不指定id,会自动生成id。指定id 就会修改这个数据,并新增版本号
- 3.PUT可以新增可以修改。PUT必须指定id;由于PUT需要指定id,我们一般都用来做修操作,不指定id会报错。
5.3查询文档
- 1.发送get请求查询 customer/external/
http://192.168.20.130:9200/customer/external/1
5.4更新一个文档
发送PSOT请求,指定哪个索引下,哪个类型下,id的是多少
- 1.post携带update
会对比原来的数据,如果更新前后一致,则不做改变。
http://192.168.20.130:9200/customer/external/1/_update
- 2.post不携带update
不会对比原来的数据,直接叠加版本
http://192.168.20.130:9200/customer/external/1
- 3.put
和post不懈怠update一样,put可以新增也可以修改,但必须指定id
http://192.168.20.130:9200/customer/external/1
5.5删除
发送delete请求,删除那个索引、那个类型下的id
- 1.删除某一条数据
http://192.168.20.130:9200/customer/external/1
- 2.删除整个索引
http://192.168.20.130:9200/customer
5.6bulk批量api
- 1.使用kibana批量发送
- 2.es测试数据
测试数据放到资源那里了,自行下载
6.进阶检索🚗🚗🚗
6.1基本检索方式
- 1.第一种检索:检索条件直接写在路径后面
GET bank/_search?q=*&sort=account_number:asc
- 2.第二种检索:使用请求体
使用Query DSL,提供一个可执行的Json风格的DSL
GET bank/_search
{"query": {"match_all": {}},"sort": [{"balance": {"order": "desc"}}],"from": 0,"size": 5,"_source": ["balance","firstname"]
}
query:代表查询条件
sort:代表排序条件
from: 从第几条数据开始查
size:每次查出多少条数据
_source:指定命中的字段
6.2基本语法
- 1.match【模糊查询】
模糊检索
GET bank/_search
{"query": {"match": {"address": "kings"}}
}
- 2.match_phrase【字段查询】
指定上相应的字段和对应的值,进行精确查询
GET bank/_search
{"query": {"match_phrase": {"address": "kings"}}
}
- 3.multi_match【多字段查询】
多字段匹配,fileds里的字段,只要有一个匹配query的值即可,而且还是分词查
GET bank/_search
{"query": {"multi_match": {"query": "mill","fields": ["address","city"]}}
}
- 4.bool 【复合查询】
must: 必须匹配
must_not: 不能匹配
should:匹不匹配都可以
GET bank/_search
{"query": {"bool": {"must": [{"match": {"gender": "M"}},{"match": {"address": "mill"}}],"must_not": [{"match": {"age": "28"}}],"should": [{"match": {"lastname": "wallace"}}]}}
}
- 4.filter【结果过滤】
不计算相关性得分
GET bank/_search
{"query": {"bool": {"filter": {"range": {"age": {"gte": 18,"lte": 30}}}}}
}
- 5.term
term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。
GET bank/_search
{"query": {"term": {"age":28}}
}
- 6.aggregations【执行聚合】
- 聚合提供了从数据中分组和提取数据的能力。
- 最简单的聚合方法大致等于SQLGROUPBY和SQL聚合函数。
- 在Elasticsearch中,您有执行搜索返回hits (命中结果) ,并且同时返回聚合结果,把一个响应中的所有hits (命中结果)分隔开的能力。这是非常强大且有效的,您可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API来避免网络往返。
GET bank/_search
{"query": {"match": {"address": "mill"}},"aggs": {"ageAgg": {"terms": {"field": "age","size": 10}},"ageAvg":{"avg": {"field": "age"}},"balanceAvg":{"sum": {"field": "balance"}}},"size": 0
}
aggs:使用聚合函数,名称要见名知意
avg:表示平均值
sum:表示求和
查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段总体平均薪资
GET bank/_search
{"query": {"match_all": {}},"aggs": {"ageAgg": {"terms": {"field": "age","size": 100},"aggs": {"genderAgg": {"terms": {"field": "gender.keyword","size": 10},"aggs": {"balanceAvg": {"avg": {"field": "balance"}}}},"ageBalance": {"avg": {"field": "balance"}}}}}
}
子聚合,在一个聚合函数名称下,在使用aggs聚合
6.3Mapping
- 1.创建映射
在创建索引时,规定字段的类型
PUT /my_index
{"mappings": {"properties": {"age": {"type": "integer"},"email": {"type": "keyword"},"name": {"type": "text"}}}
}
- 2.添加新的字段映射
PUT /my_index/_mapping
{"properties":{"employee-id":{"type": "keyword","index": false}}
}
- 3.更新映射
对于已经存在的映射字段,我们不能更新。更新必须创建新的索引进行数据迁移
- 4.数据迁移
先创建出新的正确映射,然后再迁移
POST _reindex
{"source": {"index": "bank","type": "account"},"dest": {"index": "newbank"}
}
source:原数据
dest:要迁移的数据
index:要迁移数据的名称
type:迁移数据的类型
6.4分词
- 一个tokenizer (分词器)接收一个字符流,将之分割为独立的tokens (词元,通常是独立的单词),然后输出 tokens 流。
- 例如, whitespace tokenizer 遇到空白字符时分割文本。它会将文本"Quick brown fox!" 分割为[Ouick, brown, fox]
- 1.安装ik分词器
官网:ik分词器
解压到elasticsearch的plugins下~ ,记得重启elasticsearch!!
- 2.测试分词效果
- 3.自定义分词
3.1使用nginx配置分词,再nginx的html下创建文件夹es,并配置location
3.2配置分词器地址
在ik分词器的配置文件中,添加分词器地址
重启elastic search~
7.Elasticsearch整合 🚗🚗🚗
7.1创建服务
在父工程下创建新模块作为检索服务,并导入依赖
<!--导入es的rest-high-level-client--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.4.2</version></dependency>
但是如果<elasticsearch.version>7.4.2</elasticsearch.version>不生效,jar包冲突,版本不匹配,将版本不匹配的移除,重新引入!!!
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.4.2</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.4.2</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.4.2</version></dependency>
7.2写配置
编写配置类,被容器中注入RestHighLevelClient,并写入预检请求
@Configuration
public class ElasticSearchConfig {public static final RequestOptions COMMON_OPTIONS;static {RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();COMMON_OPTIONS = builder.build();}@Beanpublic RestHighLevelClient esRestClient() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.20.130", 9200, "http")));return client;}
}
7.3测试
- 1.测试保存请求,也可修改
@Testpublic void indexData() throws IOException {IndexRequest indexRequest = new IndexRequest("users");indexRequest.id("1");//推荐方式,将对象转换为jsonUser user = new User();user.setUserName("会敲代码的小张");user.setAge(18);user.setGender("男");String jsonString = JSON.toJSONString(user);indexRequest.source(jsonString, XContentType.JSON);//执行保存IndexResponse index = restHighLevelClient.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);//提取有用的数据System.out.println(index);}@Dataclass User{private String userName;private String gender;private Integer age;}
- 2.复查检索
@Testpublic void select() throws IOException {//1.创建检索请求SearchRequest searchRequest = new SearchRequest();//2.指定索引searchRequest.indices("bank");//3.指定DSL检索条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//3.1构造query条件sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));//3.2构造聚合条件//3.2.1-按照你啊年龄聚合TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);sourceBuilder.aggregation(ageAgg);//3.2.2-计算平均薪资AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");sourceBuilder.aggregation(balanceAvg);System.out.println("检索条件" + sourceBuilder.toString());searchRequest.source(sourceBuilder);//4.执行检索SearchResponse searchResponse = restHighLevelClient.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);//5.分析结果System.out.println("查询结果" + searchResponse.toString());//5.1获取查到的所有数据SearchHits hits = searchResponse.getHits();//5.2查询真正的命中记录SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String sourceAsString = hit.getSourceAsString();Account account = JSON.parseObject(sourceAsString, Account.class);System.out.println("值:" + account);}//5.3获取分析信息Aggregations aggregations = searchResponse.getAggregations();Terms ageAgg1 = aggregations.get("ageAgg");for (Terms.Bucket bucket : ageAgg1.getBuckets()) {String keyAsString = bucket.getKeyAsString();System.out.println("年龄:"+keyAsString+"===>"+bucket.getDocCount());}Avg balanceAvg1 = aggregations.get("balanceAvg");System.out.println("平均薪资:"+balanceAvg1.getValue());}
相关文章:

Elasticsearch从入门到精通
目录 🧂1.简单介绍 🥓2.安装与下载 🌭3.安装启动es 🍿4.安装启动kibana 🥞5.初步检索 🧈6.进阶检索 🫓7.Elasticsearch整合 1.简单介绍🚗🚗🚗 Elat…...

Halcon 相机标定
文章目录 算子单相机标定单相机标定畸变的矫正 算子 gen_caltab 生成标定文件 gen_caltab(::XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile :) 算子来制作一个标定板XNum 每行黑色标志圆点的数量。YNum 每列黑色标志圆点的数…...

【JavaScript】深浅拷贝
JavaScript中复制对象有深拷贝和浅拷贝两种方式 浅拷贝:浅拷贝只复制对象的第一层属性,而不复制嵌套对象的引用。这意味着如果原始对象包含嵌套对象,浅拷贝后的对象仍然会共享这些嵌套对象的引用。可以使用`Object.assign()`或展开运算符(`...`)来进行浅拷贝。 // 浅拷贝示…...

CH32V3xx RT-Thread RS485实现modbus rtu master
目录 1、串口配置1.1 串口初始化1.2 uart DMA 初始化1.1.3 发送函数2、agile modbus3、应用测试4、遇到的问题本文通过ch32v3xx的串口 + RS485收发器实现modbus rtu master设备。此工程中移植的RT-Thread Nano系统,详情可参看本专栏前几篇文章。 1、串口配置 串口使用重映射后…...

当网站遭到DDOS攻击怎么办?
一般网站进行上线后会经常遭到攻击,有一些攻击不怎么容易被发现,当大规模的攻击来临时,会给企业造成巨大的损失,使网站的业务下线并且访问异常,出现很多的问题。 其中DDOS攻击是最高频的一种网络攻击方式,那…...

ES6中的数组解构赋值【详解】
文章目录 1.数组的解构赋值1.1 基本用法1.2 默认值1.3更多对象解构赋值 1.数组的解构赋值 1.1 基本用法 ES6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为结构。 let [a, b, c] [1, 2, 3];如果解构不成功,…...

error An unexpected error occurred: “https://registry.npm.taobao.org
背景: 想使用yarn命令结果报错 问题原因: 原来证书到期了 http://registry.npm.taobao.org/ 把这个放到浏览器搜索的时候自动换成https://registry.npmmirror.com/ 方案: npm cache clean --forcenpm config set registry https://registry…...

react中commit工作流程
整个React工作流程可以分为两大阶段: Render阶段 Schecule Reconcile Commit阶段 注意,Render阶段是在内存中运行的,这意味者可以被打断,而commit阶段一旦开始同步执行直到完成。 Renderer工作的阶段被称为commit阶段。commit阶…...

C++类和对象-多态->多态的基本语法、多态的原理剖析、纯虚函数和抽象类、虚析构和纯虚析构
#include<iostream> using namespace std; //多态 //动物类 class Animal { public: //Speak函数就是虚函数 //函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。 virtual void speak() { …...

QShortcut
一、QShortcut简介 QShortcut是Qt框架中提供的一个类,用于创建和管理键盘快捷键。它允许开发者为应用程序定义一组快捷键组合,当用户按下这些组合键时,可以触发相应的动作或事件。QShortcut的使用使得用户能够更加方便、快捷地操作应用程序&…...

浅谈语义分割、图像分类与目标检测中的TP、TN、FP、FN
语义分割 TP:正确地预测出了正类,即原本是正类,识别的也是正类 TN:正确地预测出了负类,即原本是负类,识别的也是负类 FP:错误地预测为了正类,即原本是负类,识别的是正类…...

Python基础教程:解构
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 我们提到了字典的.items()方法会返回键值对元组的键值对元组列表: dic {key: 1, dsb: alex} print(dic.items())输出的内容为: dict_it…...

Java 学习和实践笔记(12)
这个就比较有意思了!所有的事情,拆分完之后,都有且只有这三种状态流程! //TIP To <b>Run</b> code, press <shortcut actionId"Run"/> or // click the <icon src"AllIcons.Actions.Execute&…...

学习数据结构和算法的第9天
题目讲解 移除元素 给你一个数组nums和一个值 val,你需要 原地 移除所有数值等于 val的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用0(1)额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要…...

大龙谈智能内容 - 开工大吉
今天是2024年2月18日,开工第一天。 祝关注“大龙谈智能内容”的朋友龙年如龙飞天,事业步步高升!...

中科大计网学习记录笔记(十二):TCP 套接字编程
前前言:大家看到这一章节的时候一定不要跳过,虽然标题是编程,但实际上是对 socket 的运行机制做了详细的讨论,对理解 TCP 有很大的帮助;但是由于本节涉及到了大量的编程知识,对于一些朋友来说不是很好理解&…...

落实三大阶段目标,TRON全方位打通与BTC生态互联
2月15日,波场TRON创始人、火币HTX全球顾问委员会委员孙宇晨在X平台发布公告表示,波场TRON已正式公布比特币第二层解决方案及路线图,围绕打通比特币与波场TRON网络的跨链连接、投资开发用户友好的钱包和工具,同时与多个比特币第二层协议进行合作等重点,全方位拥抱比特币发展机遇…...

MCU中断控制
目录 一、中断相关基础知识 1、NVIC:嵌套向量中断控制器 2、可屏蔽中断和不可屏蔽中断的区别 3、中断优先级 4、常见特殊中断 二、中断相关寄存器 三、中断使用步骤: 一、中断相关基础知识 1、NVIC:嵌套向量中断控制器 (1) 它是内核的…...

C语言中的可变参数
目录 可变参数函数原理与分析总结 实现方案1、 va_start 宏2、 va_arg 宏3、 va_end 宏 应用举例举例1:提前已知所有参数类型的简单情况举例2:通过固定参数,来动态确定可变参数类型的复杂情况 可变参数函数 在C语言中,有这样的一…...

Leetcode-103. 二叉树的锯齿形层序遍历
这个年和树过不去啦啦啦! 题目: 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1&…...

vs code“无法与远程服务器建立连接:XHR failed.”解决办法
获取到 commit id 的方式参考: vscode通过ssh链接服务器卡在downloading with wget - 知乎 关于下载 vscode-server-linux-x64.tar.gz,浏览器打开: https://vscode.download.prss.microsoft.com/dbazure/download/stable/你的commit id/vs…...

第五节 zookeeper集群与分布式锁_2
1.分布式锁概述 1.1 什么是分布式锁 1)要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁。 线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。 线程锁只在同一J…...

Shell脚本——提取目录名和文件名
目录 一、${} 1.${var##*/} 2.${var##*.} 3.${var#*.} 4.${var%/*} 5.${var%%.*} 6.总结 二、basename和dirname 1.basename 2.dirname 在许多场景下,我们都需要对文件名称或者文件所在的目录进行操作,已达到我们业务目的。通常的操作是由路径…...

wps使用方法(包括:插入倒三角符号,字母上面加横线,将word中的所有英文设置为time new roman)
倒三角符号 字母上面加横线 将word中的所有英文设置为time new roman ctrla选中全文...

备战蓝桥杯---图论之最小生成树
首先,什么是最小生成树? 他就是无向图G中的所有生成树中树枝权值总和最小的。 如何求? 我们不妨采用以下的贪心策略: Prim算法(复杂度:(nm)logm): 我们对于把上述的点看成两个集…...

爬虫-华为云空间备忘录导出到docx-selenium控制浏览器行为-python数据处理
背景适用情况介绍 老的荣耀手机属于华为云系统,家里人换了新荣耀手机属于荣耀云系统无法通过云空间将备忘录转移到新手机,不想让他们一个一个搞,于是整了一晚上想办法爬取下来。从网页抓取下来,然后存到docx文档中(包…...

网络安全的新防线:主动进攻,预防为先
进攻性安全(Offensive security)是指一系列主动安全策略,这些策略与恶意行为者在现实世界的攻击中使用的策略相同,区别在于其目的是加强而非损害网络安全。常见的进攻性安全方法包括红队、渗透测试和漏洞评估。 进攻性安全行动通常…...

基于java springboot+mybatis学生学科竞赛管理管理系统设计和实现
基于java springbootmybatis学生学科竞赛管理管理系统设计和实现 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各…...

秒懂百科,C++如此简单丨第二十一天:栈和队列
目录 前言 Everyday English 栈(Stack) 图文解释 实现添加删除元素 实现查看清空栈 完整代码 运行示例 栈的选择题 队列(Queue) 图文解释 队列的基本用法 完整代码 运行结果 队列的好处 结尾 前言 今天我们将…...

STM32-开发环境之STM32CubeMX
目录 STM32CubeMX介绍 STM32CubeMX特性 应用场景 其他事项 STM32CubeMX介绍 STM32CubeMX是ST公司(意法半导体)推出的一款图形化工具,也是配置和初始化C代码生成器。它主要服务于STM32微控制器的配置和开发。 STM32CubeMX特性 1.直观选…...