elasticsearch-java api 8 升级_elasticsearch java api8 elasticsearch8(1)

co.elastic.clients elasticsearch-java 8.10.4
查询api代码调整

参考官方文档: https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/getting-started-java.html

创建client

@Bean
public ElasticsearchClient elasticsearchClient(ESProperties esProperties) {
HttpHost[] httpHosts = new HttpHost[esProperties.getNodes().size()];
// 这里配置你的es服务端host
for (int i = 0; i < esProperties.getNodes().size(); i++) {
ESProperties.Node node = esProperties.getNodes().get(i);
HttpHost httpHost = new HttpHost(node.getHost(), node.getPort(), node.getScheme());
httpHosts[i] = httpHost;
}

//
RestClient restClient = RestClient.builder(httpHosts).setHttpClientConfigCallback(httpClientBuilder -> {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
// 这里是设置服务端账户,密码,没有可以不用
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(esProperties.getUsername(), esProperties.getPasswd()));
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
return httpClientBuilder;
}).build();

ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());

// And create the API client
ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);

return elasticsearchClient;
}

查询api

// 构建boolquery
BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
// must wildcard 模糊查询
boolQueryBuilder.must(query -> query.wildcard(t -> t.field(“wildcard”).value(“*” + “1111”)));
// terms 多个值匹配
List list ;

boolQueryBuilder.must(query -> query.terms(t -> t.field(“terms”).terms(s -> s.value(
.stream().map(FieldValue::of).collect(Collectors.toList())))));
// term 匹配
boolQueryBuilder.must(query -> query.term(t -> t.field(“term”).value(111)));

// rang 范围 查询
boolQueryBuilder.must(query -> query.range(t -> t.field(“range”).gte(JsonData.of(“格式化的日期”.replaceFirst(" “, “T”)))));
// nested 嵌套查询
boolQueryBuilder.must(
query -> query.nested(nestedQuery -> nestedQuery.query(wildcardQuery -> wildcardQuery.range(t -> t.field(“nested.wildcardQuery”).gte(JsonData.of(“格式化的日期”.replaceFirst(” ", “T”))))).scoreMode(ChildScoreMode.None).path(“nested”))
);

SearchRequest searchRequest = SearchRequest.of(s -> s
// 要查询的索引名
.index(vo.getIndex())
// 查询 条件
.query(q -> q
.bool(boolQueryBuilder.build())
// 分页
).from((vo.getPageNum() - 1) * vo.getPageSize())
.size(vo.getPageSize())
// 排序字段
.sort(sorts.stream().map(sort -> SortOptions.of(a -> a.field(f -> f.field(sort.getSortColumn()).order(sort.getSortType())))).collect(Collectors.toList()))
// 查询结果包含哪些字段
.source(source -> source.filter(f -> f.includes(Arrays.stream(vo.getInclude()).toList()).excludes(“”)))
);
// 这里可以打印es查询 Query DSL ,可以复制到es 控制台验证查询结果
log.info(“ES搜索引擎分页请求参数={}”, searchRequest.toString());
// 获取查询结果 返回结果是一个map ,id是key
SearchResponse elasticsearchClient.search(searchRequest, Map.class)

List id = searchResponse.hits().hits().stream().map(e -> e.source().get(“id”)).collect(Collectors.toList());

当然你也可以参考官网的方式 一个Query 一个Query 的must,个人觉得不是很方便

tring searchText = “bike”;
double maxPrice = 200.0;

// Search by product name
Query byName = MatchQuery.of(m -> m
.field(“name”)
.query(searchText)
)._toQuery();

// Search by max price
Query byMaxPrice = RangeQuery.of(r -> r
.field(“price”)
.gte(JsonData.of(maxPrice))
)._toQuery();

// Combine name and price queries to search the product index
SearchResponse response = esClient.search(s -> s
.index(“products”)
.query(q -> q
.bool(b -> b
.must(byName)
.must(byMaxPrice)
)
),
Product.class
);

// 获取查询结果
List<Hit> hits = response.hits().hits();
for (Hit hit: hits) {
Product product = hit.source();
logger.info("Found product " + product.getSku() + ", score " + hit.score());
}

聚合统计

// Aggregation 统计 terms 字段每个值和对应值的数量,也可以统计avg 、interval、等
Aggregation aggregation = AggregationBuilders.terms(terms -> terms.field(“terms”));

SearchRequest searchRequest = SearchRequest.of(s -> s.index(“索引name”))
// 查询条件
.query(q -> q.bool(vo.getBoolQuery()))
// 聚合条件 这里 aggregation 也可以通过lambda 自定义 a -> a.histogram(h -> h.field(“price”).interval(50.0))
.aggregations(“aggregations”,aggregation));

SearchResponse searchResponse = elasticsearchClient.search(searchRequest, Map.class);
// 获取统计结果
Aggregate terms = (Aggregate) searchResponse.aggregations().get(“aggregations”);
searchTypeList.lterms().buckets().array().forEach(e -> {
long quantity = e.docCount();
String key= e.key();
});

注解方式

上面的方式很繁琐,每增加一个条件都需要我们手动设置条件查询语句,我们可以通过在字段上加上自定义注解的方式 去生成对用的查询条件

主要逻辑如下: 源码放在github ,大家自取 https://github.com/Rfruelu/es-search-api-generator

/**
* 查询模式

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-5K93tVk9-1712516180645)]

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值