Как рассчитывать документы Elastic Search на основе нескольких значений полей с помощью API Java? - PullRequest
0 голосов
/ 01 октября 2018

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

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

SearchResponse response = elasticClient.getClient().prepareSearch(Properties.get().getSearch().getAliasName())
        .setTypes(type)
        .setSize(0) // Don't return any documents, we don't need them.
        .get();

SearchHits hits = response.getHits();
return (int) hits.getTotalHits();

Возвращает правильное количество документов.

Я также могу искать конкретный документ, используя:

    searchResponse = elasticClient.getClient()
            .prepareSearch(index)
            .setSearchType(SearchType.QUERY_THEN_FETCH)
            .setQuery(QueryBuilders.prefixQuery(field_name, field_value))
            .setFetchSource(true)
            .setSize(10000)
            .setTypes(type)
            .addSort(builder.order(SortOrder.DESC))
            .get();

Также возвращаются документы.

У меня естьпопытка подсчета на основе двух значений поля с использованием:

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.prefixQuery(field_1, value_1));
queryBuilder.must(QueryBuilders.prefixQuery(field_2, value_2));
SearchRequestBuilder searchBuilder = elasticClient.getClient().prepareSearch(index)
        .setQuery(queryBuilder)
        .setTypes(type)
        .setSize(0);

Но это всегда возвращает 0.

Как правильно рассчитать документы на основе двух значений поля с использованием Java API?

1 Ответ

0 голосов
/ 02 октября 2018

Из проверки запроса вы не передаете оба значения вместе.Сначала вы передаете запрос для field_1, а затем перезаписываете его запросом field_2.Таким образом, переменная queryBuilder имеет только запрос: QueryBuilders.prefixQuery(field_2, value_2) к моменту его передачи клиенту.

В DSL-запросе Flexiblesearch объект must представляет собой массив запросов, которые ведут себя подобноAND в предложении SQL где.Поэтому все запросы в списке must должны совпадать.Чтобы включить оба запроса в must, сделайте следующее:

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must().add(QueryBuilders.prefixQuery(field_1, value_1));
queryBuilder.must().add(QueryBuilders.prefixQuery(field_2, value_2));

Что касается количества, то size = 0 должно помочь.Какой тип клиентаasticsearch вы используете?

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