今天在写代码的时候发现的一个小问题
因为最近在学习使用elasticsearch整合springboot,所以会碰到很多小问题,今天就碰到了这么个小问题。
我一开始是想写一个方法从elasticsearch中查询数据出来,我的设想是先判断elasticsearch中有没有该索引,如果有的话就直接查询,没有的话就从数据库中查询出来放到elasticsearch中在对elasticsearch进行查询。
代码如下
//从elasticsearch中获取数据
public R findbyES() throws IOException {
//创建一个判断是否存在的请求
GetIndexRequest request = new GetIndexRequest("titems");
//判断索引是否存在
if(restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT)){
SearchRequest request1 = new SearchRequest("titems");
//构建搜索条件
SearchSourceBuilder builder = new SearchSourceBuilder();
//查询全部方法
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
builder.query(matchAllQueryBuilder);
builder.from(0);
builder.size(3);
builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
request1.source(builder);
SearchResponse search = restHighLevelClient.search(request1, RequestOptions.DEFAULT);
List<Map<String, Object>> list = new ArrayList<>();
for(SearchHit documentFields : search.getHits().getHits()){
list.add(documentFields.getSourceAsMap());
}
return R.ok(list);
}else{
List<titem> list = titemDao.findAll();
//创建索引
CreateIndexRequest request1 = new CreateIndexRequest("titems");
//客户端执行请求
restHighLevelClient.indices().create(request1, RequestOptions.DEFAULT);
//批量添加数据
BulkRequest request2 = new BulkRequest();
for(int i = 0; i<list.size(); i++){
request2.add(new IndexRequest("titems").id(""+(i+1)).source(JSON.toJSONString(list.get(i)), XContentType.JSON));
}
restHighLevelClient.bulk(request2,RequestOptions.DEFAULT);
SearchRequest request3 = new SearchRequest("titems");
//构建搜索条件
SearchSourceBuilder builder = new SearchSourceBuilder();
//查询全部方法
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
builder.query(matchAllQueryBuilder);
builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
request3.source(builder);
SearchResponse search = restHighLevelClient.search(request3, RequestOptions.DEFAULT);
List<Map<String, Object>> list1 = new ArrayList<>();
for(SearchHit documentFields : search.getHits().getHits()){
list1.add(documentFields.getSourceAsMap());
}
return R.ok(list1);
}
}
但是执行时我发现如果有索引的话可以正常查询,但是没有索引的话去查询的话第一次查询会是空数据,再次查询时才会正常显示数据出来,就是这么个小问题让我一直以为我的代码写错了。
仔细了解后才发现问题所在
添加完成数据后需要对elasticsearch刷新索引,否则的话查询不出来所以添加操作完成后应该加一条更新语句
//刷新elasticsearch
request2.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
以上是用来记录我自己平常碰到的一些小问题,有什么不对的地方欢迎指正。如果能够帮助到你的话就更好了。