Elasticsearch Java многопользовательский JSON - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь сделать сообщение в 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, я пробовал любые возможности, но не работает.

Как мне построить «значение запроса» для отправки для _msearch API?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Это будет проблемой в системах Windows, потому что формат NDJSON явно использует символ «\ n» для разделителя. В Windows вы будете искать {'\ r', '\ n'}, которые не будут найдены, если вы, скорее всего, не написали это.

0 голосов
/ 21 мая 2018

Я решил свою проблему, используя следующий код:

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);

В этом случае будет работать в любой ОС.

...