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&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点
中科院1区顶刊|IF14:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点 当下,免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入,我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递
在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...