赞
踩
官方文档:
Elasticsearch Clients | Elastic
1)因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:
<properties>
<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
2)引入es的RestHighLevelClient依赖:
<artifactId>elasticsearch-rest-high-level-client</artifactId>
3) 为避免写错,写一个es常量类
String ES_HOST = "192.168.138.101";
int ES_PORT = 9200;
String INDEX = "hotel";
String MAPPINGS =“”;
4)RestHighLevelClient 的bean准备
RestHighLevelClient 底层封装的是一个http连接池,当需要执行 update、index、delete操作时,直接从连接池中取出一个连接,然后发送http请求到ElasticSearch服务端,服务端基于Netty接收请求。
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient; 不要导错包
@Configuration
public class RestHighLevelClientConfig {
@Bean
public RestHighLevelClient client(){
return new RestHighLevelClient(RestClient.builder(new HttpHost(EsConstant.ES_HOST, EsConstant.ES_PORT)));
/*return new RestHighLevelClient(
RestClient.builder(
HttpHost.create("http://192.168.138.101:9200")
*/
}
}
代码分为三步:(删改都是三步走,有的可能不需要请求参数)
- 1)创建Request对象。因为是创建索引库的操作,因此Request是CreateIndexRequest。
- 2)添加请求参数,其实就是DSL的JSON参数部分。因为json字符串很长,这里是定义了静态字符串常量MAPPING_TEMPLATE,让代码看起来更加优雅。
- 3)发送请求,client.indices()方法的返回值是IndicesClient类型,封装了所有与索引库操作有关的方法。
创建索引库, mapping映射要考虑的信息包括:
- 字段名
- 字段数据类型
- 是否参与搜索
- 是否需要分词
- 如果分词,分词器是什么?
其中:
- 字段名、字段数据类型,可以参考数据表结构的名称和类型
- 是否参与搜索要分析业务来判断,例如图片地址,就无需参与搜索
- 是否分词呢要看内容,内容如果是一个整体就无需分词,反之则要分词
- 分词器,我们可以统一使用`ik_max_word
@Autowired
RestHighLevelClient client;
//创建索引库
@Test
public void createIndexTest() throws Exception {
CreateIndexRequest request = new CreateIndexRequest(ESconstants.INDEX);
request.source(ESconstants.MAPPING_TEMPLATE, XContentType.JSON);
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(response);
}
@Test
void indexExistJudgeTest() throws IOException {
GetIndexRequest request = new GetIndexRequest(ESconstants.INDEX);
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
@Test
void deleteIndexTest() throws IOException {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(ESconstants.INDEX);
AcknowledgedResponse acknowledgedResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
boolean acknowledged = acknowledgedResponse.isAcknowledged();
System.out.println(acknowledged);
}
- 初始化RestHighLevelClient【包不要导错:org.elasticsearch.client.RestHighLevelClient】
- 创建XxxIndexRequest。XXX是Create、Get、Delete
- 准备DSL( Create时需要,其它是无参)
- 发送请求。调用`RestHighLevelClient#indices().xxx()`方法,xxx是create、exists、delete
DSL (Domain Specific Language特定领域语言),以 JSON 请求体的形式出现。 DSL查询是ES提供的通用查询方式,这种方式最大的特点是 开发语言 的 无关性 ,即任意的客户端只要支持HTTP请求,就可以通过 JSON格式 的查询数据完成复杂的搜索。
注意点:
实体类和doc的字段可能不同,索引要准备一个对应doc字段的实体类;
@Autowired
HotelService hotelService;
@Autowired//底层是封装了发起http请求的连接的连接池
RestHighLevelClient client;
//增加文档
@Test
void addDocTest() throws Exception {
Hotel hotel = hotelService.getById(36934);
HotelDoc hotelDoc = new HotelDoc(hotel);
//1. 获取文档数据
String hotelDocJson = JSON.toJSONString(hotelDoc);
//2. 设置请求
IndexRequest indexRequest = new IndexRequest(ESconstants.INDEX);
indexRequest.id(hotelDoc.getId().toString());
indexRequest.source(hotelDocJson, XContentType.JSON);
//3. 发起请求
IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(response.toString());
}
2. 查询文档
@Test
void getDocTest() throws Exception {
//1. 准备请求,参数是:索引库名,文档id
GetRequest getRequest = new GetRequest(ESconstants.INDEX, "36934");
//2. 发起请求
GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
//3. 解析响应数据
String source = response.getSourceAsString();
System.out.println(source);
}
@Test
void deleteDocTest() throws IOException {
//1. 准备请求,参数是:索引库名,文档id
DeleteRequest deleteRequest = new DeleteRequest(ESconstants.INDEX, "36934");
//2. 发起请求
DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
//3. 解析结果,状态码,200成功
RestStatus status = delete.status();
System.out.println(status.getStatus());
}
//修改文档(增量修改)
@Test
void modifyDocTest() throws IOException {
//1. 准备请求,参数是:索引库名,文档id
UpdateRequest updateRequest = new UpdateRequest(ESconstants.INDEX, "36934");
//2. 请求数据
HashMap<String, Object> map = new HashMap<>();
map.put("brand","9天客栈");
map.put("city","郑州");
updateRequest.doc(map);
//3. 发起请求
UpdateResponse response = client.update(updateRequest, RequestOptions.DEFAULT);
//4. 解析结果,result:UPDATED
DocWriteResponse.Result result = response.getResult();
System.out.println(result);
}
批量处理BulkRequest,其本质就是将多个普通的CRUD请求组合在一起发送。其中提供了一个add方法,用来添加其他请求:
- IndexRequest,也就是新增
- UpdateRequest,也就是修改
- DeleteRequest,也就是删除
...
//批量处理(如新增)
@Test
void bulkProcessTest() throws IOException {
// 1. 创建bulkReqeust
BulkRequest bulkRequest = new BulkRequest();
List<Hotel> hotels = hotelService.list();
for (Hotel hotel : hotels) {
//2. 遍历业务需要的请求
HotelDoc hotelDoc = new HotelDoc(hotel);
IndexRequest indexRequest = new IndexRequest(ESconstants.INDEX);
String docJSon = JSON.toJSONString(hotelDoc);
indexRequest.source(docJSon, XContentType.JSON);
//3. 将请求加入bulkReqeust
bulkRequest.add(indexRequest);
}
//4. 发送请求
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
}
文档操作的基本步骤:
- 初始化RestHighLevelClient
- 创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
- 准备参数(Index、Update、Bulk时需要)
- 发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
- 解析结果(Get时需要)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。