Elasticsearch Java multiisearch JSON

时间:2018-05-02 18:33:47

标签: elasticsearch resttemplate

我正在尝试向elasticsearch API发帖。

我需要做一个多元素,因为我需要查询许多索引。

我正在使用Java8 + resttemplate来完成它。

请参阅以下代码:

      StringBuilder sb = new StringBuilder();
        sb.append("{\"index\" : \"indexname\", \"type\": \"typename\"}");
        sb.append("{\"query\" : {\"match_all\" : {}}, \"from\" : 0, \"size\" : 10}");
        sb.append("{\"index\" : \"indexname\", \"type\": \"typename\"}");
        sb.append("{\"query\" : {\"match_all\" : {}}}\n");

        String query = sb.toString();

        String fullURL = "http://esHost/_msearch";

        log.debug("URL to search: {}.", fullURL);
        log.info(">>>>" + query);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/x-ndjson");

        HttpEntity<String> request = new HttpEntity<>(query, headers);

        Map map = restTemplate.postForObject(fullURL, request, Map.class);
...

当我使用CURLS对同一主机执行相同的查询时,没关系,但使用Java我不能。 请参阅错误:

{"error":{"root_cause":[{"type":"action_request_validation_exception","reason":"Validation Failed: 1: no requests added;"}],"type":"action_request_validation_exception","reason":"Validation Failed: 1: no requests added;"},"status":400}

我读到JSON需要\ n,\ r \ n,我尝试过任何可能但不起作用。

如何构建我的“查询值”以发送_msearch API?

2 个答案:

答案 0 :(得分:0)

我使用以下代码解决了我的问题:

private static final String NEW_LINE = System.getProperty("line.separator");

        sb.append("{\"index\" : \"indexname\", \"type\": \"typename\"}").append(NEW_LINE)
        sb.append("{\"query\" : {\"match_all\" : {}}, \"from\" : 0, \"size\" : 10}").append(NEW_LINE)
        sb.append("{\"index\" : \"indexname\", \"type\": \"typename\"}").append(NEW_LINE)
        sb.append("{\"query\" : {\"match_all\" : {}}}\n").append(NEW_LINE);

在这种情况下,可以在任何操作系统中使用。

答案 1 :(得分:0)

这在Windows系统上将是一个问题,因为NDJSON格式显式地使用'\ n'字符作为分隔符。在Windows上,您将寻找{'\ r','\ n'},除非您可能会写出来,否则找不到。