diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchRepository.java index 0fb6ee16c..416503a53 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/ElasticsearchRepository.java @@ -22,7 +22,6 @@ import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.repository.NoRepositoryBean; import java.io.Serializable; -import java.util.List; /** * @param @@ -41,4 +40,6 @@ public interface ElasticsearchRepository extends Ela Page search(QueryBuilder elasticsearchQuery, Pageable pageable); Page search(SearchQuery searchQuery); + + Page searchSimilar(T entity); } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java index 5c3733f31..e3cc14ef5 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepository.java @@ -19,14 +19,10 @@ import org.elasticsearch.index.query.QueryBuilder; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.domain.*; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; -import org.springframework.data.elasticsearch.core.query.DeleteQuery; -import org.springframework.data.elasticsearch.core.query.GetQuery; -import org.springframework.data.elasticsearch.core.query.IndexQuery; -import org.springframework.data.elasticsearch.core.query.SearchQuery; +import org.springframework.data.elasticsearch.core.query.*; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.util.Assert; -import javax.annotation.PostConstruct; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; @@ -187,6 +183,14 @@ public class SimpleElasticsearchRepository implements ElasticsearchRepository return elasticsearchOperations.queryForPage(query, getEntityClass()); } + @Override + public Page searchSimilar(T entity) { + Assert.notNull(entity, "Cannot search similar records for 'null'."); + MoreLikeThisQuery query = new MoreLikeThisQuery(); + query.setId(extractIdFromBean(entity)); + return elasticsearchOperations.moreLikeThis(query, getEntityClass()); + } + @Override public void delete(String id) { Assert.notNull(id, "Cannot delete entity with id 'null'."); diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/RepositoryTest.java b/src/test/java/org/springframework/data/elasticsearch/repositories/RepositoryTest.java index af53284a0..9c99be09e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/RepositoryTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/RepositoryTest.java @@ -29,7 +29,9 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static org.apache.commons.lang.RandomStringUtils.randomNumeric; import static org.elasticsearch.index.query.QueryBuilders.*; @@ -381,4 +383,40 @@ public class RepositoryTest { //then assertThat(sampleEntities,is(notNullValue())); } + + + @Test + public void shouldReturnSimilarEntities(){ + //given + 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."; + + + + List sampleEntities = createSampleEntitiesWithMessage(sampleMessage, 30); + repository.save(sampleEntities); + + //when + Page results = repository.searchSimilar(sampleEntities.get(0)); + + //then + assertThat(results.getTotalElements(), is(greaterThanOrEqualTo(1L))); + } + + private static List createSampleEntitiesWithMessage(String message, int numberOfEntities){ + List sampleEntities = new ArrayList(); + for(int i = 0; i < numberOfEntities; i++){ + String documentId = randomNumeric(5); + SampleEntity sampleEntity = new SampleEntity(); + sampleEntity.setId(documentId); + sampleEntity.setMessage(message); + sampleEntity.setVersion(System.currentTimeMillis()); + sampleEntities.add(sampleEntity); + } + return sampleEntities; + } + }