Elasticsearch-06-Elasticsearch Java API Client-Elasticsearch 8

使用外部JSON数据创建

这里要注意我们需要使用StringReader进行读取时使用replace函数将设置的’改为",当然这在真实的业务中肯定不会有,因为真实业务中一定是标准的JSON数据,无需使用replace进行替换了

//创建文档
final StringReader input = new StringReader(
“{‘name’:‘农夫三拳’,‘price’:3.00,‘des’:‘农夫三拳有点甜’}”.replace(‘’', ‘"’)
);
final IndexResponse response = client.index(builder -> builder.index(“produces”).id(“44514”).withJson(input));
System.err.println(response.version());

9: 查询所有文档

final SearchResponse response = client.search(builder -> builder.index(“produces”), Object.class);
final List<Hit> hits = response.hits().hits();
hits.forEach(
x-> System.err.println(x)
);

10:根据ID查询文档

使用HashMap对应查询

//查询文档
final GetResponse response = client.get(builder -> builder.index(“produces”).id(“116677”), Map.class);
final Map source = response.source();
source.forEach((x,y)->{
System.err.println(x+“:”+y);
});

使用自定义类对应查询

final GetResponse response1 = client.get(builder -> builder.index(“produces”).id(“aabbcc123”), Produce.class);
final Produce source1 = response1.source();
System.err.println(source1.toString());

11:删除文档

final GetResponse response1 = client.get(builder -> builder.index(“produces”).id(“aabbcc123”), Produce.class);
final Produce source1 = response1.source();
System.err.println(source1.toString());

12:修改文档

全覆盖

//修改文档(覆盖)
final Produce produce = new Produce(“ccaabb123”, “旺仔摇滚洞”, “旺仔摇滚洞乱摇乱滚”, 10.23D);
final UpdateResponse response = client.update(builder -> builder.index(“produces”).id(“aabbcc123”).doc(produce), Produce.class);
System.err.println(response.shards().successful());

修改部分文档

区别在于我们需要设置.docAsUpsert(true)表明是修改部分而不是覆盖

//修改文档(部分修改)
// final Produce produce = new Produce(“ccaabb123”, “旺仔摇滚洞”, “旺仔摇滚洞乱摇乱滚”, 10.23D);
final Produce produce = new Produce();
produce.setName(“旺仔摇不动”);
final UpdateResponse response = client.update(builder -> builder.index(“produces”).id(“aabbcc123”).doc(produce).docAsUpsert(true), Produce.class);
System.err.println(response.shards().successful());

13:批量操作

批量新增

produceList.add(produce1);
produceList.add(produce2);
produceList.add(produce3);
//构建BulkRequest
final BulkRequest.Builder br = new BulkRequest.Builder();
for (Produce produce : produceList) {
br.operations(op->op.index(idx->idx.index(“produces”).id(produce.getSku()).document(produce)));
}
final BulkResponse response = client.bulk(br.build());

批量删除

List bulkOperations = new ArrayList<>();
// 向集合中添加需要删除的文档id信息
for (int i = 0; i < dto.getIds().size(); i++) {
int finalI = i;
bulkOperations.add(BulkOperation.of(b -> b
.delete((d -> d
.index(dto.getIndex())
.id(dto.getIds().get(finalI))
))
));
}
// 调用客户端的bulk方法,并获取批量操作响应结果
BulkResponse response = client
.bulk(e -> e
.index(dto.getIndex())
.operations(bulkOperations));

批量更新

JSONObject jsonObject = new JSONObject();
jsonObject.put(“id”, deleteIds);
jsonObject.put(“status”, 1);

BulkRequest.Builder br = new BulkRequest.Builder();
for (String deleteId : deleteIds) {
br.operations(op -> op
.update(idx ->
idx.index(EsIndexConstants.opinion_information)
.id(deleteId)
.action(a -> a
.doc(jsonObject)//局部修改
.docAsUpsert(true)//局部修改
)
)).refresh(Refresh.True);
}

BulkRequest bulkRequest = br.build();
BulkResponse result = null;
try {
result = elasticsearchClient.bulk(bulkRequest);
} catch (IOException e) {
throw new RuntimeException(e);
}

DSL查询

1:matchAll查询所有文档

//matchAll
final SearchResponse response = client.search(builder ->
builder.index(“produces”)
.query(q ->
q.matchAll(
v->v
)), Produce.class);

System.err.println(response.hits().hits());

2:match 根据字段查询

//简单query方式查询
final SearchResponse response = client.search(builder ->
builder.index(“produces”)
.query(q ->
q.match(t ->
t.field(“name”)
.query(“龙虎万精油”))), Produce.class);
System.err.println(response.hits().hits());

3:多id查询

//多ID查询
final SearchResponse response = client.search(builder ->
builder.index(“produces”)
.query(q ->
q.ids(sid->sid.values(“1000”,“1001”))), Produce.class);
System.err.println(response.hits().hits());

4:term 不分词查询

//term不分词条件查询
final SearchResponse response = client.search(builder -> builder.index(“produces”)
.query(q -> q.term(t -> t.field(“name”).value(“风油精”))), Produce.class);
System.err.println(response.hits().hits());

5:范围查询

//范围查询
final SearchResponse response = client.search(builder ->
builder.index(“produces”).query(q ->
q.range(r ->
r.field(“price”).gt(JsonData.of(5D)).lt(JsonData.of(15D)))),
Produce.class);
System.err.println(response.hits().hits());

6: 前缀查询

final SearchResponse response = client.search(builder ->
builder.index(“produces”).query(q ->q.prefix(p->p.field(“name”).value(“六”))),
Produce.class);
System.err.println(response.hits().hits());

7:匹配查询

//匹配查询

final SearchResponse response = client.search(builder ->
builder.index(“produces”).query(q ->q.wildcard(w->w.field(“name”).value(“风*”))),
Produce.class);
System.err.println(response.hits().hits());

?单字符匹配

//匹配查询
final SearchResponse response = client.search(builder ->
builder.index(“produces”).query(q ->q.wildcard(w->w.field(“name”).value(“风?精”))),
Produce.class);
System.err.println(response.hits().hits());

8:模糊查询

//模糊查询
final SearchResponse response = client.search(builder ->
builder.index(“produces”).query(q ->q.fuzzy(f->f.field(“name”).value(“六仙花露水”))),
Produce.class);
System.err.println(response.hits().hits());

9:多条件查询

使用bool关键字配合must,should,must_not

  • must:所有条件必须同时成立
  • must_not:所有条件必须同时不成立
  • should:所有条件中成立一个即可

//多条件
final SearchResponse response = client.search(builder ->
builder.index(“produces”).query(q ->
q.bool(b ->
b.must(t ->
t.term(v ->
v.field(“name”)
.value(“旺仔摇不动”)))
.must(t2 ->
t2.term(v2 ->
v2.field(“price”)
.value(0.0D))))),
Produce.class);
System.err.println(response.hits().hits());

或者创建BoolQuery.Builder,以便进行业务判断是否增加查询条件

List fieldValues = new ArrayList<>();
fieldValues.add(FieldValue.of(10));
fieldValues.add(FieldValue.of(100));
BoolQuery.Builder boolQuery = new BoolQuery.Builder();

boolQuery.must(t->
t.terms(v->
v.field(“label”)
.terms(term->
term.value(fieldValues))));
boolQuery.must(t->
t.match(f->
f.field(“name”)
.query(“旺仔”)));

SearchResponse search = elasticsearchClient.search(builder -> builder.index(“my_test_index”)
.query(q->
q.bool(boolQuery.build())),Object.class);

10:多字段查询-multiMatch

//多字段查询
final SearchResponse response = client.search(builder ->
builder.index(“produces”).query(q->q.multiMatch(qs->qs.query(“蚊虫叮咬 辣眼睛”).fields(“name”,“des”))),
Produce.class);
System.err.println(response.hits().hits());

11:高亮显示

我们注意要设置前缀和后缀

//高亮显示
final SearchResponse response = client.search(builder ->
builder.index(“produces”)
.query(q -> q.match(v -> v.field(“name”).query(“风油精”)))
.highlight(h -> h.preTags(“”).postTags(“”).fields(“name”, hf -> hf)),
Produce.class);
System.err.println(response.toString());

12:分页查询

我们使用match_all进行全部搜索的时候使用size关键字设置每一页的大小,使用from关键字设置页码
from的计算公式:(页码-1)*size

//分页查询
final SearchResponse response = client.search(builder ->
builder.index(“produces”)
.query(q->q.matchAll(v->v)).size(2).from(0),
Produce.class);
System.err.println(response.hits().hits());

12-1:使用分页时,最多返回10000条。需要进行设置

//分页查询
final SearchResponse response = client.search(builder ->
builder.index(“produces”)
.query(q->q.matchAll(v->v))
.size(2)
.from(0)
.trackTotalHits(t->t.enabled(true)),
Produce.class);
System.err.println(response.hits().hits());

13:排序

使用sort关键字指定需要进行排序的字段设置排序类型即可,我们这里会使用到SortOrder枚举类来进行指定排序方式

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

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

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

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

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

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

帮助到想自学提升又不知道该从何学起的朋友。**
[外链图片转存中…(img-9WgIAfJT-1712516148688)]
[外链图片转存中…(img-GzvgI5lK-1712516148689)]
[外链图片转存中…(img-eZrjtusH-1712516148689)]
[外链图片转存中…(img-WxQYSH5J-1712516148689)]
[外链图片转存中…(img-iyKq8ciE-1712516148690)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值