Elasticsearch基本操作
文章目录
- Elasticsearch基本操作
- 一、访问ES服务器
- 二、索引操作
- 2.1 创建索引
- 2.2 查看索引
- 2.3 删除索引
- 三、文档操作
- 3.1 创建文档
- 3.2 修改文档
- 3.3 查询文档
- 3.4 删除文档
- 四、批量操作
- 4.1 批量插入文档
- 4.2 批量删除文档
- 4.3 查询操作
一、访问ES服务器
1. 导入依赖
<!-- elasticsearch的客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.0</version>
</dependency>
<!--操作过程需要JSON转换-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
2. 访问ES服务器
//开启ES客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//关闭ES客户端
client.close();
二、索引操作
2.1 创建索引
//开启ES客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//创建索引请求,参数中指定索引的名称
CreateIndexRequest indexRequest = new CreateIndexRequest("person");
//发起请求得到响应
CreateIndexResponse response = client.indices().create(indexRequest, RequestOptions.DEFAULT);
//获取响应状态
boolean acknowledged = response.isAcknowledged();
System.out.println("创建索引结果:" + acknowledged); //true
//关闭ES客户端
client.close();
2.2 查看索引
//开启ES客户端
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
//查询索引请求
GetIndexRequest indexRequest = new GetIndexRequest("person");
GetIndexResponse response = client.indices().get(indexRequest, RequestOptions.DEFAULT);
//获取响应状态
System.out.println(Arrays.toString(response.getIndices())); //[person]
//关闭ES客户端
client.close();
2.3 删除索引
//开启ES客户端
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//发起删除索引请求
DeleteIndexRequest request = new DeleteIndexRequest("person");
AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
//得到响应状态
System.out.println(response.isAcknowledged()); //true
//关闭客户端
esClient.close();
三、文档操作
3.1 创建文档
1. 创建所要插入的文档对象
public class Person {
private String name;
private String sex;
private Integer age;
//以及Java Bean的其他结构
}
2. 插入文档到对应的索引
import com.fasterxml.jackson.databind.ObjectMapper;
//开启ES服务器
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//插入数据
IndexRequest request = new IndexRequest();
//参数1表示所要插入的索引,参数2指定插入文档的id值
request.index("person").id("1001");
//给文档对象属性赋值
Person person = new Person();
person.setName("zhangsan");
person.setAge(30);
person.setSex("男");
//向ES插入数据,必须将其转换成JSON格式
ObjectMapper mapper = new ObjectMapper();
String value = mapper.writeValueAsString(person);
//可以理解为携带的JSON格式的请求体
request.source(value, XContentType.JSON);
//得到响应结果
IndexResponse indexResponse = esClient.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.getResult()); //CREATED
//关闭ES客户端
esClient.close();
3.2 修改文档
//开启ES服务器
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//创建修改请求
UpdateRequest request = new UpdateRequest();
//参数1表示所要修改的索引,参数2指定修改文档的id值
request.index("person").id("1001");
//设置请求体,对数据进行修改,参数2表示字段名,参数3表示所要修改的值
request.doc(XContentType.JSON, "sex", "女");
//得到响应结果
UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
//关闭ES客户端
esClient.close();
3.3 查询文档
//创建查询请求
GetRequest getRequest = new GetRequest().index("person").id("1001");
GetResponse response = esClient.get(getRequest, RequestOptions.DEFAULT);
//打印结果信息
System.out.println(response.getIndex()); //person
System.out.println(response.getId()); //1001
System.out.println(response.getSourceAsString()); //{"name":"zhangsan","sex":"男","age":"22"}
3.4 删除文档
//开启ES服务器
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//创建查询请求
DeleteRequest deleteRequest = new DeleteRequest().index("person").id("1001");
DeleteResponse response = esClient.delete(deleteRequest, RequestOptions.DEFAULT);
//打印结果信息
System.out.println(response.getIndex()); //person
System.out.println(response.getId()); //1001
//关闭ES客户端
esClient.close();
四、批量操作
4.1 批量插入文档
// 创建批量操作的请求对象
BulkRequest request = new BulkRequest();
// 一次创建多个文档
request.add(new IndexRequest().index("person").id("1002").source(XContentType.JSON, "name", "lisi", "age", 30, "sex", "女"));
request.add(new IndexRequest().index("person").id("1003").source(XContentType.JSON, "name", "wangwu", "age", 40, "sex", "男"));
request.add(new IndexRequest().index("person").id("1004").source(XContentType.JSON, "name", "wangwu1", "age", 40, "sex", "女"));
request.add(new IndexRequest().index("person").id("1005").source(XContentType.JSON, "name", "wangwu2", "age", 50, "sex", "男"));
request.add(new IndexRequest().index("person").id("1006").source(XContentType.JSON, "name", "wangwu3", "age", 50, "sex", "男"));
request.add(new IndexRequest().index("person").id("1007").source(XContentType.JSON, "name", "wangwu44", "age", 60, "sex", "男"));
request.add(new IndexRequest().index("person").id("1008").source(XContentType.JSON, "name", "wangwu555", "age", 60, "sex", "男"));
request.add(new IndexRequest().index("person").id("1009").source(XContentType.JSON, "name", "wangwu66666", "age", 60, "sex", "男"));
// bulk表示批量操作
BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
// 得到操作的时长
System.out.println(response.getTook()); //14ms
4.2 批量删除文档
// 创建批量操作对象
BulkRequest request = new BulkRequest();
// 添加批量操作
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
// 执行批量操作
BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(response.getTook()); //12ms
4.3 查询操作
4.3.1 查询索引中的全部文档
// 创建查询请求
SearchRequest request = new SearchRequest();
// 指定查询索引
request.indices("person");
// 指定查询条件,matchAllQuery表示查询所有文档
request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
//执行查询
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
// 得到查询结果
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
// 得到查询结果
for ( SearchHit hit : hits ) {
System.out.println(hit.getSourceAsString());
}
运行结果:
4.3.2 条件查询
SearchRequest request = new SearchRequest();
request.indices("person");
//只查询出age等于30的文档
request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
for ( SearchHit hit : hits ) {
System.out.println(hit.getSourceAsString());
}
4.3.3 分页查询
SearchRequest request = new SearchRequest();
request.indices("person");
// 查询所有文档
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
//设定页码条件
builder.from(2);
builder.size(2);
request.source(builder);
// 得到响应结果
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
for ( SearchHit hit : hits ) {
System.out.println(hit.getSourceAsString());
}
4.3.4 查询排序
SearchRequest request = new SearchRequest();
request.indices("person");
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
// 查询结果按照age字段排序
builder.sort("age", SortOrder.DESC);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
for ( SearchHit hit : hits ) {
System.out.println(hit.getSourceAsString());
}
4.3.5 过滤字段
SearchRequest request = new SearchRequest();
request.indices("person");
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
// 结果不包含age字段
String[] excludes = {"age"};
String[] includes = {};
builder.fetchSource(includes, excludes);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
for ( SearchHit hit : hits ) {
System.out.println(hit.getSourceAsString());
}
4.3.6 多个条件组合查询
SearchRequest request = new SearchRequest();
request.indices("person");
SearchSourceBuilder builder = new SearchSourceBuilder();
// boolQuery表示组合查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//must表示且
//boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
//boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
//should表示或,也就是说age等于30或40的人都可以查询出来
boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
boolQueryBuilder.should(QueryBuilders.matchQuery("age", 40));
builder.query(boolQueryBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
for ( SearchHit hit : hits ) {
System.out.println(hit.getSourceAsString());
}
4.3.7 范围查询
SearchRequest request = new SearchRequest();
request.indices("person");
SearchSourceBuilder builder = new SearchSourceBuilder();
// 对age字段进行范围查询
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// age大于等于30,小于50
rangeQuery.gte(30);
rangeQuery.lt(50);
builder.query(rangeQuery);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
for ( SearchHit hit : hits ) {
System.out.println(hit.getSourceAsString());
}
4.3.8 模糊查询
SearchRequest request = new SearchRequest();
request.indices("person");
SearchSourceBuilder builder = new SearchSourceBuilder();
//fuzzyQuery表示模糊查询
//Fuzziness.TWO表示范围查询的步长,此处表示可以查询到与wangwu两个位置不同的结果
builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.TWO));
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
4.3.9 聚合查询
- 求最大值
SearchRequest request = new SearchRequest();
request.indices("person");
SearchSourceBuilder builder = new SearchSourceBuilder();
//求age字段的最大值,结果名称是maxAge
AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
builder.aggregation(aggregationBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
- 分组查询
SearchRequest request = new SearchRequest();
request.indices("person");
SearchSourceBuilder builder = new SearchSourceBuilder();
//对age字段进行分组
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
builder.aggregation(aggregationBuilder);
request.source(builder);
SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);