ES的java操作
一、添加依赖
在pom文件中添加依赖包
<dependencies><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.11.1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
二、基本框架
package com.wbb.es;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;public class Elasticsearch_Client {public static void main(String[] args) throws Exception {// 创建ES客户端RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));/*中间要做的事儿*/// 关闭ES客户端client.close();}
}
三、索引操作
3.1 创建
创建索引 test_java
// 创建索引
CreateIndexRequest request = new CreateIndexRequest("test_java");
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);// 响应状态
boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println("操作转态 :" + acknowledged);
3.2 查看
// 查询索引
GetIndexRequest request = new GetIndexRequest("test_java");
// 发送请求
GetIndexResponse response = client.indices().get(request,RequestOptions.DEFAULT);
System.out.println("aliases:"+response.getAliases());
System.out.println("mappings:"+response.getMappings());
System.out.println("settings:"+response.getSettings());
输出内容
aliases:{test_java=[]}
mappings:{test_java=org.elasticsearch.cluster.metadata.MappingMetadata@e2fe038d}
settings:{test_java={"index.creation_date":"1739345734421","index.number_of_replicas":"1","index.number_of_shards":"1","index.provided_name":"test_java","index.uuid":"R-2HSigUTCSH1mG9kiowrg","index.version.created":"7080099"}}
3.2 删除索引
// 删除索引 - 请求对象
DeleteIndexRequest request = new DeleteIndexRequest("test_java");
// 发送请求,获取响应
AcknowledgedResponse response = client.indices().delete(request,RequestOptions.DEFAULT);
// 操作结果
System.out.println("操作结果 : " + response.isAcknowledged());
四、文档操作
创建javabean
快捷键:定义属性后 ctrl + shift + a,选择 Generate …alt + insert,选择对应的getter和setter
package com.wbb.es;public class test_es {private String name;private Integer age;private String sex;public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void setSex(String sex) {this.sex = sex;}public String getName() {return name;}public Integer getAge() {return age;}public String getSex() {return sex;}}
4.1创建
4.1.1 添加单个文档
在索引 test_java下添加文档编号为001的文档
// 1、新增文档 - 请求对象
IndexRequest request = new IndexRequest();
// 2、设置索引及唯一性标识
request.index("test_java").id("001");
// 3、创建数据对象
Test_es test_es = new Test_es();
test_es.setName("tianxuanzhizi");
test_es.setAge(30);
test_es.setSex("男");
ObjectMapper objectMapper = new ObjectMapper();
String productJson = objectMapper.writeValueAsString(test_es);
// 4、添加文档数据,数据格式为 JSON 格式
request.source(productJson, XContentType.JSON);
// 5、客户端发送请求,获取响应对象
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());
输出信息
_index:test_java
_id:001
_result:CREATED
4.1.2 添加多个文档
//创建批量新增请求对象
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("test_java").id("001").source(XContentType.JSON, "name","tianxuanzhizi001", "age", 30, "sex", "男"));
request.add(new IndexRequest().index("test_java").id("002").source(XContentType.JSON, "name","tianxuanzhizi002", "age", 31, "sex", "女"));
//客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
//打印结果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());
输出结果
took:198ms
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@5609159b
4.2 修改
修改 test_java索引下,id为 001 的文档,sex为”未知“
// 1、修改文档 - 请求对象
UpdateRequest request = new UpdateRequest();
// 2、配置修改参数
request.index("test_java").id("001");
// 3、设置请求体,对数据进行修改
request.doc(XContentType.JSON, "sex", "未知");
// 客户端发送请求,获取响应对象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index:" + response.getIndex());
System.out.println("_id:" + response.getId());
System.out.println("_result:" + response.getResult());
输出信息
_index:test_java
_id:001
_result:UPDATED
4.3 查看
//1.创建请求对象
GetRequest request = new GetRequest().index("test_java").id("001");
//2.客户端发送请求,获取响应对象
GetResponse response = client.get(request, RequestOptions.DEFAULT);
//3.打印结果信息
System.out.println("_index:" + response.getIndex());
System.out.println("_type:" + response.getType());
System.out.println("_id:" + response.getId());
System.out.println("source:" + response.getSourceAsString());
输出结果
_index:test_java
_type:_doc
_id:001
source:{"name":"tianxuanzhizi","age":30,"sex":"未知"}
4.4 删除
4.4.1 删除单个文档
//1、创建请求对象
DeleteRequest request = new DeleteRequest().index("test_java").id("001");
//2、客户端发送请求,获取响应对象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
//打印信息
System.out.println(response.toString());
输出信息
DeleteResponse[index=test_java,type=_doc,id=001,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]
4.4.2 删除多个文档
//创建批量删除请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("test_java").id("001"));
request.add(new DeleteRequest().index("test_java").id("002"));
//客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
//打印结果信息
System.out.println("took:" + responses.getTook());
System.out.println("items:" + responses.getItems());
System.out.println("items:" + responses.getItems());
输出信息
took:201ms
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@7c9d8e2
items:[Lorg.elasticsearch.action.bulk.BulkItemResponse;@7c9d8e2
4.5 查询
4.5.1 查询的基本框架
package com.wbb.es;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;public class Elasticsearch_Client {public static void main(String[] args) throws Exception {// 创建ES客户端RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 创建搜索请求对象SearchRequest request = new SearchRequest();request.indices("test_java");// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();/*查询设置*/request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 查询匹配SearchHits hits = response.getHits();System.out.println("took:" + response.getTook());System.out.println("timeout:" + response.isTimedOut());System.out.println("total:" + hits.getTotalHits());System.out.println("MaxScore:" + hits.getMaxScore());System.out.println("========doc=========");for (SearchHit hit : hits) {//输出每条查询的结果信息System.out.println(hit.getSourceAsString());}// 关闭ES客户端client.close();}
}
4.5.1 查询所有文档
sourceBuilder.query(QueryBuilders.matchAllQuery());
输出信息
took:2ms
timeout:false
total:2 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
{"name":"tianxuanzhizi002","age":31,"sex":"女"}
4.5.2 按照字段名进行查询
sourceBuilder.query(QueryBuilders.termQuery("age", "30"));
输出
took:3ms
timeout:false
total:1 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
4.5.3 分页查询
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 分页查询
// 分页起始位置(第一条数据的顺序号)
sourceBuilder.from(0);
// 每页显示多少条
sourceBuilder.size(2);
输出
took:2ms
timeout:false
total:2 hits
MaxScore:1.0
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
{"name":"tianxuanzhizi002","age":31,"sex":"女"}
4.5.4 排序查询
按照年龄排序
sourceBuilder.query(QueryBuilders.matchAllQuery());
sourceBuilder.sort("age", SortOrder.ASC);
4.5.5 过滤字段
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 只查看 name 和 age
String[] excludes = {};
String[] includes = {"name", "age"};
sourceBuilder.fetchSource(includes, excludes);
4.5.6 组合查询
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 必须包含
boolQueryBuilder.must(QueryBuilders.matchQuery("age", "30"));
// 一定不含
boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "bug"));
// 可能包含
boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));sourceBuilder.query(boolQueryBuilder);
输出结果
took:3ms
timeout:false
total:1 hits
MaxScore:1.6931472
========doc=========
{"name":"tianxuanzhizi001","age":30,"sex":"男"}
4.5.7 范围查询
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// 大于等于
rangeQuery.gte("30");
// 小于等于
rangeQuery.lte("40");
sourceBuilder.query(rangeQuery);
4.5.8 模糊查询
sourceBuilder.query(QueryBuilders.fuzzyQuery("name","tianxuanzhizi").fuzziness(Fuzziness.ONE));
4.5.9 高亮查询
//构建查询方式:高亮查询
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name","tianxuanzhizi001");
//设置查询方式
sourceBuilder.query(termsQueryBuilder);
//构建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color='red'>");//设置标签前缀
highlightBuilder.postTags("</font>");//设置标签后缀
highlightBuilder.field("name");//设置高亮字段
//设置高亮构建对象
sourceBuilder.highlighter(highlightBuilder);
输出前设置高亮颜色
//打印高亮结果 Map<String, HighlightField> highlightFields = hit.getHighlightFields()System.out.println(highlightFields);;
查询结果
took:171ms
timeout:false
total:1 hits
MaxScore:1.0
========doc=========
{name=[name], fragments[[<font color='red'>tianxuanzhizi001</font>]]}
4.5.9 聚合查询
查询最大年龄
sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));
输出response
System.out.println(response);
输出结果
{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"test_java","_type":"_doc","_id":"001","_score":1.0,"_source":{"name":"tianxuanzhizi001","age":30,"sex":"男"}},{"_index":"test_java","_type":"_doc","_id":"002","_score":1.0,"_source":{"name":"tianxuanzhizi002","age":31,"sex":"女"}}]},"aggregations":{"max#maxAge":{"value":31.0}}}
4.5.10 分组聚合
按性别分组
sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
输出response
System.out.println(response);
输出结果
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"test_java","_type":"_doc","_id":"001","_score":1.0,"_source":{"name":"tianxuanzhizi001","age":30,"sex":"男"}},{"_index":"test_java","_type":"_doc","_id":"002","_score":1.0,"_source":{"name":"tianxuanzhizi002","age":31,"sex":"女"}}]},"aggregations":{"lterms#age_groupby":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":30,"doc_count":1},{"key":31,"doc_count":1}]}}}