elasticsearch 使用scroll_id查询,为什么每次查询结果相同

来源:互联网 发布:h5房卡麻将源码 编辑:程序博客网 时间:2024/06/06 01:27

使用elasticsearch 2.4 版本,想分页遍历所有的文档,因为 from + size 有范围限制,且效率低下,因此采用 scroll,代码如下,结果每次打印出来的数据一模一样,但是scroll_id 的值是最新的

public static void main(String[] args) {

        try {

            String url = "http://ip:port/index/type/_search";
            String oldEsResult = sendGet(url, "scroll=20s&search_type=scan&size=10");
            ObjectMapper mapper1 = new ObjectMapper();
            String scroll_id;
            int totalCount = NumberUtils.toInt(mapper1.readTree(oldEsResult).findValue("hits").findValue("total").toString());
            scroll_id = mapper1.readTree(oldEsResult).findValue("_scroll_id").toString();
            System.out.println("totalCount is-------" + totalCount);
            int size = 100;
            int numbers = totalCount / size; //页数
            String params = "scroll=20s&scroll_id=";
            for(int i = 0; i < numbers; i++){
                String param = params + scroll_id;
                oldEsResult = sendGet(url, param);
                if(StringUtils.isBlank(oldEsResult)){
                    continue;
                }
                ObjectMapper mapper2 = new ObjectMapper();
                scroll_id = mapper2.readTree(oldEsResult).findValue("_scroll_id").toString();
                JsonNode node = mapper2.readTree(oldEsResult).findValue("hits").findValue("hits");
                for (int j = 0; j < node.size(); j++) {
                    System.out.println(node.get(j).get("_source"));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }

原创粉丝点击