关于添加数据到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);

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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
SparkSQL是Apache Spark的一个模块,用于对大规模数据进行高性能处理和查询。Hive是一个数据仓库基础设施工具,提供了类似于SQL的查询语言,可以从数据仓库中提取和分析数据Elasticsearch是一个基于分布式搜索和分析引擎的开源工具,可以进行实时数据搜索、分析和可视化。 要将Hive数据查询结果存入Elasticsearch,首先需要创建一个SparkSession对象,并配置相应的Elasticsearch连接信息。然后,可以使用SparkSQL查询Hive数据,并将结果转换为DataFrame。接下来,需要使用Elasticsearch-Hadoop库将DataFrame中的数据写入Elasticsearch。 具体步骤如下: 1. 创建SparkSession对象: ```scala val spark = SparkSession.builder() .appName("Hive to Elasticsearch") .config("spark.sql.warehouse.dir", "/user/hive/warehouse") .enableHiveSupport() .getOrCreate() ``` 其中,`/user/hive/warehouse`是Hive默认的数据库路径。 2. 查询Hive数据: ```scala val data = spark.sql("SELECT * FROM table_name") // 通过SQL查询Hive数据 ``` 这里的`table_name`是要查询的Hive表名,可以根据需要修改为实际表名。 3. 将查询结果转换为DataFrame: ```scala val df = data.toDF() ``` 可以根据需要对DataFrame进行进一步的处理和转换。 4. 配置Elasticsearch连接信息: ```scala df.write .format("org.elasticsearch.spark.sql") .option("es.nodes", "localhost") .option("es.port", "9200") .option("es.resource", "index_name/document_type") .save() ``` 这里的`localhost`和`9200`分别是Elasticsearch的主机和端口。`index_name`是要写入的Elasticsearch索引名称,`document_type`是要写入的文档类型。 5. 提交作业并等待执行结果: ```scala spark.stop() // 关闭SparkSession对象 ``` 这一步是为了确保作业提交成功并完成。 通过以上步骤,就可以将Hive查询结果存入Elasticsearch中了。需要注意的是,为了能够使用Elasticsearch-Hadoop库,还需要在构建SparkSession对象时添加相应的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值