From 2cb9e30b61e9dd1c0afcccd4499edbab93ab9ebe Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Mon, 26 Apr 2021 22:26:39 +0200 Subject: [PATCH] Search with MoreLikeThisQuery should use Pageable. Original Pull Request #1789 Closes #1787 (cherry picked from commit a2ca312fb2812bd34781206e47be31e9e43dac00) (cherry picked from commit 85af54635d77b37bfa25178b571404d335a87ead) # Conflicts: # src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java --- .../core/AbstractElasticsearchTemplate.java | 2 +- .../core/query/MoreLikeThisQuery.java | 4 ++ .../core/ElasticsearchTemplateTests.java | 46 ++++++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) 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 4f9dae403..11f7b4b94 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/AbstractElasticsearchTemplate.java @@ -352,7 +352,7 @@ public abstract class AbstractElasticsearchTemplate implements ElasticsearchOper 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 90976e72c..266be64a2 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 java.util.List; import org.springframework.data.domain.Pageable; import org.springframework.lang.Nullable; +import org.springframework.util.Assert; /** * MoreLikeThisQuery @@ -176,6 +177,9 @@ public class MoreLikeThisQuery { } 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 87e0c76a0..b485b4d47 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2020 the original author or authors. + * Copyright 2014-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1095,6 +1095,49 @@ public abstract class ElasticsearchTemplateTests { 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() { @@ -3822,4 +3865,5 @@ public abstract class ElasticsearchTemplateTests { @JoinTypeRelation(parent = "question", children = { "answer" }) }) private JoinField myJoinField; @Field(type = Text) private String text; } + //endregion }