elasticsearch-java api 8 升级_elasticsearch java api8 elasticsearch8

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

/**
* 查询模式
*/
public enum EsQueryMode {
TERM,
TERMS,
WILDCARD,
RANGE,
}

/**
* 通用转换
*
* @author LuTshoes
* @version 1.0
*/
public class GeneralConvertHandler implements IConvertHandler {

/**
* 将注解和对象转换为BoolQuery
*
* @param annotation 注解
* @param o 对象
* @return 转换后的BoolQuery
*/
@Override
public BoolQuery convert(Annotation annotation, Object o) {
// 判断注解是否为GeneralConvert类型并且对象不为空
if (annotation instanceof GeneralConvert && Objects.nonNull(o)) {
// 获取注解的key值
String key = ((GeneralConvert) annotation).key();
// 获取注解的查询模式
EsQueryMode mode = ((GeneralConvert) annotation).mode();

// 使用switch语句根据查询模式执行不同的逻辑
switch (mode) {

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

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

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值