Дублирование результатов в домене AWS CloudSearch

Вопрос или проблема

Я работаю над получением данных из домена AWS CloudSearch и сталкиваюсь с проблемами дублирования результатов и отсутствия данных. Вот мой код:

    private List<Hit> queryAws(String query, String fields) {
        AmazonCloudSearchDomain client = initializeClient();

        List<Hit> hits = new ArrayList<>();
        String nextCursor = "initial";
        boolean hasMore = true;

        do {
            SearchRequest searchRequest = new SearchRequest().withQuery(query);
            searchRequest.setQueryOptions("{\"fields\": [\""+ fields + "\"]}");
            searchRequest.setCursor(nextCursor);

            SearchResult result = client.search(searchRequest);
            hits.addAll(result.getHits().getHit());

            nextCursor = result.getHits().getCursor();

            if (result.getHits().getHit().isEmpty()) {
                hasMore = false;
            }
        }while(hasMore);

        return hits;
    }

Мы используем старый V1 SDK. Однако мы не можем обновиться до не-osgi V2.

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-osgi</artifactId>
            <version>1.11.534</version>
            <scope>provided</scope>
        </dependency>

Мне нужно использовать курсор вместо обычной пагинации, потому что мне нужно больше 10,000 результатов (максимально допустимое значение для пагинации).

Кажется, что информации/документации о использовании курсора очень мало, так что, возможно, я что-то упустил.

Ответ или решение

Проблема с дублированием результатов и отсутствующими данными в AWS CloudSearch Domain может возникнуть по нескольким причинам. Рассмотрим вашу реализацию кода и некоторые шаги, которые могут помочь устранить эти проблемы.

  1. Проверка сценариев запроса: Убедитесь, что ваш запрос формируется корректно и не вызывает повторного извлечения одних и тех же данных. Если nextCursor не меняется между итерациями цикла, это может привести к дублированию результатов. Попробуйте добавить логику, которая проверяет, изменился ли курсор после каждой итерации. Если курсор не изменился, это может означать, что достигнут конец результатов, и следует прекратить цикл.

  2. Обработка курсора: Ваша реализация запроса к CloudSearch использует курсор для получения данных. Однако стоит обратить внимание на то, что если вы добавляете результаты к hits не проверяя, есть ли они уже в списке, это может привести к дублированию. Вы можете использовать Set для хранения уникальных объектом Hit, если это приемлемо для вашей схемы данных.

  3. Параметры запроса: Убедитесь, что вы правильно указываете параметры вашего запроса. Например, если вы хотите получать определенные поля, убедитесь, что фильтры и настройки указаны правильно, чтобы избежать пропуска данных.

  4. Лимиты CloudSearch: Amazon CloudSearch имеет ограничения на размеры запросов и количество результатов. Если вы запрашиваете более 10,000 результатов, правильно используйте курсора для извлечения следующей страницы результатов. Проверьте, правильно ли указывается опция курсора и действительно ли nextCursor возвращается корректным образом.

Вот обновленный пример вашего метода, который учитывает некоторые из предложенных улучшений:

private List<Hit> queryAws(String query, String fields) {
    AmazonCloudSearchDomain client = initializeClient();
    Set<Hit> uniqueHits = new HashSet<>();
    String nextCursor = "initial";

    do {
        SearchRequest searchRequest = new SearchRequest().withQuery(query);
        searchRequest.setQueryOptions("{\"fields\": [\"" + fields + "\"]}");
        searchRequest.setCursor(nextCursor);

        SearchResult result = client.search(searchRequest);

        // Добавляем только уникальные результаты
        for (Hit hit : result.getHits().getHit()) {
            uniqueHits.add(hit);
        }

        nextCursor = result.getHits().getCursor();

    } while (nextCursor != null && !nextCursor.isEmpty());

    return new ArrayList<>(uniqueHits);
}

Здесь мы используем Set<Hit> uniqueHits для хранения только уникальных объектов Hit. Таким образом, вы избежите дублирования в результирующем списке.

Также удостоверьтесь, что вы проверяете наличие полных данных в результатах и корректно обрабатываете их. Если после всех проверок проблемы всё еще сохраняются, возможно, стоит рассмотреть возможность обращения в службу поддержки AWS или изучения более актуальных SDK и API для взаимодействия с CloudSearch.

Оцените материал
Добавить комментарий

Капча загружается...