ElasticSearch --索引和文档增删改查操作

RestClient操作索引

官方文档:

Elasticsearch Clients | Elastic

1. 环境准备

1)因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:

    7.12.1

2)引入es的RestHighLevelClient依赖:

    elasticsearch-rest-high-level-client

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")
              */
       
}
    }

2. 创建索引库

代码分为三步:(删改都是三步走,有的可能不需要请求参数)

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

3. 判断索引库是否存在

@Test
void indexExistJudgeTest() throws IOException {
   
GetIndexRequest request = new GetIndexRequest(ESconstants.INDEX);
   
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
   
System.out.println(exists);
}

4. 删除索引库

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

5. 规律小结

- 初始化RestHighLevelClient【包不要导错:org.elasticsearch.client.RestHighLevelClient】

- 创建XxxIndexRequest。XXX是Create、Get、Delete

- 准备DSL( Create时需要,其它是无参)

- 发送请求。调用`RestHighLevelClient#indices().xxx()`方法,xxx是create、exists、delete

5.6 RestClient操作文档

DSL (Domain Specific Language特定领域语言),以 JSON 请求体的形式出现。 DSL查询是ES提供的通用查询方式,这种方式最大的特点是 开发语言 的 无关性 ,即任意的客户端只要支持HTTP请求,就可以通过 JSON格式 的查询数据完成复杂的搜索。

1. 新增文档

注意点:

实体类和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);
}

3. 删除文档

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

4. 修改文档

//修改文档(增量修改)
@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);
}

5. 批量处理

批量处理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);
}

6. 规律小结-详细步骤

文档操作的基本步骤:

- 初始化RestHighLevelClient

- 创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk

- 准备参数(Index、Update、Bulk时需要)

- 发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk

- 解析结果(Get时需要)

你可能感兴趣的:(elasticsearch,大数据,搜索引擎)