网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println("======" + response.status());// 获取建立索引的状态信息 CREATED
System.out.println("[[[[[[[[[" + response);// 查看返回内容
} catch (Exception e) {
String msg = e.getMessage();
if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
throw e;
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new CommonResult().success();
}
创建文档的时候 需要在return之前让线程休眠至少一秒,删除也一样,因为ES有一个机制是你创建或删除文档的时候,他不会立即刷新,而是把数据放到一个类似于暂存区的地方1秒,如果不执行现成休眠的话,前端操作完创建/删除的时候,调用查询接口会查询不到你刚新增的数据,或是删除的数据还在存在列表,这是个坑,一定要注意!!!
修改文档
public CommonResult UpdateDocument(@RequestBody DocumentsVO documentsVO) throws IOException {
UpdateRequest request = new UpdateRequest(documentsVO.getIndex(), documentsVO.getId());
DocumentVO documentVO = new DocumentVO();
BeanUtil.copyProperties(documentsVO, documentVO);
request.doc(JSON.toJSONString(documentVO), XContentType.JSON);
try {
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(response.status()); // OK
restHighLevelClient.close();
} catch (Exception e) {
String msg = e.getMessage();
if (!msg.contains(“201 Created”) && !msg.contains(“200 OK”)) {
throw e;
}
}
return new CommonResult().success();
}
查询某条文档信息的获取
public CommonResult GetDocument(String index, String id) throws IOException {
GetRequest request = new GetRequest(index, id);
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());// 打印文档内容
System.out.println(request);// 返回的全部内容和命令是一样的
return new CommonResult().success(response.getSourceAsString());
}
文档的获取,并判断其是否存在
public CommonResult DocumentIsExists(String index, String id) throws IOException {
GetRequest request = new GetRequest(index, id);
// 不获取返回的 _source的上下文了
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields(“none”);
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
return exists ? new CommonResult().success(exists) : new CommonResult().failed("文档不存在!");
}
删除文档
public CommonResult DeleteDocument(@RequestParam String index, @RequestParam String id) throws IOException {
System.out.println(“》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》执行删除文档”+ DateTime.now());
DeleteRequest request = new DeleteRequest(index, id);
request.timeout(“1s”);
try {
restHighLevelClient.delete(request, RequestOptions.DEFAULT);
} catch (Exception e) {
String msg = e.getMessage();
if (!msg.contains("201 Created") && !msg.contains("200 OK")) {
throw e;
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new CommonResult().success();
}
根据索引查询所有文档
public CommonResult SearchsDocument(@RequestParam(value = “fileName”, required = false) String fileName,
@RequestParam(value = “index”, required = false) String index,
@RequestParam(“pageNo”) int pageNo,
@RequestParam(“pageSize”) int pageSize) throws IOException {
System.out.println(“》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》执行查询所有文档”+ DateTime.now());
System.out.println(“》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》索引名称”+ index);
// 创建查询请求对象
SearchRequest searchRequest = new SearchRequest(index);
// 构建搜索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = null;
if (StrUtil.isNotBlank(fileName)){
boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery(“name”,fileName));
}
//设置高亮
searchSourceBuilder.highlighter(new HighlightBuilder());
//设置分页
searchSourceBuilder.from(pageNo);
searchSourceBuilder.size(pageSize);
// 设置排序条件
searchSourceBuilder.sort(“time.keyword”, SortOrder.DESC);
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
//获取总条数
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(hits));
// 设置总条数
jsonObject.put(“total”, hits.getTotalHits().value);
if (hits.getHits().length != 0 && StrUtil.isNotBlank(hits.getHits()[0].getIndex())){
// 给每条数据都设置索引
jsonObject.getJSONArray(“hits”).getJSONObject(0).getJSONObject(“sourceAsMap”).put(“index”, hits.getHits()[0].getIndex());
}
return new CommonResult().success(jsonObject);
}
搭建的ES库不仅可以用来存储用户使用的数据,我们项目中还配置了,jar包每次启动后都会把日志文件给存储到ES库中这就间接的导致了几个问题:
1.日志索引查询报错
解决方案:
@GetMapping(“/searchsDocument”)
@ApiOperation(“根据索引查询所有文档”)
public Result SearchsDocument(@RequestParam(value = “fileName”, required = false) String fileName,
@RequestParam(value = “index”, required = false) String index,
@RequestParam(“pageNo”) int pageNo,
@RequestParam(“pageSize”) int pageSize) throws IOException {
System.out.println(“》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》执行查询所有文档”+ DateTime.now());
PageHelper.startPage(pageNo, pageSize);
// 创建查询请求对象
SearchRequest searchRequest = new SearchRequest(index);
// 构建搜索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = null;
if (StrUtil.isNotBlank(fileName)){
boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery(“name”,fileName));
}
//设置高亮
searchSourceBuilder.highlighter(new HighlightBuilder());
//设置分页
searchSourceBuilder.from(pageNo);
searchSourceBuilder.size(pageSize);
// 设置排序条件
// searchSourceBuilder.sort(“time.keyword”, SortOrder.DESC);
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
List<DocumentPageVO> list = new ArrayList<>();
if(ObjectUtils.isEmpty(search.getHits().getHits())){
return Result.success(new PageInfo<>());
}
// 循环从ES中获取的数据,使用if判断判断数据结构是否一致,如不一致,则不进行返回
for (SearchHit hit : search.getHits().getHits()) {
// 数据组装
DocumentPageVO documentVO = new DocumentPageVO();
documentVO.setIndex(hit.getIndex());
documentVO.setId(hit.getId());
if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("name"))){
documentVO.setName(hit.getSourceAsMap().get("name").toString());
}
if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("size"))){
documentVO.setSize(hit.getSourceAsMap().get("size").toString());
}
if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("content"))){
documentVO.setContent(hit.getSourceAsMap().get("content").toString());
}
if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("time"))){
documentVO.setTime(hit.getSourceAsMap().get("time").toString());
}
if (ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("name")) && ObjectUtils.isNotEmpty(hit.getSourceAsMap().get("size"))){
list.add(documentVO);
}
}
// Collections.sort(list, Comparator.comparing(DocumentPageVO::getTime).reversed());
SearchHits hits = search.getHits();
//获取总条数
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(hits));
// 设置总条数
jsonObject.put(“total”, hits.getTotalHits().value);
if (hits.getHits().length != 0 && StrUtil.isNotBlank(hits.getHits()[0].getIndex())){
// 给每条数据都设置索引
jsonObject.getJSONArray(“hits”).getJSONObject(0).getJSONObject(“sourceAsMap”).put(“index”, hits.getHits()[0].getIndex());
}
return Result.success(new PageInfo<>(list));
}
因为在ES中执行新增数据操作时,是自定义的字段,如下
public class DocumentVO {
@ApiModelProperty("文档名称")
private String name;
@ApiModelProperty("文档大小")
private String size;
@ApiModelProperty("文档时间")
private String time;
@ApiModelProperty("文档内容")
private String content;
}
但是插入日志时,使用的字段和该实体类对象不一致,导致取值的时候有取不到的情况
2.新建索引不会自动分片,导致索引状态为红色,简介导致集群状态也为红色
通过发送请求的方式开启自动平衡分配原则
请求内容如下
curl -XPUT ‘localhost:9200/_cluster/settings’ -d
// 携带的body参数
‘{ “transient”:
{ “cluster.routing.allocation.enable” : “all”
}
}’
解决方案摘自[Elasticsearch 之 分片无法分配问题\_elasticsearch isn't allowed to allocate this shard-CSDN博客]( )
![img](https://img-blog.csdnimg.cn/img_convert/795e3c15b914df1cfb4892a1019e3608.png)
![img](https://img-blog.csdnimg.cn/img_convert/f4620b80e7b22c285bb1a10f026c56b1.png)
![img](https://img-blog.csdnimg.cn/img_convert/949bfbedb873db15992602aba3a19b58.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
中...(img-3VZ0xN6x-1715322998833)]
[外链图片转存中...(img-wQ1ByLBH-1715322998833)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**