Обработка нескольких документов из Elastic Search с использованием Java RestClient API - PullRequest
0 голосов
/ 26 июня 2018

Я извлекаю документы из упругого поиска, используя Java API. Я могу правильно загрузить только один документ из responseBody.

Как мне справиться, если я получу несколько документов в качестве ответа.

Ранее я использовал RestHighLevelClient с этим API, я мог обрабатывать несколько документов с помощью SearchHit[] searchHits = searchResponse.getHits().getHits();.

С RestClient API я не могу этого сделать.,

Пожалуйста, найдите мой код ниже, который может извлечь документ из упругого поиска и проанализировать его как объект JSON. (работает правильно для одного документа)

private final static String ATTACHMENT = "document_attachment";
    private final static String TYPE = "doc";
    static long BUFFER_SIZE = 520 * 1024 * 1024;   //  <---- set buffer to 520MB instead of 100MB


    public static void main(String args[])
    {
        RestClient restClient = null;
        Response contentSearchResponse=null;
        String responseBody = null;
        JSONObject source = null;
        String path = null;
        String filename = null;
        int id = 0;
        ResponseHits responseHits = null;

        RestClientBuilder builder =  null; 

        try {

        restClient = RestClient.builder(
                        new HttpHost("localhost", 9200, "http"),
                        new HttpHost("localhost", 9201, "http")).build();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        SearchRequest contentSearchRequest = new SearchRequest(ATTACHMENT); 
        SearchSourceBuilder contentSearchSourceBuilder = new SearchSourceBuilder();
        contentSearchRequest.types(TYPE);
        QueryBuilder attachmentQB = QueryBuilders.matchQuery("attachment.content", "activa");
        contentSearchSourceBuilder.query(attachmentQB);
        contentSearchSourceBuilder.size(50);
        contentSearchRequest.source(contentSearchSourceBuilder);
        System.out.println("Request --->"+contentSearchRequest.toString());

        Map<String, String> params = Collections.emptyMap();
        HttpEntity entity = new NStringEntity(contentSearchSourceBuilder.toString(), ContentType.APPLICATION_JSON);
        HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory consumerFactory =
                new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory((int) BUFFER_SIZE);


        try {
            contentSearchResponse = restClient.performRequest("GET", "/document_attachment/doc/_search", params, entity, consumerFactory);
        } catch (IOException e1) {
            e1.printStackTrace();
        } 
        try {
            responseBody = EntityUtils.toString(contentSearchResponse.getEntity());
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Converting to JSON");
        JSONObject jsonObject = new JSONObject(responseBody);
        JSONObject  hits = jsonObject.getJSONObject("hits");
        JSONArray hitsArray=hits.getJSONArray("hits");
        for(int i=0;i<hitsArray.length();i++) {
            JSONObject obj= hitsArray.getJSONObject(i);
            source = obj.getJSONObject("_source");
            id = Integer.parseInt(source.opt("id").toString());
            path = source.optString("path");
            filename = source.optString("filename");

        }

        JSONObject jsonBody = new JSONObject();
        jsonBody.put("id", id);
        jsonBody.put("path", path);
        jsonBody.put("filename", filename);
        System.out.println("Response --->"+jsonBody.toString());

        }

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Используйте scroll api. что будет полезно, когда набор результатов большой.

Из документа

Хотя поисковый запрос возвращает одну «страницу» результатов, API прокрутки можно использовать для извлечения большого количества результатов (или даже всех результатов) из одного поискового запроса, почти так же, как вы используете курсор на традиционной базе данных.

Похожие ссылки

Эластичное поведение прокрутки поиска

Документация

Параллельное сканирование и прокрутка индекса Elasticsearch

0 голосов
/ 26 июня 2018

Если вы используете

RestClientBuilder builder = RestClient.builder(
            new HttpHost("localhost", 
            9200, 
            "http"));
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);

Вы можете получить несколько результатов, например:

SearchResponse search1 = restHighLevelClient.search(searchRequest);
for (SearchHit hit : searchResponse.getHits()) {
        try {
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            JSONObject jo = new JSONObject(hit.getSourceAsMap());
         } catch (JSONException) {
            //TODO do some useful here
            //e.printStackTrace();
         }
}

Таким образом, вы можете перебрать несколько запросов вашего запроса. И не делайте Elasticserach связывает вывод в вашем наборе результатов.

...