Инициализировать объект Elasticsearch SearchResponse перед выполнением запроса
Я выполняю различные запросы эластичного поиска из своего кода Java. Чтобы консолидировать свой код, я хотел бы инициализировать объект SearchResponse перед своими условными циклами, каждый из которых запускает запрос ElasticSearch с разными настройками. Таким образом, я могу выполнить одну строку кода один раз, чтобы получить общее количество совпадений по запросу. Вы поймете, что я имею в виду, из кода
@GET
@Path("/search")
public SearchResultsAndFacets search() {
SearchResultsAndFacets srf = new SearchResultsAndFacets();
RestHighLevelClient client = createHighLevelRestClient();
// Build the base query that applies to all searches
SearchSourceBuilder querySourceBuilder = buildQueryWrapper(colNames, sro.q, sro.f,
facetsToUpdate, sro.u, sro.lc);
SearchResponse searchresponse; // This line does not work. How can I initialize this object here (outside of the following conditional loops)?
// Searches executed from the table view to populate a table of documents
if (searchType.equals("table")) {
List<SortParameters> sortParametersList = sortAdapter(sro.s);
searchResponse = runTableQuery(client, querySourceBuilder, sortParameters, offset, limit);
}
// Searches involving geo_point data to populate a leaflet map
if (searchType.equals("contacts")) {
RestHighLevelClient client = createHighLevelRestClient();
ElasticSearchMapService esms = new ElasticSearchMapService();
searchResponse = esms.runContactsMapQuery(querySourceBuilder, client, <some geographic coordinate parameters necessary for this search>);
MapSearchResponse mapSearchResponse = esms.getLocationsFromSearchResponse(searchResponse);
srf.mapSearchResponse = mapSearchResponse;
}
// I would like to include these next few lines here at the end of the conditional loops.
// Currently they must be inside each if clause.
srf.totalHits = searchResponse.getHits().getTotalHits().value;
srf.elapsed = searchResponse.getTook().getMillis();
srf.facetsData = getUpdatedFacetData(facetsToUpdate,
searchResponse, sro.f);
return srf;
}
Клиент REST высокого уровня Elastic для JAVA не позволяет инициализировать объект SearchResponse, подобный этому. Это также невозможно сделать с
SearchResponse searchResponse = новый SearchResponse();
И если мы это сделаем, возникнет ошибка нулевого указателя...
SearchResponse searchResponse = новый SearchResponse(null);
Как я могу переписать этот код, чтобы я мог видеть totalHits, elapsed и facetsData вне условных циклов?