|
19 | 19 |
|
20 | 20 | package org.elasticsearch.client;
|
21 | 21 |
|
| 22 | +import org.apache.http.HttpEntity; |
22 | 23 | import org.apache.http.entity.ContentType;
|
23 | 24 | import org.apache.http.entity.StringEntity;
|
| 25 | +import org.apache.http.nio.entity.NStringEntity; |
| 26 | +import org.elasticsearch.ElasticsearchException; |
24 | 27 | import org.elasticsearch.ElasticsearchStatusException;
|
| 28 | +import org.elasticsearch.action.search.ClearScrollRequest; |
| 29 | +import org.elasticsearch.action.search.ClearScrollResponse; |
25 | 30 | import org.elasticsearch.action.search.SearchRequest;
|
26 | 31 | import org.elasticsearch.action.search.SearchResponse;
|
| 32 | +import org.elasticsearch.action.search.SearchScrollRequest; |
| 33 | +import org.elasticsearch.common.unit.TimeValue; |
| 34 | +import org.elasticsearch.common.xcontent.XContentBuilder; |
27 | 35 | import org.elasticsearch.index.query.MatchQueryBuilder;
|
28 | 36 | import org.elasticsearch.join.aggregations.Children;
|
29 | 37 | import org.elasticsearch.join.aggregations.ChildrenAggregationBuilder;
|
|
37 | 45 | import org.elasticsearch.search.aggregations.matrix.stats.MatrixStatsAggregationBuilder;
|
38 | 46 | import org.elasticsearch.search.aggregations.support.ValueType;
|
39 | 47 | import org.elasticsearch.search.builder.SearchSourceBuilder;
|
| 48 | +import org.elasticsearch.search.sort.SortOrder; |
40 | 49 | import org.elasticsearch.search.suggest.Suggest;
|
41 | 50 | import org.elasticsearch.search.suggest.SuggestBuilder;
|
42 | 51 | import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
|
|
46 | 55 | import java.util.Arrays;
|
47 | 56 | import java.util.Collections;
|
48 | 57 |
|
| 58 | +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; |
49 | 59 | import static org.hamcrest.Matchers.both;
|
| 60 | +import static org.hamcrest.Matchers.containsString; |
50 | 61 | import static org.hamcrest.Matchers.either;
|
51 | 62 | import static org.hamcrest.Matchers.equalTo;
|
52 | 63 | import static org.hamcrest.Matchers.greaterThan;
|
53 | 64 | import static org.hamcrest.Matchers.greaterThanOrEqualTo;
|
| 65 | +import static org.hamcrest.Matchers.instanceOf; |
54 | 66 | import static org.hamcrest.Matchers.lessThan;
|
55 | 67 |
|
56 | 68 | public class SearchIT extends ESRestHighLevelClientTestCase {
|
@@ -386,6 +398,63 @@ public void testSearchWithSuggest() throws IOException {
|
386 | 398 | }
|
387 | 399 | }
|
388 | 400 |
|
| 401 | + public void testSearchScroll() throws Exception { |
| 402 | + |
| 403 | + for (int i = 0; i < 100; i++) { |
| 404 | + XContentBuilder builder = jsonBuilder().startObject().field("field", i).endObject(); |
| 405 | + HttpEntity entity = new NStringEntity(builder.string(), ContentType.APPLICATION_JSON); |
| 406 | + client().performRequest("PUT", "test/type1/" + Integer.toString(i), Collections.emptyMap(), entity); |
| 407 | + } |
| 408 | + client().performRequest("POST", "/test/_refresh"); |
| 409 | + |
| 410 | + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(35).sort("field", SortOrder.ASC); |
| 411 | + SearchRequest searchRequest = new SearchRequest("test").scroll(TimeValue.timeValueMinutes(2)).source(searchSourceBuilder); |
| 412 | + SearchResponse searchResponse = execute(searchRequest, highLevelClient()::search, highLevelClient()::searchAsync); |
| 413 | + |
| 414 | + try { |
| 415 | + long counter = 0; |
| 416 | + assertSearchHeader(searchResponse); |
| 417 | + assertThat(searchResponse.getHits().getTotalHits(), equalTo(100L)); |
| 418 | + assertThat(searchResponse.getHits().getHits().length, equalTo(35)); |
| 419 | + for (SearchHit hit : searchResponse.getHits()) { |
| 420 | + assertThat(((Number) hit.getSortValues()[0]).longValue(), equalTo(counter++)); |
| 421 | + } |
| 422 | + |
| 423 | + searchResponse = execute(new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2)), |
| 424 | + highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync); |
| 425 | + |
| 426 | + assertThat(searchResponse.getHits().getTotalHits(), equalTo(100L)); |
| 427 | + assertThat(searchResponse.getHits().getHits().length, equalTo(35)); |
| 428 | + for (SearchHit hit : searchResponse.getHits()) { |
| 429 | + assertEquals(counter++, ((Number) hit.getSortValues()[0]).longValue()); |
| 430 | + } |
| 431 | + |
| 432 | + searchResponse = execute(new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2)), |
| 433 | + highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync); |
| 434 | + |
| 435 | + assertThat(searchResponse.getHits().getTotalHits(), equalTo(100L)); |
| 436 | + assertThat(searchResponse.getHits().getHits().length, equalTo(30)); |
| 437 | + for (SearchHit hit : searchResponse.getHits()) { |
| 438 | + assertEquals(counter++, ((Number) hit.getSortValues()[0]).longValue()); |
| 439 | + } |
| 440 | + } finally { |
| 441 | + ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); |
| 442 | + clearScrollRequest.addScrollId(searchResponse.getScrollId()); |
| 443 | + ClearScrollResponse clearScrollResponse = execute(clearScrollRequest, highLevelClient()::clearScroll, |
| 444 | + highLevelClient()::clearScrollAsync); |
| 445 | + assertThat(clearScrollResponse.getNumFreed(), greaterThan(0)); |
| 446 | + assertTrue(clearScrollResponse.isSucceeded()); |
| 447 | + |
| 448 | + SearchScrollRequest scrollRequest = new SearchScrollRequest(searchResponse.getScrollId()).scroll(TimeValue.timeValueMinutes(2)); |
| 449 | + ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, () -> execute(scrollRequest, |
| 450 | + highLevelClient()::searchScroll, highLevelClient()::searchScrollAsync)); |
| 451 | + assertEquals(RestStatus.NOT_FOUND, exception.status()); |
| 452 | + assertThat(exception.getRootCause(), instanceOf(ElasticsearchException.class)); |
| 453 | + ElasticsearchException rootCause = (ElasticsearchException) exception.getRootCause(); |
| 454 | + assertThat(rootCause.getMessage(), containsString("No search context found for")); |
| 455 | + } |
| 456 | + } |
| 457 | + |
389 | 458 | private static void assertSearchHeader(SearchResponse searchResponse) {
|
390 | 459 | assertThat(searchResponse.getTook().nanos(), greaterThanOrEqualTo(0L));
|
391 | 460 | assertEquals(0, searchResponse.getFailedShards());
|
|
0 commit comments