Инициализируйте объект Elasticsearch SearchResponse перед выполнением запроса - PullRequest
0 голосов
/ 11 апреля 2020

Я использую различные Elasti c Поисковые запросы из моего 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-клиент высокого уровня Elasti c для JAVA не позволяет инициализировать объект SearchResponse, подобный этому. Это также невозможно сделать с помощью

SearchResponse searchResponse = new SearchResponse ();

И если мы сделаем ... * 1010, будет ошибка нулевого указателя *

SearchResponse searchResponse = new SearchResponse (null);

Как я могу переписать этот код, чтобы я мог извлекать totalHits, elapsed и facetsData вне условных циклов?

...