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());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/474637.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析 — Pandas 数据加载、存储和清洗

目录 一、文件读取1、常见文件读取函数2、read_csv()3、read_table()4、read_excel()5、read_json()6、read_html()7、大文件读取 二、数据保存1、csv2、excel3、json4、html5、MySQL1、连接数据库2、MySQL 存储到本地3、本地存储到 MySQL 三、数据清洗1、处理缺失值1、判断数据…

【JVM】打破双亲委派机制

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 打破双亲委派机制 打破双亲委派机制三种方法 自定义类加载器 ClassLoader包含了四个核心方法 //由类加载器子类实现&#xff0c;获取二进制数据调用…

2024年最新腾讯云轻量4核8G12M服务器CPU内存性价比如何?

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

STL:优先级队列的实现

STL中优先级队列本质上就是堆。在上一篇博客中讲到过&#xff1a;堆是一种完全二叉树&#xff0c;逻辑结构上看起来像树&#xff0c;但在物理结构中是存储在线性表中。与普通线性表不同的是&#xff0c;堆中数据大小是规律排列的&#xff1a;小堆中每个节点都大于它的父节点&am…

向量内外积计算器:数学与工程的巧妙结合

随着人工智能、大数据等技术的飞速发展&#xff0c;数学工具的重要性日益凸显。向量内外积作为线性代数中的基础概念&#xff0c;不仅在理论上有着深远的影响&#xff0c;在实际应用中也发挥着巨大作用。本文将从向量内外积的定义、起源、应用场景以及计算示例等方面&#xff0…

【Prometheus】组件介绍-工作流程-部署模式-数据类型-监控

基于Prometheus和K8S构建智能化告警系统 一、Prometheus简介二、Prometheus特点于样本2.1、特点2.2、样本 三、Prometheus组件介绍四、Prometheus工作流程五、Prometheus的几种部署模式5.1、基本高可用模式5.2、基本高可用远程存储5.3、基本高可用远程存储联邦集群 六、Prometh…

【复刻】互联网使用会增加农户子女教育投资吗?(附数据+代码)

数据来源&#xff1a;来自2019年中国家庭金融调查数据时间跨度&#xff1a;2019年数据范围&#xff1a;全国数据指标&#xff1a;指标体系&#xff1a; 类型 变量 符号 变量定义 被解释变量 子女教育投资 son_edu 农户在未成年子女教育培训上的平均支出 解释变量 互联…

Halcon 元组/数组基本操作

Halcon 元组/数组基本操作 ** 元组/数组 tuple *******数组创建与字典******* ** 创建一个数组 A : [1,3,45,6] A[0] : 1 A[1] : 2** 定义一个key value字典类型create_dict (DictHandle) set_dict_tuple (DictHandle, test_tuple, A) set_dict_tuple (DictHandle, test_obj, …

ipad上能免费下载Python并运行吗?

前言 一般也是可以&#xff0c;直接 在 Ipad App store 里搜索 python 即可&#xff0c;如下: 不过小编并不觉得 ipad 适合 写 python&#xff0c;建议最好还是在电脑上如 mac 进行编程。 如果你对Python感兴趣&#xff0c;想要学习python&#xff0c;这里给大家分享一份Pyth…

物联网时代的嵌入式系统:从自动化到自适应的演变

&#xff08;本文为简单介绍&#xff0c;观点来源于网络&#xff09; 随着科技的飞速发展&#xff0c;物联网&#xff08;IoT&#xff09;已经成为当今时代的一个标志性技术。物联网通过将传感器、软件和其他技术嵌入到物理对象中&#xff0c;实现了物品之间的智能互联。嵌入式…

没有PFMEA分析的检测过程会有什么风险?

随着科技的快速发展&#xff0c;产品复杂度不断提升&#xff0c;检测过程的重要性日益凸显。然而&#xff0c;在这个过程中&#xff0c;如果没有进行PFMEA分析&#xff0c;将会带来怎样的风险呢&#xff1f;本文将对此进行深入探讨。 众所周知&#xff0c;检测是确保产品质量的…

数据模型概念

一、概念 (1) 定义 在数据库系统中针对不同的使用对象和应用目的&#xff0c;采用不同的数据模型。根据模型的应用的不同目的&#xff0c;可以将这些模型划分为两类&#xff1a; (2) 分类 A&#xff1a;概念数据模型 它也称信息模型它是按用户的观点&#xff08;观念世界&…