(JAVA, Elasticsearch) Как я могу получить поля из SearchResponse? - PullRequest
0 голосов
/ 20 ноября 2018

Мне просто интересно, как я получаю поля из SearchResponse, который является результатом моего запроса.

Ниже мой запрос:

{"size":99,"timeout":"10s","query":{"bool":{"filter":[{"bool":{"must":[{"range":{"LOG_GEN_TIME":{"from":"2018-11-01 12:00:01+09:00","to":"2018-11-01 23:59:59+09:00","include_lower":true,"include_upper":true,"boost":1.0}}},{"wrapper":{"query":"eyAiYm9vbCIgOiB7ICJtdXN0IiA6IFsgeyAidGVybSIgOiB7ICJBU1NFVF9JUCIgOiAiMTAuMTExLjI1Mi4xNiIgfSB9LCB7ICJ0ZXJtIiA6IHsgIkFDVElPTl9UWVBFX0NEIiA6ICIyIiB9IH0sIHsgInRlcm0iIDogeyAiRFNUX1BPUlQiIDogIjgwIiB9IH0gXSB9IH0="}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"_source":{"includes":["LOG_GEN_TIME","LOG_NO","ASSET_NO"],"excludes":[]},"sort":[{"LOG_GEN_TIME":{"order":"desc"}},{"LOG_NO":{"order":"desc"}}]}

и когда я запрашиваю это, как показано ниже:

SearchResponse searchResponse = request.get();

Я получил правильный результат:

{  

   "took":1071,
   "timed_out":false,
   "_shards":{  
      "total":14,
      "successful":14,
      "skipped":0,
      "failed":0
   },
   "_clusters":{  
      "total":0,
      "successful":0,
      "skipped":0
   },
   "hits":{  
      "total":2,
      "max_score":null,
      "hits":[  
         {  
            "_index":"log_20181101",
            "_type":"SEC",
            "_id":"1197132746951492963",
            "_score":null,
            "_source":{  
               "ASSET_NO":1,
               "LOG_NO":1197132746951492963,
               "LOG_GEN_TIME":"2018-11-01 09:46:28+09:00"
            },
            "sort":[  
               1541033188000,
               1197132746951492963
            ]
         },
         {  
            "_index":"log_20181101",
            "_type":"SEC",
            "_id":"1197132746951492963",
            "_score":null,
            "_source":{  
               "ASSET_NO":2,
               "LOG_NO":1197337264704454700,
               "LOG_GEN_TIME":"2018-11-01 23:00:06+09:00"
            },
            "sort":[  
               1541080806000,
               1197337264704454700
            ]
         }
      ]
   }
}

Чтобы использовать этот результат, мне нужно сопоставить его по полю и значению.

enter image description here

Я думаю, что есть способ сопоставить поле и значение с параметром 'fields', чтобы мы могли использовать его красиво, но я не могу найти.

Я надеюсь, что смогу использовать результатвот так:

SearchHit hit = ...
Map<String, SearchHitField> fields = hit.getFields();
String logNo = fields.get("LOG_NO").value();

И кажется, что это обычный способ использования ..

Или я что-то неправильно понимаю?Скажите мне другой способ, если есть лучший способ, пожалуйста.

Любой комментарий будет оценен.Спасибо.

1 Ответ

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

Мне не понятно, какого клиента вы используете для упругого запроса.Если вы используете высокоуровневый оставшийся клиент эластичного поиска, вы можете циклически проходить по хитам, а для получения источника вы можете использовать hit.getSourceAsMap (), чтобы получить значение ключа для полей.

Для вашего комментария:

  • Сначала создайте класс POJO, который соответствует _source (то есть свойствам индекса; способ хранения данных в упругом)
  • Использование hit.getSourceAsString () для получения _source в формате json.
  • Используйте Джексона ObjectMapper для сопоставления json с вашим pojo

Предполагая, что вы создали класс POJO AssetLog

SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit searchHit : searchHits) {
      String hitJson = searchHit.getSourceAsString();
      ObjectMapper objectMapper = new ObjectMapper();
      AssetLog source = objectMapper.readValue(hitJson, AssetLog.class);
      //Store source to map/array
}

Надеюсь, что этопомогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...