Bootstrap

关于添加数据到elasticsearch中后无法立刻查询出来的问题

今天在写代码的时候发现的一个小问题

因为最近在学习使用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);

以上是用来记录我自己平常碰到的一些小问题,有什么不对的地方欢迎指正。如果能够帮助到你的话就更好了。

;