Elasticsearch专栏-9.springboot集成es

pom添加依赖

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.14.0</version>
        </dependency>

添加配置文件

package com.example.demo.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @description:
 * @author: junzhang
 * @time: 2022/2/18 16:50
 */
@Configuration
public class EsConfig {
    @Value("${es.hostName}")
    private String hostName;
    @Value("${es.port}")
    private Integer port;
    @Value("${es.scheme}")
    private String scheme;

    @Bean
    public RestHighLevelClient esRestClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        //单机
                        new HttpHost(hostName, port, scheme)
                )
        );
        return client;
    }
/*  @Bean
    public RestHighLevelClient esRestClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        //集群
                        new HttpHost("192.168.88.207", 9205, "http"),
                        new HttpHost("192.168.88.206", 9205, "http"),
                        new HttpHost("192.168.88.110", 9205, "http")
                )
        );
        return client;
    }*/
}

索引curd

创建索引

CreateIndexRequest request = new CreateIndexRequest("myindex01");
esClient.indices().create(request, RequestOptions.DEFAULT);

删除索引

DeleteIndexRequest request = new DeleteIndexRequest("myindex01");
esClient.indices().delete(request, RequestOptions.DEFAULT);

判断索引是否存在

GetIndexRequest request = new GetIndexRequest("myindex01");
boolean res = esClient.indices().exists(request, RequestOptions.DEFAULT);

文档curd

创建文档

EsUserTest user = new EsUserTest(30, "zhangjun");
IndexRequest request = new IndexRequest("myindex01");
request.id("2");
//request.timeout(TimeValue.timeValueSeconds(1));
request.source(JSON.toJSONString(user), XContentType.JSON);
IndexResponse res = esClient.index(request, RequestOptions.DEFAULT);

删除文档

DeleteRequest deleteRequest = new DeleteRequest("myindex01", "1");
DeleteResponse delete = esClient.delete(deleteRequest, RequestOptions.DEFAULT);

修改文档

EsUserTest user = new EsUserTest(40, "zhangjun");
UpdateRequest updateRequest = new UpdateRequest("myindex01", "2");
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
esClient.update(updateRequest, RequestOptions.DEFAULT);

查询文档

GetRequest getRequest = new GetRequest("myindex01", "2");
GetResponse get = esClient.get(getRequest, RequestOptions.DEFAULT);

批量插入文档

ArrayList<EsUserTest> userArrayList = new ArrayList<>();
userArrayList.add(new EsUserTest(12, "zhangjun12"));
userArrayList.add(new EsUserTest(13, "zhangjun13"));
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
//批处理请求
for (int i = 0; i < userArrayList.size(); i++) {
	bulkRequest.add(
			new IndexRequest("myindex01")
					.id("zjun" + (i + 1))
					.source(JSON.toJSONString(userArrayList.get(i)), XContentType.JSON)
	);
}
/*BulkRequest request = new BulkRequest();
request.add(new DeleteRequest("posts", "3"));
request.add(new UpdateRequest("posts", "2")
		.doc(XContentType.JSON,"other", "test"));
request.add(new IndexRequest("posts").id("4")
		.source(XContentType.JSON,"field", "baz"));*/
BulkResponse bulkResponse = esClient.bulk(bulkRequest, RequestOptions.DEFAULT);

判断文档是否存在

GetRequest getRequest = new GetRequest("myindex01", "1");
boolean res = esClient.exists(getRequest, RequestOptions.DEFAULT);

多条件查询

//1、指定索引,创建查询请求
SearchRequest request = new SearchRequest("bank");

//2、创建条件构造器
SearchSourceBuilder builder = new SearchSourceBuilder();

//3、构造条件

//查询全部
//MatchAllQueryBuilder matchQueryBuilder = QueryBuilders.matchAllQuery();
//分词查询
//MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "Place National");
//多字段分词查询
//MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery("mill urie", "address", "city");
//MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery("mill Road", "address", "city").type("phrase");
//bool查询
/*BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("gender", "M")).must(QueryBuilders.matchQuery("address", "mill"))
		.mustNot(QueryBuilders.matchQuery("age", "18")).should(QueryBuilders.matchQuery("lastname", "Wallace"));*/
/*BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("gender", "M")).must(QueryBuilders.matchQuery("address", "mill"))
		.filter(QueryBuilders.rangeQuery("age").gte(10).lte(50)).filter(QueryBuilders.rangeQuery("balance").gte(9812).lte(9813));*/
//数值精准查询
//TermQueryBuilder queryBuilder = QueryBuilders.termQuery("age", 33);
/*BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().should(QueryBuilders.termQuery("balance", 34487)).
		should(QueryBuilders.termQuery("balance", 29104));*/
//查询多个精确值
//TermsQueryBuilder queryBuilder = QueryBuilders.termsQuery("balance", "34487", "29104");
//TermsQueryBuilder queryBuilder = QueryBuilders.termsQuery("balance", new long[]{34487L, 29104L});
//TermsQueryBuilder queryBuilder = QueryBuilders.termsQuery("balance", new int[]{34487, 29104});
//不分词查询,有结果
//TermQueryBuilder queryBuilder = QueryBuilders.termQuery("address.keyword", "717 Hendrickson Place");
//无结果
//TermQueryBuilder queryBuilder = QueryBuilders.termQuery("address", "717 Hendrickson Place");
QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("address", "Hutchinson Court");
//设置返回结果:分页、排序、返回部分字段等
//builder.query(matchQueryBuilder).from(0).size(5).fetchSource(new String[]{"age", "gender"}, new String[]{});
//builder.query(matchQueryBuilder).from(0).size(5).sort("age", SortOrder.DESC);
builder.query(queryBuilder);

