es-day01
1. 认识es
含义:elasticsearch是一款非常强大的开源搜索引擎,可以用来做海量数据的搜索、日志的统计分析、数据监控等
- 掌握
2. ELK-掌握
- es
- logstack-beats替换
- kibana
2. es的基本概念
1. 倒排索引和正向索引是什么-面试题
- 正向索引:通过id查询数据
倒排索引:通过数据查询id
2. 基本概念-重点掌握
- 文档-es中存储的一行记录就是一个文档
- 词条:按照语义进行拆分得到的单词就是词条
3. es中的基本组成-重点掌握
-
- 索引库-类似于mysql的表
-
- mapping 映射-类似于表的约束
-
- 文档:一行记录
-
- 字段:表的列
-
- DSL :MYSQL SQL
4. 使用场景
-
- es -海量数据的搜索、日志的统计分析、数据的监控
-
- mysql - 数据需要保证安全性和一致性-使用事务
-
- redis - 高并发 高性能
3. 软件的安装
1. es-版本一定要是7.12.1
2. kibana
3. 安装ik分词器
-
- 安装
-
- 分词器-重点掌握
-
ik_smart
- 粗粒度分词-得到的词条很少
- 在需要得到更加精准的数据的时候使用
-
ik_max_word
- 细粒度分词-得到的词条很多
- 在需要得到更多的数据的是时候使用
4. 索引的dsl操作-重点掌握
1. 创建索引库
PUT /itcast
{
"mappings": {
"properties": {
"age":{
"type": "integer"
},
"weight":{
"type": "float"
},
"isMarried":{
"type": "boolean"
},
"info":{
"type": "text",
"analyzer": "ik_smart"
},
"email":{
"type": "keyword",
"index": false
},
"score":{
"type": "float"
},
"name":{
"type": "object",
"properties": {
"firstName":{
"type":"keyword"
},
"lastName":{
"type":"keyword"
}
}
}
}
}
}
2. 查询索引
- GET /heima
3. 更新索引
- 注意事项:索引一旦被创建现有的字段就不能被修改只能新增字段
PUT /索引库名/_mapping
{
"properties": {
"新字段名":{
"type": "integer"
}
}
}
4. 删除索引
- DELETE /heima
索引库操作有哪些?
- 创建索引库:PUT /索引库名
- 查询索引库:GET /索引库名
- 删除索引库:DELETE /索引库名
- 添加字段:PUT /索引库名/_mapping
5. 文档的dsl操作-重点掌握
1. 新增文档
# 添加文档
POST /itcast/_doc/1
{
"age":22,
"weight":50,
"isMarried":false,
"info":"青春",
"email":"1222@cm",
"score":[99,94,98],
"name":{
"firstName":"奋斗",
"lastName":"成都"
}
}
2. 查询文档
- GET /heima/_doc/1
3. 删除文档
- DELETE /heima/_doc/1
4. 修改文档
-
- 全量更新-不推荐使用
PUT /{索引库名}/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
// ... 略
}
-
- 增量更新-推荐使用
POST /{索引库名}/_update/文档id
{
"doc": {
"字段名": "新的值",
}
}
文档操作有哪些?
- 创建文档:POST /{索引库名}/_doc/文档id { json文档 }
- 查询文档:GET /{索引库名}/_doc/文档id
- 删除文档:DELETE /{索引库名}/_doc/文档id
- 修改文档:
- 全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
- 增量修改:POST /{索引库名}/_update/文档id { “doc”: {字段}}
6. Java 操作ES-重点掌握
6.1 操作索引库
1. 索引的分析和创建
-
- id属性keyword类型
-
- 坐标使用的是geo_point
-
- 为了提交查询的速度尽可能的使用单列查询不要使用多列
-
- 创建一个逻辑字段
-
- 把需要分词的字段的词条拷贝到逻辑字段
2. 初始化高级别的api的客户端
@BeforeEach
public void BeforeClient() {
client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://1.120.45.34:9200")
));
}
3. 创建索引
-
- 通过客户端获取操作索引的核心对象并调用create方法创建索引
- 易错点:调用方法的时候一定不要调用到过时的方法
-
- 准备create方法需要的request对象,需要设置索引的名称
-
- 给request对象设置mapping映射
//准备request
CreateIndexRequest request = new CreateIndexRequest("qincun");
//准备参数
request.source(CREATE_MAPPING, XContentType.JSON);
//发送请求
client.indices().create(request, RequestOptions.DEFAULT);
4. 删除索引
//准备request
DeleteIndexRequest request = new DeleteIndexRequest("qincun");
//发送请求
client.indices().delete(request, RequestOptions.DEFAULT);
5. 判断索引是否存在
//准备request
GetIndexRequest request = new GetIndexRequest("qincun");
//发送请求
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
6.2 文档的操作
1. 新增文档
//数据库查询数据
Hotel hotel = service.getById(56201L);
//文档类型转换
HotelDoc hotelDoc = new HotelDoc(hotel);
//准备request
IndexRequest request = new IndexRequest("qincun").id(hotel.getId().toString());
//准备参数
request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
//发送请求
client.index(request, RequestOptions.DEFAULT);
2. 查询文档
- GetResponse response = client.get(request, RequestOptions.DEFAULT)
- String json = response.getSourceAsString();
3. 修改文档
全量修改
全量修改与新增的API完全一致,判断依据是ID:
- 如果新增时,ID已经存在,则修改
- 如果新增时,ID不存在,则新增
//数据库查询数据
Hotel hotel = service.getById(56201L);
//文档类型转换
HotelDoc hotelDoc = new HotelDoc(hotel);
//修改需要改变的数据
hotelDoc.setPrice(288);
hotelDoc.setBrand("青春无限好");
//准备request
IndexRequest request = new IndexRequest("qincun").id(hotel.getId().toString());
//准备参数
request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
//发送请求
client.index(request, RequestOptions.DEFAULT);
增量修改
//准备request
UpdateRequest request = new UpdateRequest("qincun", "56201");
//准备参数
request.doc(
"brand", "奋斗客栈",
"city", "杭州",
"starName", "五星级"
);
//发送请求
client.update(request, RequestOptions.DEFAULT);
4. 删除文档
- client.delete(request, RequestOptions.DEFAULT)
5. 批量添加文档
//准备request
BulkRequest request = new BulkRequest();
//从数据库批量查询数据
List<Hotel> hotels = service.list();
//遍历进行文档类型转换
HotelDoc hotelDoc = null;
for (Hotel hotel : hotels) {
hotelDoc = new HotelDoc(hotel);
request.add(new IndexRequest("qincun")
.id(hotelDoc.getId().toString())
.source(JSON.toJSONString(hotelDoc), XContentType.JSON));
}
//发送请求
client.bulk(request, RequestOptions.DEFAULT);