Как искать по любому слову в любом поле с ElasticSearch rest высокого уровня клиента? - PullRequest
0 голосов
/ 15 мая 2018

Я пытался найти любой контракт, в котором есть какое-то ключевое слово, но мой код неверен:

 public Collection<Map<String, Object>> findContractsByWord(String index, String type, String word) throws CommonUserException {
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.termQuery("", word));
    searchRequest.source(sourceBuilder);
    SearchResponse searchResponse;
    try (RestHighLevelClient client = getClient()) {
        searchResponse = client.search(searchRequest);
    } catch (IOException e) {
        throw new CommonUserException("Exception in elasticsearch", "Exception in elasticsearch");
    }
    SearchHit[] hits = searchResponse.getHits().getHits();
    Collection<Map<String, Object>> contracts = new LinkedList<>();
    for (SearchHit hit : hits) {
        contracts.add(hit.getSourceAsMap());
    }
    return contracts;
}

Может, кто-нибудь знает, как это сделать с отдыхом высокоуровневого клиента? (эластичный 6.2.4)

1 Ответ

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

Я решил эту проблему, используя MultSearchRequest и wildcardQuery():

MultiSearchRequest request = new MultiSearchRequest();

    request.add(formSearchRequestForMultiSearch(index, type, ID_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, PROVIDER_ID_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, LEGAL_NUMBER_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, OWNER_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, STATUS_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, START_DATE_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, END_DATE_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, PRODUCT_CODE_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, SUBPRODUCT_CODE_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, CUSTOM_STATUS_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, SUB_STATUS_FIELD, word));

    MultiSearchResponse searchResponse;
    try (RestHighLevelClient client = getClient()) {
        searchResponse = client.multiSearch(request);
    } catch (IOException e) {
        throw new CommonUserException(ELASTIC_EXCEPTION, ELASTIC_EXCEPTION);
    }
    Collection<Map<String, Object>> contracts = new LinkedList<>();
    for (int i = 0; i < searchResponse.getResponses().length; i++) {
        SearchHit[] hits = searchResponse.getResponses()[i].getResponse().getHits().getHits();
        for (SearchHit hit : hits) {
            contracts.add(hit.getSourceAsMap());
        }
    }
    return contracts;
}

private SearchRequest formSearchRequestForMultiSearch(String index, String type, String field, String word) {
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(QueryBuilders.wildcardQuery(field, word));
    searchRequest.source(searchSourceBuilder);
    return searchRequest;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...