这里写标题
一、环境配置
导入依赖:
- 创建一个springboot项目
<properties>
<java.version>17</java.version>
<!--自定义版本依赖-->
<elasticsearch.version>7.6.1</elasticsearch.version>
</properties>
<!--elasticsearch依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!--方便转换json数据-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.5</version>
</dependency>
创建elasticsearch配置类:
package com.kuang.config;/*
*@program:kuang_es_api
*@author: 小虎
*@Time: 2022/8/26 16:14
*@description: ElasticSearchClient
*@version 1.0.0
*/
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* spring步骤:
* 1.找对象
* 2.放到spring待用
* 3.如果是springBoot 就先分析源码
* xxxxAutoConfiguation xxxxProperties
*/
@Configuration//该类为配置文件
public class ElasticSearchClientConfig {
/**
* 类似spring <bean id="restHighLevelClient" class="RestHighLevelClient"></bean>
* @return
*/
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1",9200,"http")));
return client;
}
}
内容借鉴狂神说
二、编写测试类
注入 RestHighLevelClient
@Autowired
public RestHighLevelClient restHighLevelClient;
索引的操作
1.创建索引:
/**
* 创建一个索引hong_index,字段为user、message、postDate
* @throws IOException
*/
@Test
public void testcreateIndexAsAPI() throws IOException {
//创建一个创建索引的请求对象indexRequest
IndexRequest indexRequest = new IndexRequest("hong_index");
String jsonString = null;
for (int i = 20; i < 100; i++) {
indexRequest.id("100"+i);
jsonString = "{" +
"\"user\":\"李星云"+i+"\"," +
"\"postDate\":\"2060-01-30\"," +
"\"message\":\"不良帅"+i+"\"" +
"}";
indexRequest.source(jsonString, XContentType.JSON);
//客户端发送一个创建索引的请求并得到一个响应结果indexResponse
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println("查看响应结果:"+indexResponse.status());
System.out.println("index:"+indexResponse);
}
}
2.获取索引、并判断索引是否存在:
/**
* 从hong_index索引获取id为1009的数据
* @throws IOException
*/
@Test
void testGetIndexAsAPI() throws IOException {
GetRequest getRequest = new GetRequest("hong_index","1009");
boolean exists = client.exists(getRequest,RequestOptions.DEFAULT);
System.out.println("返回结果:"+exists);
GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println("遍历结果集:"+documentFields.getSourceAsString());
System.out.println(documentFields);
client.close();
}
3.删除索引
/**
* 删除一个id为10019的hong_index索引信息
* @throws IOException
*/
@Test
public void testDeleteIndexAsAPI() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("hong_index","10019");
deleteRequest.timeout("2s");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println("获取输出后的响应结果:"+deleteResponse.status());
System.out.println(deleteResponse);
client.close();
}
文档的操作
1.添加文档(对应关系数据库的行)
// 测试添加文档(先创建一个User实体类,添加fastjson依赖)
@Test
public void testAddDocument() throws IOException {
// 创建一个User对象
User liuyou = new User("liuyou", 18);
// 创建请求
IndexRequest request = new IndexRequest("liuyou_index");
// 制定规则 PUT /liuyou_index/_doc/1
request.id("1");// 设置文档ID
request.timeout(TimeValue.timeValueMillis(1000));// request.timeout("1s")
// 将我们的数据放入请求中
request.source(JSON.toJSONString(liuyou), XContentType.JSON);
// 客户端发送请求,获取响应的结果
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(response.status());// 获取建立索引的状态信息 CREATED
System.out.println(response);// 查看返回内容 IndexResponse[index=liuyou_index,type=_doc,id=1,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]
}
2.文档信息的获取
// 测试获得文档信息
@Test
public void testGetDocument() throws IOException {
GetRequest request = new GetRequest("hong_index","1");
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());// 打印文档内容
System.out.println(request);// 返回的全部内容和命令是一样的
restHighLevelClient.close();
}
3、文档的获取,并判断其是否存在
// 获取文档,判断是否存在 get /liuyou_index/_doc/1
@Test
public void testDocumentIsExists() throws IOException {
GetRequest request = new GetRequest("liuyou_index", "1");
// 不获取返回的 _source的上下文了
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
3、文档的获取,并判断其是否存在
// 获取文档,判断是否存在 get /liuyou_index/_doc/1
@Test
public void testDocumentIsExists() throws IOException {
GetRequest request = new GetRequest("liuyou_index", "1");
// 不获取返回的 _source的上下文了
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
4、文档的更新
// 测试更新文档内容
@Test
public void testUpdateDocument() throws IOException {
UpdateRequest request = new UpdateRequest("liuyou_index", "1");
User user = new User("lmk",11);
request.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(response.status()); // OK
restHighLevelClient.close();
}
5、文档的删除
// 测试删除文档
@Test
public void testDeleteDocument() throws IOException {
DeleteRequest request = new DeleteRequest("liuyou_index", "1");
request.timeout("1s");
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.status());// OK
}
6、文档的查询
// 查询
// SearchRequest 搜索请求
// SearchSourceBuilder 条件构造
// HighlightBuilder 高亮
// TermQueryBuilder 精确查询
// MatchAllQueryBuilder
// xxxQueryBuilder ...
@Test
public void testSearch() throws IOException {
// 1.创建查询请求对象
SearchRequest searchRequest = new SearchRequest();
// 2.构建搜索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// (1)查询条件 使用QueryBuilders工具类创建
// 精确查询
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "liuyou");
// // 匹配查询
// MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// (2)其他<可有可无>:(可以参考 SearchSourceBuilder 的字段部分)
// 设置高亮
searchSourceBuilder.highlighter(new HighlightBuilder());
// // 分页
// searchSourceBuilder.from();
// searchSourceBuilder.size();
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
// (3)条件投入
searchSourceBuilder.query(termQueryBuilder);
// 3.添加条件到请求
searchRequest.source(searchSourceBuilder);
// 4.客户端查询请求
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 5.查看返回结果
SearchHits hits = search.getHits();
System.out.println(JSON.toJSONString(hits));
System.out.println("=======================");
for (SearchHit documentFields : hits.getHits()) {
System.out.println(documentFields.getSourceAsMap());
}
}
前面的操作都无法批量添加数据
// 上面的这些api无法批量增加数据(只会保留最后一个source)
@Test
public void test() throws IOException {
IndexRequest request = new IndexRequest("bulk");// 没有id会自动生成一个随机ID
request.source(JSON.toJSONString(new User("liu",1)),XContentType.JSON);
request.source(JSON.toJSONString(new User("min",2)),XContentType.JSON);
request.source(JSON.toJSONString(new User("kai",3)),XContentType.JSON);
IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(index.status());// created
}
7.批量添加数据
/**
* 批量进行增删改查
* @throws IOException
*/
@Test
public void testBatchDelAndUpdateAndIndex() throws IOException {
BulkRequest bulkRequest = new BulkRequest();//创建批量处理的请求对象
for (int i = 2; i < 30; i++) {
/**
* 批量更新
* @Param:索引、id、更新的字段数据(指定数据的格式:XContentType.JSON)
* 注意:更新需要 .doc
* UpdateRequest updateRequest = new UpdateRequest("hong_index","200"+i)
* .doc(XContentType.JSON,"user","u雷神"+i,"message","m格鲁特"+i,"postDate",new Date());
* bulkRequest.add(updateRequest);
*/
/**
* 批量删除:只需要传索引和要删除的id
* @Param:索引名和id
* bulkRequest.add(new DeleteRequest("hong_index","200"+i));
*/
bulkRequest.add(new DeleteRequest("hong_index","200"+i));
/**
* 批量添加:
* @Param:索引、id、以及要添加的数据(指定数据的格式:XContentType.JSON)
* 注意:更新需要 .source
* bulkRequest.add(new IndexRequest ( " hong_index ")
* .id("200"+i)
* .source(XContentType.JSON,"user","u钢铁侠"+i,"message","m美国队长"+i,"postDate",new Date()));
*/
}
BulkResponse bulkItemResponses = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println("批量添加后响应结果:"+bulkItemResponses.status());
System.out.println("bulkItemResponses:"+bulkItemResponses);
System.out.println("==============================分割================================");
client.close();
}