//4、将构造好的条件放入请求中
request.source(builder);

//5、开始执行发送request请求
SearchResponse searchResponse = esClient.search(request, RequestOptions.DEFAULT);

//6、命中结果业务处理
SearchHit[] hits = searchResponse.getHits().getHits();
//总数
long total = searchResponse.getHits().getTotalHits().value;
for (SearchHit hit : hits) {
	String hitString = hit.getSourceAsString();
	System.out.println(hitString);
}

聚合查询

//1、创建查询请求,规定查询的索引
SearchRequest request = new SearchRequest("bank");
//2、创建条件构造
SearchSourceBuilder builder = new SearchSourceBuilder();
//3、查询
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "mill");
builder.query(matchQueryBuilder).size(1);
//4、聚合
AvgAggregationBuilder ageAvg = AggregationBuilders.avg("ageAvg").field("age");
MinAggregationBuilder ageMin = AggregationBuilders.min("ageMin").field("age");
MaxAggregationBuilder ageMax = AggregationBuilders.max("ageMax").field("age");
SumAggregationBuilder ageSum = AggregationBuilders.sum("ageSum").field("age");
ValueCountAggregationBuilder ageCount = AggregationBuilders.count("ageCount").field("age");
builder.aggregation(ageAvg).aggregation(ageMin).aggregation(ageMax).aggregation(ageSum).aggregation(ageCount);
//5、将构造好的条件放入请求中
request.source(builder);
//6、开始执行发送request请求
SearchResponse searchResponse = esClient.search(request, RequestOptions.DEFAULT);
//7、开始处理返回的数据
//总数
long total = searchResponse.getHits().getTotalHits().value;
System.out.println(total);
//原始数据
SearchHit[] hits = searchResponse.getHits().getHits();
List<Map<String, Object>> listMap = new ArrayList<>();
for (SearchHit hit : hits) {
	String hitString = hit.getSourceAsString();
	System.out.println(hitString);
	log.info("id:{},score:{}", hit.getId(), hit.getScore());
	listMap.add(hit.getSourceAsMap());
}
//聚合数据
Avg avgRes = searchResponse.getAggregations().get("ageAvg");
Min minRes = searchResponse.getAggregations().get("ageMin");
Max maxRes = searchResponse.getAggregations().get("ageMax");
Sum sumRes = searchResponse.getAggregations().get("ageSum");
ValueCount countRes = searchResponse.getAggregations().get("ageCount");
log.info("avg:{},min:{},max:{},sum:{},count:{}", avgRes.getValue(), minRes.getValue(), maxRes.getValue(), sumRes.getValue(), countRes.getValue());

分组查询

//1、创建查询请求,规定查询的索引
SearchRequest request = new SearchRequest("bank");
//2、创建条件构造
SearchSourceBuilder builder = new SearchSourceBuilder();
//3、构造条件
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "mill");
builder.query(matchQueryBuilder);
//分组
TermsAggregationBuilder ageGroup = AggregationBuilders.terms("ageGroup").field("age");
builder.aggregation(ageGroup);
//4、将构造好的条件放入请求中
request.source(builder);
//5、开始执行发送request请求
SearchResponse searchResponse = esClient.search(request, RequestOptions.DEFAULT);
//6、开始处理返回的数据
Terms meta = searchResponse.getAggregations().get("ageGroup");
List<? extends Terms.Bucket> buckets = meta.getBuckets();
for (Terms.Bucket bucket : buckets) {
	String key = bucket.getKeyAsString();
	long value = bucket.getDocCount();
	log.info("key:{},value:{}", key, value);
}

分组子聚合查询

//1、创建查询请求,规定查询的索引
SearchRequest request = new SearchRequest("bank");
//2、创建条件构造
SearchSourceBuilder builder = new SearchSourceBuilder();
//3、构造条件
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "mill");
builder.query(matchQueryBuilder);
//父聚合
TermsAggregationBuilder ageGroup = AggregationBuilders.terms("ageGroup").field("age");
//子聚合
AvgAggregationBuilder subAvg = AggregationBuilders.avg("ageAvg").field("age");
SumAggregationBuilder subSum = AggregationBuilders.sum("ageSum").field("age");
//设置父子顺序
ageGroup.subAggregation(subAvg).subAggregation(subSum);
builder.aggregation(ageGroup);
//4、将构造好的条件放入请求中
request.source(builder);
//5、开始执行发送request请求
SearchResponse searchResponse = esClient.search(request, RequestOptions.DEFAULT);
//6、开始处理返回的数据
Terms meta = searchResponse.getAggregations().get("ageGroup");
List<? extends Terms.Bucket> buckets = meta.getBuckets();
//meta.getBucketByKey()
for (Terms.Bucket bucket : buckets) {
	String key = bucket.getKeyAsString();
	long value = bucket.getDocCount();
	log.info("key:{},value:{}", key, value);
	Avg subavg = bucket.getAggregations().get("ageAvg");
	Sum subsum = bucket.getAggregations().get("ageSum");
	log.info("subavg:{},subsum:{}", subavg.getValue(), subsum.getValue());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值