From 0f15a69e24d1a49a80f09237b80172054c68f5a4 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Mon, 26 Apr 2021 22:24:25 +0200 Subject: [PATCH] Search with MoreLikeThisQuery should use Pageable. --- .../core/AbstractElasticsearchTemplate.java | 2 +- .../core/query/MoreLikeThisQuery.java | 4 ++ .../core/ElasticsearchTemplateTests.java | 45 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java index 4caf7f13b..6703696fd 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java @@ -419,7 +419,7 @@ public SearchHits search(MoreLikeThisQuery query, Class clazz, IndexCo Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery"); MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = requestFactory.moreLikeThisQueryBuilder(query, index); - return search(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).build(), clazz, index); + return search(new NativeSearchQueryBuilder().withQuery(moreLikeThisQueryBuilder).withPageable(query.getPageable()).build(), clazz, index); } @Override diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/MoreLikeThisQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/MoreLikeThisQuery.java index 9bdf6876c..8fc2d7227 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/MoreLikeThisQuery.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/MoreLikeThisQuery.java @@ -23,6 +23,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.lang.Nullable; +import org.springframework.util.Assert; /** * MoreLikeThisQuery @@ -176,6 +177,9 @@ public Pageable getPageable() { } public void setPageable(Pageable pageable) { + + Assert.notNull(pageable, "pageable must not be null"); + this.pageable = pageable; } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index 1cd35b169..48fedcada 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -1113,6 +1113,49 @@ public void shouldReturnSimilarResultsGivenMoreLikeThisQuery() { assertThat(content).contains(sampleEntity); } + @Test // #1787 + @DisplayName("should use Pageable on MoreLikeThis queries") + void shouldUsePageableOnMoreLikeThisQueries() { + + String sampleMessage = "So we build a web site or an application and want to add search to it, " + + "and then it hits us: getting search working is hard. We want our search solution to be fast," + + " we want a painless setup and a completely free search schema, we want to be able to index data simply using JSON over HTTP, " + + "we want our search server to be always available, we want to be able to start with one machine and scale to hundreds, " + + "we want real-time search, we want simple multi-tenancy, and we want a solution that is built for the cloud."; + String referenceId = nextIdAsString(); + Collection ids = IntStream.rangeClosed(1, 10).mapToObj(i -> nextIdAsString()).collect(Collectors.toList()); + ids.add(referenceId); + ids.stream() + .map(id -> getIndexQuery(SampleEntity.builder().id(id).message(sampleMessage).version(System.currentTimeMillis()).build())) + .forEach(indexQuery -> operations.index(indexQuery, index)); + indexOperations.refresh(); + + MoreLikeThisQuery moreLikeThisQuery = new MoreLikeThisQuery(); + moreLikeThisQuery.setId(referenceId); + moreLikeThisQuery.addFields("message"); + moreLikeThisQuery.setMinDocFreq(1); + moreLikeThisQuery.setPageable(PageRequest.of(0, 5)); + + SearchHits searchHits = operations.search(moreLikeThisQuery, SampleEntity.class, index); + + assertThat(searchHits.getTotalHits()).isEqualTo(10); + assertThat(searchHits.getSearchHits()).hasSize(5); + + Collection returnedIds = searchHits.getSearchHits().stream().map(SearchHit::getId).collect(Collectors.toList()); + + moreLikeThisQuery.setPageable(PageRequest.of(1, 5)); + + searchHits = operations.search(moreLikeThisQuery, SampleEntity.class, index); + + assertThat(searchHits.getTotalHits()).isEqualTo(10); + assertThat(searchHits.getSearchHits()).hasSize(5); + + searchHits.getSearchHits().stream().map(SearchHit::getId).forEach(returnedIds::add); + + assertThat(returnedIds).hasSize(10); + assertThat(ids).containsAll(returnedIds); + } + @Test // DATAES-167 public void shouldReturnResultsWithScanAndScrollForGivenCriteriaQuery() { @@ -3545,6 +3588,7 @@ void shouldReturnExplanationWhenRequested() { assertThat(explanation).isNotNull(); } + // region entities @Document(indexName = INDEX_NAME_SAMPLE_ENTITY) @Setting(shards = 1, replicas = 0, refreshInterval = "-1") static class SampleEntity { @@ -4322,4 +4366,5 @@ public void setText(@Nullable String text) { this.text = text; } } + //endregion }