Elasticsearch Java REST Client: посмотрите, не превышает ли количество подходящих обращений размер SearchSourceBuilder - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть запрос Elasticsearch:

SearchSourceBuilder source = new SearchSourceBuilder()
    .size(limit)
    .from(offset)
    .query(queryBuilder)
SearchRequest searchRequest = new SearchRequest(indexName)
        .types(type)
        .source(source);
SearchResponse searchResponse = client.search(searchRequest);

Мне необходимо при желании вернуть токен разбивки на страницы в зависимости от того, было ли ограничено количество возвращаемых результатов параметром limit (другими словами, есть ли еще результаты для возврата). Есть ли способ узнать, превысило ли число подходящих поисковых запросов, соответствующих запросу, limit, кроме как для выполнения другого запроса или установки размера limit + 1 и удаления последнего попадания в ответе?

Ответы [ 2 ]

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

Я думаю, что сначала вам нужен только поиск по количеству, то есть, я имею в виду, выполнить запрос, который вы хотите, и установить для size значение 0, чтобы результат просто возвращал общее количество попаданий, где вы можете получить размер каждой страницы.

    int pageSize = 10;
    long totalCount = searchResponse.getHits().getTotalHits();
    PageCount pageCount = new PageCount();
    if (totalCount <= 0)
        return result;
    long pages = (totalCount < pageSize) ? 1l : ((totalCount % pageSize) == 0) ? (totalCount / pageSize) : ((totalCount / pageSize) + 1);

    if (totalCount <= 10000) {
        result.setTotal(totalCount);
        result.setPages(pages);
    } else {
        result.setTotal(10000);
        result.setPages((10000 / pageSize));
    }

Здесь я использую 10000 как ограничение, чтобы Elasticsearch ограничивал объем потребляемой памяти. Получив эту информацию, вы можете вернуть количество страниц для запроса и сделать запросы для данной страницы.

Получив это, вы можете настроить поисковый запрос следующим образом:

    long size = ((pageCount.getTotal() < pageSize) ? pageCount.getTotal() : pageSize);
    if (pageCount.getTotal() > pageSize && (page + 1) >= pageCount.getPages()) {
        size = ((pageCount.getTotal() % pageSize) != 0 ? pageCount.getTotal() % pageSize : pageSize);
    }
    searchRequest.setSize((int) size).setFrom((int) (page * pageSize))

Это просто пример кода, надеюсь, вам этого достаточно.

Приветствия

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

Elasticsearch возвращает общее количество документов, соответствующих вашему запросу, в свойстве hits.totalHits в ответе. Если оно больше offset+limit, значит, у вас есть следующая страница.

...