快速搭建环境
- 导入依赖
<properties>
#由于默认的版本与我们拥有的版本不一致,因此需要自定义es的版本
<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 注册到Spring中
@Configuration
public class ElasticSearch_Config {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
// 非集群配置一个即可
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
return client;
}
}
API测试
1. 创建索引
@SpringBootTest
class DemoApplicationTests {
@Resource(name="restHighLevelClient")
private RestHighLevelClient client;
@Test
void contextLoads() throws IOException {
// 1.创建一个创建索引的请求
CreateIndexRequest request = new CreateIndexRequest("spring-es-test");
//2.客户端处理请求,返回响应
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
//3.查看响应
System.out.println(response);
}
}
2. 获取索引
对于一个索引我们只能判断其是否存在
@Test
void contextLoads_2() throws IOException {
// 1.创建一个获取索引的请求
GetIndexRequest request = new GetIndexRequest("spring-es-test");
//2.客户端处理请求,返回响应
boolean bool = client.indices().exists(request,RequestOptions.DEFAULT);
//3.查看响应
System.out.println(bool);
}
3. 删除索引
@Test
void contextLoads_3() throws IOException {
// 1.创建一个删除索引的请求
DeleteIndexRequest request = new DeleteIndexRequest("spring-es-test");
//2.客户端处理请求,返回响应
AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
//3.查看响应
System.out.println(delete.isAcknowledged());
}
4.文档操作CRUD
1. 添加文档
@Test
void contextLoads_4() throws IOException {
//创建对象
User user = new User("遇见", 18);
//创建请求
IndexRequest request=new IndexRequest("spring-es-test");
// 设置规则 put spring-es-test/_doc/1
request.id("1");
request.timeout("1s");
// 以json字符串的形式提供数据源
request.source(JSON.toJSONString(user), XContentType.JSON);
IndexResponse index = client.index(request, RequestOptions.DEFAULT);
System.out.println(index.toString());
System.out.println(index.status());
}
2. 获取文档
storedFields与fetchSourceContext说明
@Test
void contextLoads_5() throws IOException {
//创建请求
GetRequest request=new GetRequest("spring-es-test","1");
// 设置规则 get spring-es-test/_doc/1
//允许为此请求设置FetchSourceContext来控制是否应返回_source以及如何返回_source。
// 不进行进行字段过滤
//request.fetchSourceContext(new FetchSourceContext(false));
//明确指定将要返回的存储字段。默认情况下,将返回_source字段。
// 需要指定字段的store(默认false)为true的时候才会返回
//request.storedFields("_type");
System.out.println(client.exists(request, RequestOptions.DEFAULT));
GetResponse response = client.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
System.out.println(response);
}
true
{"age":18,"name":"遇见"}
{"_index":"spring-es-test","_type":"_doc","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"age":18,"name":"遇见"}}
3. 更新文档
@Test
void contextLoads_6() throws IOException {
//创建请求
UpdateRequest request=new UpdateRequest("spring-es-test","1");
request.timeout("1s");
User user = new User("遇见", 20);
request.doc(JSON.toJSONString(user), XContentType.JSON);
UpdateResponse update = client.update(request, RequestOptions.DEFAULT);
System.out.println(update.toString());
System.out.println(update.status());
}
UpdateResponse[index=spring-es-test,type=_doc,id=1,version=2,seqNo=1,primaryTerm=1,result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]
OK
4. 删除文档
@Test
void contextLoads_7() throws IOException {
//创建请求
DeleteRequest request=new DeleteRequest("spring-es-test","1");
request.timeout("1s");
DeleteResponse delete = client.delete(request, RequestOptions.DEFAULT);
System.out.println(delete.toString());
System.out.println(delete.status());
}
DeleteResponse[index=spring-es-test,type=_doc,id=1,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]
OK
批量操作
- 批量添加
@Test
void contextLoads_8() throws IOException {
BulkRequest bulkRequest=new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> userlist=new ArrayList<>();
userlist.add(new User("遇见1",18));
userlist.add(new User("遇见2",19));
userlist.add(new User("遇见3",20));
userlist.add(new User("遇见4",21));
for (int i=0;i<userlist.size();i++)
{
bulkRequest.add(new IndexRequest("spring-es-test")
.id(""+(i+1))
.source(JSON.toJSONString(userlist.get(i)),XContentType.JSON));
}
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
// 有无失败,false代表成功
System.out.println(bulk.hasFailures());
}
-
批量删除 与添加类似,只需将for循环中的方法改改即可
-
批量查询
@Test
void contextLoads_9() throws IOException {
SearchRequest request=new SearchRequest("spring-es-test");
SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
//使用QueryBuilders 工具类来构建查询条件
//QueryBuilders.termQuery 精准匹配
//QueryBuilders.matchAllQuery 匹配所有
QueryBuilder queryBuilder= QueryBuilders.termQuery("name.keyword","遇见1");
sourceBuilder.timeout(new TimeValue(10, TimeUnit.SECONDS));
sourceBuilder.query(queryBuilder);
request.source(sourceBuilder);
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(search.getHits()));
System.out.println(search.status());
System.out.println("=============================");
for (SearchHit documentFields:search.getHits().getHits())
System.out.println(documentFields.getSourceAsMap());
}
闲聊
在ElasticsearchRestClientAutoConfiguration类的静态内部类中也自动为我们配置了该对象,直接使用也可。但如果已经注册了就不能再使用该类了 @ConditionalOnMissingBean
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(RestHighLevelClient.class)
static class RestHighLevelClientConfiguration {
@Bean
RestHighLevelClient elasticsearchRestHighLevelClient(RestClientBuilder restClientBuilder) {
return new RestHighLevelClient(restClientBuilder);
}
}