5、通过Java访问ES
5.1 环境
创建maven工程,主要是通过两个依赖:
<!--主要是这两个依赖--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> </dependency> <!-- elasticsearch 的客户端 --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.8.0</version> </dependency> <!-- elasticsearch 依赖 2.x 的 log4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.9</version> </dependency> <!-- junit 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
5.2 索引操作
5.2.1 创建索引
首先需要使用RestHighLevelClient创建客户端,
RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost",9200,"http")) // 其中包括主机名,端口,请求方式 ); // 创建索引请求 CreateIndexRequest request = new CreateIndexRequest("user"); //user是索引的名 // 通过客户端创建索引并得到响应的请求 CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT); //相应状态 boolean acknowledged = response.isAcknowledged(); System.out.println(acknowledged); restHighLevelClient.close();
5.2.2 查询索引
查询索引使用的是GetIndexRequest,及GetIndexResponse.
// 创建索引 GetIndexRequest request = new GetIndexRequest("user"); GetIndexResponse response = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
通过postman查询的索引信息主要包括下面的内容,通过java的api的get方法得到响应的信息
{ "user": { "aliases": {}, //response.getAliases(); "mappings": {}, //response.getMappings(); "settings": { //response.getSettings(); "index": { "creation_date": "1650780419948", "number_of_shards": "1", "number_of_replicas": "1", "uuid": "dWGyIiiFTZ6gEtqfqJ-g_g", "version": { "created": "7080099" }, "provided_name": "user" } } } }
5.2.3 删除索引
删除索引使用DeleteIndexRequest,返回的可以是bool值表示是否删除成功。
DeleteIndexRequest request = new DeleteIndexRequest("user");
AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
response.isAcknowledged();
5.3 文档操作
5.3.1 创建文档
创建文档首先需要有插入的内容,定义一个实体类并给与相应的数据。插入文档对应的是IndexRequest,及request.source()方法。
public class ESTest_InsertDoc { public static void main(String[] args) throws IOException { RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost",9200,"http")) ); // 创建文档 IndexRequest request = new IndexRequest("user"); // 设置文档的id(自定义id) request.id("1001"); // 文档的内容 相当于一行数据 User user=new User(); user.setName("张三"); user.setSex("男"); user.setAge(25); // 由于文档是json格式 因此需要把对象转换成json字符串 ObjectMapper objectMapper=new ObjectMapper(); String insertDocString = objectMapper.writeValueAsString(user); request.source(insertDocString, XContentType.JSON); //调用方法插入文档 IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT); //相应状态 System.out.println(response.getResult()); restHighLevelClient.close(); } }
5.3.2 修改文档
修改文档对应的是UpdateRequest,及request.doc()方法。
// 修改文档 UpdateRequest request = new UpdateRequest(); request.index("user"); request.id("1001"); // 将性别修改为女 request.doc(XContentType.JSON,"sex","女"); UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT); //相应状态 System.out.println(response.getResult()); restHighLevelClient.close();
5.3.3 查询文档
修改文档对应的是GetRequest,及request.get()方法。
// 查询文档 GetRequest request = new GetRequest(); request.index("user").id("1001"); GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT); //相应状态 System.out.println(response.getSourceAsString());
5.3.4 删除文档
修改文档对应的是DeleteRequest。
// 删除文档 DeleteRequest request = new DeleteRequest(); request.index("user").id("1001"); DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT); //相应状态 System.out.println(response.getResult());
5.3.5 批量增加文档
// 创建文档 BulkRequest request = new BulkRequest(); ObjectMapper objectMapper=new ObjectMapper(); request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON,"name","张三","sex","男","age",20)); request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON,"name","李四","sex","男","age",20)); request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON,"name","王五","sex","男","age",20)); request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON,"name","赵六","sex","男","age",20)); BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); //相应状态 System.out.println(response.getItems());
5.3.6 批量删除文档
// 删除文档 BulkRequest request = new BulkRequest(); ObjectMapper objectMapper=new ObjectMapper(); request.add(new DeleteRequest().index("user").id("1001")); request.add(new DeleteRequest().index("user").id("1002")); request.add(new DeleteRequest().index("user").id("1003")); request.add(new DeleteRequest().index("user").id("1004")); BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); //相应状态 System.out.println(response.getItems());
5.3.7 全量查询
// 全量文档
SearchRequest request = new SearchRequest("user");
request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
//相应状态
System.out.println(hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
restHighLevelClient.close();
5.3.8 条件&分页&排序查询
//条件查询
SearchRequest request = new SearchRequest("user");
request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("sex","男")));
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
//相应状态
System.out.println(hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
// 分页查询文档
SearchRequest request = new SearchRequest("user");
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
builder.from(0);
builder.size(2);
request.source(builder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
//相应状态
System.out.println(hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
// 排序查询文档
SearchRequest request = new SearchRequest("user");
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
builder.sort("age", SortOrder.DESC);
request.source(builder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
//相应状态
System.out.println(hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
restHighLevelClient.close();