Вопрос или проблема
Я работаю над получением данных из домена 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 может возникнуть по нескольким причинам. Рассмотрим вашу реализацию кода и некоторые шаги, которые могут помочь устранить эти проблемы.
-
Проверка сценариев запроса: Убедитесь, что ваш запрос формируется корректно и не вызывает повторного извлечения одних и тех же данных. Если
nextCursor
не меняется между итерациями цикла, это может привести к дублированию результатов. Попробуйте добавить логику, которая проверяет, изменился ли курсор после каждой итерации. Если курсор не изменился, это может означать, что достигнут конец результатов, и следует прекратить цикл. -
Обработка курсора: Ваша реализация запроса к CloudSearch использует курсор для получения данных. Однако стоит обратить внимание на то, что если вы добавляете результаты к
hits
не проверяя, есть ли они уже в списке, это может привести к дублированию. Вы можете использоватьSet
для хранения уникальных объектомHit
, если это приемлемо для вашей схемы данных. -
Параметры запроса: Убедитесь, что вы правильно указываете параметры вашего запроса. Например, если вы хотите получать определенные поля, убедитесь, что фильтры и настройки указаны правильно, чтобы избежать пропуска данных.
-
Лимиты 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.