1.1什么是elasticsearch?
elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容,,可以用来实现搜索、日志统计、分析、系统监控等功能
1.1.1什么是ELK技术栈?
是以elasticsearch为核心的技术栈,都包括:
- ElasticSearch(存储,计算,搜索数据)
- kibana(数据可视化)
- Logstash(数据抓取)
- Beats(数据抓取)
被广泛应用在日志数据分析、实时监控等领域.
1.1.2什么是Lucene?
是Apache的开源搜索引擎类库,提供了搜索引擎的核心API,elasticsearch底层是基于lucene来实现的。
Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:Apache Lucene - Welcome to Apache Lucene 。
2.1ElasticSearch采用"倒排索引",搜索很快
- 正向索引:从第一个开始一行一行的搜,需要遍历所有,速度慢,逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。
- 倒排索引:保存文章后,分词器会拆成一个一个的词,这个词那个文档用过,都会记录下来文档id比如想搜 "华为手机" ,倒推出来,文档id(1,2,3),和华为手机有关系,直接根据这个(1,2,3),列表去磁盘查找,速度很快.
总之,倒排索引就是你给我一个词,我能定位到那几个文档用过他,我直接去查用过他的文档,无需全表扫描。
3.1Mysql和Elasticsearch
Mysql:擅长事务类型操作,可以确保数据的安全和一致性
Elasticsearch:擅长海量数据的搜索、分析、计算
因此在企业中,往往是两者结合使用:
对安全性要求较高的写操作,使用mysql实现
对查询性能要求较高的搜索需求,使用elasticsearch实现
两者再基于某种方式,实现数据的同步,保证一致性
4.1.1mapping映射属性
索引库就类似MySQL数据库表,mapping映射就类似表的结构。
我们要向es中存储数据,必须先创建“库”和“表”。
- mapping是对索引库中文档的约束,常见的mapping属性包括:
- type:字段数据类型,常见的简单类型有:
- - 字符串:text(可分词的文本)、keyword(指定不拆分,如:品牌、国家、ip地址)
- - 数值:long、integer、short、byte、double、float、
- - 布尔:boolean
- - 日期:date
- - 对象:object
- - index:是否创建索引,默认为true
- - analyzer:使用哪种分词器
- - properties:该字段的子字段
5.1通过Java操作ES ,RestAPI
- ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html
- 其中的Java Rest Client又包括两种:
- Java Low Level Rest Client
- Java High Level Rest Client
5.2RestHighLevelClient
在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。分三步:
- 第一步:引入es的RestHighLevelClient依赖:
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>
- 第二步:因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:
<properties> <java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>
- 第三步:在application.yml加配置(根据自己的情况来配置,我这是以部署到linux上为例)
spring: elasticsearch: # es rest: uris: 192.168.74.129:9200 #指定自己linux的IP地址,9200是固定端口
5.3RestClient操作索引库
JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。
索引库操作的基本步骤:
- 初始化RestHighLevelClient
- 创建XxxIndexRequest。XXX是Create、Get、Delete
- 准备DSL( Create时需要,其它是无参)
- 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
5.4RestClient操作文档
文档操作的基本步骤:
- 初始化RestHighLevelClient
- 创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
- 准备参数(Index、Update、Bulk时需要)
- 发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
- 解析结果(Get时需要)