我正在尝试向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?
答案 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'},除非您可能会写出来,否则找不到。