From 40aa75eec10e32fd16237a5f0fbb3f583ca012c2 Mon Sep 17 00:00:00 2001 From: Mathieu Fortin Date: Tue, 19 May 2020 19:21:51 -0400 Subject: [PATCH] fixed formatting according to eclipse formatter --- .../spring/data/es/config/Config.java | 21 +- .../com/baeldung/SpringContextManualTest.java | 7 +- .../ElasticSearchManualTest.java | 199 ++++++------ .../elasticsearch/GeoQueriesManualTest.java | 228 ++++++------- .../data/es/ElasticSearchManualTest.java | 55 ++-- .../data/es/ElasticSearchQueryManualTest.java | 304 +++++++++--------- 6 files changed, 419 insertions(+), 395 deletions(-) diff --git a/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java index f98342486f..51bbe73e9e 100644 --- a/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java +++ b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java @@ -15,15 +15,18 @@ import org.springframework.data.elasticsearch.repository.config.EnableElasticsea @ComponentScan(basePackages = { "com.baeldung.spring.data.es.service" }) public class Config { - @Bean - RestHighLevelClient client() { - ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("localhost:9200").build(); + @Bean + RestHighLevelClient client() { + ClientConfiguration clientConfiguration = ClientConfiguration.builder() + .connectedTo("localhost:9200") + .build(); - return RestClients.create(clientConfiguration).rest(); - } + return RestClients.create(clientConfiguration) + .rest(); + } - @Bean - public ElasticsearchOperations elasticsearchTemplate() { - return new ElasticsearchRestTemplate(client()); - } + @Bean + public ElasticsearchOperations elasticsearchTemplate() { + return new ElasticsearchRestTemplate(client()); + } } diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/SpringContextManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/SpringContextManualTest.java index 27b41649ee..bff910cf93 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/SpringContextManualTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/SpringContextManualTest.java @@ -8,11 +8,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.spring.data.es.config.Config; /** - * This Manual test requires: - * Elasticsearch instance running on localhost:9200. + * This Manual test requires: Elasticsearch instance running on localhost:9200. * - * The following docker command can be used: - * docker run -d --name es761 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 + * The following docker command can be used: docker run -d --name es761 -p + * 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java index d19a7a379f..e4b3f6d801 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java @@ -37,126 +37,137 @@ import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; /** - * This Manual test requires: - * Elasticsearch instance running on localhost:9200. + * This Manual test requires: Elasticsearch instance running on localhost:9200. * - * The following docker command can be used: - * docker run -d --name es761 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 + * The following docker command can be used: docker run -d --name es761 -p + * 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 */ public class ElasticSearchManualTest { - private List listOfPersons = new ArrayList<>(); - private RestHighLevelClient client = null; + private List listOfPersons = new ArrayList<>(); + private RestHighLevelClient client = null; - @Before - public void setUp() throws UnknownHostException { - Person person1 = new Person(10, "John Doe", new Date()); - Person person2 = new Person(25, "Janette Doe", new Date()); - listOfPersons.add(person1); - listOfPersons.add(person2); + @Before + public void setUp() throws UnknownHostException { + Person person1 = new Person(10, "John Doe", new Date()); + Person person2 = new Person(25, "Janette Doe", new Date()); + listOfPersons.add(person1); + listOfPersons.add(person2); - ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("localhost:9200").build(); - client = RestClients.create(clientConfiguration).rest(); - } + ClientConfiguration clientConfiguration = ClientConfiguration.builder() + .connectedTo("localhost:9200") + .build(); + client = RestClients.create(clientConfiguration) + .rest(); + } - @Test - public void givenJsonString_whenJavaObject_thenIndexDocument() throws Exception { - String jsonObject = "{\"age\":20,\"dateOfBirth\":1471466076564,\"fullName\":\"John Doe\"}"; - IndexRequest request = new IndexRequest("people"); - request.source(jsonObject, XContentType.JSON); - - IndexResponse response = client.index(request, RequestOptions.DEFAULT); - String index = response.getIndex(); - long version = response.getVersion(); - - assertEquals(Result.CREATED, response.getResult()); - assertEquals(1, version); - assertEquals("people", index); - } + @Test + public void givenJsonString_whenJavaObject_thenIndexDocument() throws Exception { + String jsonObject = "{\"age\":20,\"dateOfBirth\":1471466076564,\"fullName\":\"John Doe\"}"; + IndexRequest request = new IndexRequest("people"); + request.source(jsonObject, XContentType.JSON); - @Test - public void givenDocumentId_whenJavaObject_thenDeleteDocument() throws Exception { - String jsonObject = "{\"age\":10,\"dateOfBirth\":1471455886564,\"fullName\":\"Johan Doe\"}"; - IndexRequest indexRequest = new IndexRequest("people"); - indexRequest.source(jsonObject, XContentType.JSON); + IndexResponse response = client.index(request, RequestOptions.DEFAULT); + String index = response.getIndex(); + long version = response.getVersion(); - IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); - String id = response.getId(); + assertEquals(Result.CREATED, response.getResult()); + assertEquals(1, version); + assertEquals("people", index); + } - GetRequest getRequest = new GetRequest("people"); - getRequest.id(id); + @Test + public void givenDocumentId_whenJavaObject_thenDeleteDocument() throws Exception { + String jsonObject = "{\"age\":10,\"dateOfBirth\":1471455886564,\"fullName\":\"Johan Doe\"}"; + IndexRequest indexRequest = new IndexRequest("people"); + indexRequest.source(jsonObject, XContentType.JSON); - GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); - System.out.println(getResponse.getSourceAsString()); + IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); + String id = response.getId(); - DeleteRequest deleteRequest = new DeleteRequest("people"); - deleteRequest.id(id); + GetRequest getRequest = new GetRequest("people"); + getRequest.id(id); - DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT); + GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); + System.out.println(getResponse.getSourceAsString()); - assertEquals(Result.DELETED, deleteResponse.getResult()); - } + DeleteRequest deleteRequest = new DeleteRequest("people"); + deleteRequest.id(id); - @Test - public void givenSearchRequest_whenMatchAll_thenReturnAllResults() throws Exception { - SearchRequest searchRequest = new SearchRequest(); - SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); - SearchHit[] searchHits = response.getHits().getHits(); - List results = Arrays.stream(searchHits).map(hit -> JSON.parseObject(hit.getSourceAsString(), Person.class)) - .collect(Collectors.toList()); + DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT); - results.forEach(System.out::println); - } + assertEquals(Result.DELETED, deleteResponse.getResult()); + } - @Test - public void givenSearchParameters_thenReturnResults() throws Exception { - SearchSourceBuilder builder = - new SearchSourceBuilder().postFilter(QueryBuilders.rangeQuery("age").from(5).to(15)); + @Test + public void givenSearchRequest_whenMatchAll_thenReturnAllResults() throws Exception { + SearchRequest searchRequest = new SearchRequest(); + SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); + SearchHit[] searchHits = response.getHits() + .getHits(); + List results = Arrays.stream(searchHits) + .map(hit -> JSON.parseObject(hit.getSourceAsString(), Person.class)) + .collect(Collectors.toList()); - SearchRequest searchRequest = new SearchRequest(); - searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH); - searchRequest.source(builder); + results.forEach(System.out::println); + } - SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); + @Test + public void givenSearchParameters_thenReturnResults() throws Exception { + SearchSourceBuilder builder = new SearchSourceBuilder().postFilter(QueryBuilders.rangeQuery("age") + .from(5) + .to(15)); - builder = new SearchSourceBuilder().postFilter(QueryBuilders.simpleQueryStringQuery("+John -Doe OR Janette")); + SearchRequest searchRequest = new SearchRequest(); + searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequest.source(builder); - searchRequest = new SearchRequest(); - searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH); - searchRequest.source(builder); + SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); - SearchResponse response2 = client.search(searchRequest, RequestOptions.DEFAULT); + builder = new SearchSourceBuilder().postFilter(QueryBuilders.simpleQueryStringQuery("+John -Doe OR Janette")); - builder = new SearchSourceBuilder().postFilter(QueryBuilders.matchQuery("John", "Name*")); - searchRequest = new SearchRequest(); - searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH); - searchRequest.source(builder); + searchRequest = new SearchRequest(); + searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequest.source(builder); - SearchResponse response3 = client.search(searchRequest, RequestOptions.DEFAULT); + SearchResponse response2 = client.search(searchRequest, RequestOptions.DEFAULT); - response2.getHits(); - response3.getHits(); - - final List results = - Stream.of(response.getHits().getHits(), - response2.getHits().getHits(), - response3.getHits().getHits()) - .flatMap(Arrays::stream) - .map(hit -> JSON.parseObject(hit.getSourceAsString(), Person.class)) - .collect(Collectors.toList()); - - results.forEach(System.out::println); - } + builder = new SearchSourceBuilder().postFilter(QueryBuilders.matchQuery("John", "Name*")); + searchRequest = new SearchRequest(); + searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequest.source(builder); - @Test - public void givenContentBuilder_whenHelpers_thanIndexJson() throws IOException { - XContentBuilder builder = XContentFactory.jsonBuilder().startObject().field("fullName", "Test") - .field("salary", "11500").field("age", "10").endObject(); + SearchResponse response3 = client.search(searchRequest, RequestOptions.DEFAULT); - IndexRequest indexRequest = new IndexRequest("people"); - indexRequest.source(builder); + response2.getHits(); + response3.getHits(); - IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); + final List results = Stream.of(response.getHits() + .getHits(), + response2.getHits() + .getHits(), + response3.getHits() + .getHits()) + .flatMap(Arrays::stream) + .map(hit -> JSON.parseObject(hit.getSourceAsString(), Person.class)) + .collect(Collectors.toList()); - assertEquals(Result.CREATED, response.getResult()); - } + results.forEach(System.out::println); + } + + @Test + public void givenContentBuilder_whenHelpers_thanIndexJson() throws IOException { + XContentBuilder builder = XContentFactory.jsonBuilder() + .startObject() + .field("fullName", "Test") + .field("salary", "11500") + .field("age", "10") + .endObject(); + + IndexRequest indexRequest = new IndexRequest("people"); + indexRequest.source(builder); + + IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); + + assertEquals(Result.CREATED, response.getResult()); + } } diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesManualTest.java index ed67818d6c..a36e08d6d2 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesManualTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesManualTest.java @@ -39,150 +39,162 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * This Manual test requires: - * Elasticsearch instance running on localhost:9200. + * This Manual test requires: Elasticsearch instance running on localhost:9200. * - * The following docker command can be used: - * docker run -d --name es761 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 + * The following docker command can be used: docker run -d --name es761 -p + * 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) public class GeoQueriesManualTest { - private static final String WONDERS_OF_WORLD = "wonders-of-world"; + private static final String WONDERS_OF_WORLD = "wonders-of-world"; - @Autowired - private RestHighLevelClient client; + @Autowired + private RestHighLevelClient client; - @Before - public void setUp() throws Exception { - String jsonObject = "{\"properties\":{\"name\":{\"type\":\"text\",\"index\":false},\"region\":{\"type\":\"geo_shape\"},\"location\":{\"type\":\"geo_point\"}}}"; - - CreateIndexRequest req = new CreateIndexRequest(WONDERS_OF_WORLD); - req.mapping(jsonObject, XContentType.JSON); + @Before + public void setUp() throws Exception { + String jsonObject = "{\"properties\":{\"name\":{\"type\":\"text\",\"index\":false},\"region\":{\"type\":\"geo_shape\"},\"location\":{\"type\":\"geo_point\"}}}"; - client.indices().create(req, RequestOptions.DEFAULT); - } + CreateIndexRequest req = new CreateIndexRequest(WONDERS_OF_WORLD); + req.mapping(jsonObject, XContentType.JSON); - @Test - public void givenGeoShapeData_whenExecutedGeoShapeQuery_thenResultNonEmpty() throws IOException { - String jsonObject = "{\"name\":\"Agra\",\"region\":{\"type\":\"envelope\",\"coordinates\":[[75,30.2],[80.1, 25]]}}"; - IndexRequest indexRequest = new IndexRequest(WONDERS_OF_WORLD); - indexRequest.source(jsonObject, XContentType.JSON); - IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); + client.indices() + .create(req, RequestOptions.DEFAULT); + } - String tajMahalId = response.getId(); + @Test + public void givenGeoShapeData_whenExecutedGeoShapeQuery_thenResultNonEmpty() throws IOException { + String jsonObject = "{\"name\":\"Agra\",\"region\":{\"type\":\"envelope\",\"coordinates\":[[75,30.2],[80.1, 25]]}}"; + IndexRequest indexRequest = new IndexRequest(WONDERS_OF_WORLD); + indexRequest.source(jsonObject, XContentType.JSON); + IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); - RefreshRequest refreshRequest = new RefreshRequest(WONDERS_OF_WORLD); - client.indices().refresh(refreshRequest, RequestOptions.DEFAULT); + String tajMahalId = response.getId(); - Coordinate topLeft = new Coordinate(74, 31.2); - Coordinate bottomRight = new Coordinate(81.1, 24); - - GeoShapeQueryBuilder qb = QueryBuilders.geoShapeQuery("region", - new EnvelopeBuilder(topLeft, bottomRight).buildGeometry()); - qb.relation(ShapeRelation.INTERSECTS); + RefreshRequest refreshRequest = new RefreshRequest(WONDERS_OF_WORLD); + client.indices() + .refresh(refreshRequest, RequestOptions.DEFAULT); - SearchSourceBuilder source = new SearchSourceBuilder().query(qb); - SearchRequest searchRequest = new SearchRequest(WONDERS_OF_WORLD); - searchRequest.source(source); - - SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + Coordinate topLeft = new Coordinate(74, 31.2); + Coordinate bottomRight = new Coordinate(81.1, 24); - List ids = Arrays.stream(searchResponse.getHits().getHits()).map(SearchHit::getId) - .collect(Collectors.toList()); + GeoShapeQueryBuilder qb = QueryBuilders.geoShapeQuery("region", new EnvelopeBuilder(topLeft, bottomRight).buildGeometry()); + qb.relation(ShapeRelation.INTERSECTS); - assertTrue(ids.contains(tajMahalId)); - } + SearchSourceBuilder source = new SearchSourceBuilder().query(qb); + SearchRequest searchRequest = new SearchRequest(WONDERS_OF_WORLD); + searchRequest.source(source); - @Test - public void givenGeoPointData_whenExecutedGeoBoundingBoxQuery_thenResultNonEmpty() throws Exception { - String jsonObject = "{\"name\":\"Pyramids of Giza\",\"location\":[31.131302,29.976480]}"; + SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); - IndexRequest indexRequest = new IndexRequest(WONDERS_OF_WORLD); - indexRequest.source(jsonObject, XContentType.JSON); - IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); + List ids = Arrays.stream(searchResponse.getHits() + .getHits()) + .map(SearchHit::getId) + .collect(Collectors.toList()); - String pyramidsOfGizaId = response.getId(); + assertTrue(ids.contains(tajMahalId)); + } - RefreshRequest refreshRequest = new RefreshRequest(WONDERS_OF_WORLD); - client.indices().refresh(refreshRequest, RequestOptions.DEFAULT); + @Test + public void givenGeoPointData_whenExecutedGeoBoundingBoxQuery_thenResultNonEmpty() throws Exception { + String jsonObject = "{\"name\":\"Pyramids of Giza\",\"location\":[31.131302,29.976480]}"; - QueryBuilder qb = QueryBuilders.geoBoundingBoxQuery("location").setCorners(31, 30, 28, 32); + IndexRequest indexRequest = new IndexRequest(WONDERS_OF_WORLD); + indexRequest.source(jsonObject, XContentType.JSON); + IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); - SearchSourceBuilder source = new SearchSourceBuilder().query(qb); - SearchRequest searchRequest = new SearchRequest(WONDERS_OF_WORLD); - searchRequest.source(source); + String pyramidsOfGizaId = response.getId(); - SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + RefreshRequest refreshRequest = new RefreshRequest(WONDERS_OF_WORLD); + client.indices() + .refresh(refreshRequest, RequestOptions.DEFAULT); - List ids = Arrays.stream(searchResponse.getHits().getHits()).map(SearchHit::getId) - .collect(Collectors.toList()); - assertTrue(ids.contains(pyramidsOfGizaId)); - } + QueryBuilder qb = QueryBuilders.geoBoundingBoxQuery("location") + .setCorners(31, 30, 28, 32); - @Test - public void givenGeoPointData_whenExecutedGeoDistanceQuery_thenResultNonEmpty() throws Exception { - String jsonObject = "{\"name\":\"Lighthouse of alexandria\",\"location\":[31.131302,29.976480]}"; - - IndexRequest indexRequest = new IndexRequest(WONDERS_OF_WORLD); - indexRequest.source(jsonObject, XContentType.JSON); - IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); + SearchSourceBuilder source = new SearchSourceBuilder().query(qb); + SearchRequest searchRequest = new SearchRequest(WONDERS_OF_WORLD); + searchRequest.source(source); - String lighthouseOfAlexandriaId = response.getId(); + SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); - RefreshRequest refreshRequest = new RefreshRequest(WONDERS_OF_WORLD); - client.indices().refresh(refreshRequest, RequestOptions.DEFAULT); + List ids = Arrays.stream(searchResponse.getHits() + .getHits()) + .map(SearchHit::getId) + .collect(Collectors.toList()); + assertTrue(ids.contains(pyramidsOfGizaId)); + } - QueryBuilder qb = - QueryBuilders.geoDistanceQuery("location") - .point(29.976, 31.131) - .distance(10, DistanceUnit.MILES); + @Test + public void givenGeoPointData_whenExecutedGeoDistanceQuery_thenResultNonEmpty() throws Exception { + String jsonObject = "{\"name\":\"Lighthouse of alexandria\",\"location\":[31.131302,29.976480]}"; - SearchSourceBuilder source = new SearchSourceBuilder().query(qb); - SearchRequest searchRequest = new SearchRequest(WONDERS_OF_WORLD); - searchRequest.source(source); + IndexRequest indexRequest = new IndexRequest(WONDERS_OF_WORLD); + indexRequest.source(jsonObject, XContentType.JSON); + IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); - SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + String lighthouseOfAlexandriaId = response.getId(); - List ids = Arrays.stream(searchResponse.getHits().getHits()).map(SearchHit::getId) - .collect(Collectors.toList()); - assertTrue(ids.contains(lighthouseOfAlexandriaId)); - } + RefreshRequest refreshRequest = new RefreshRequest(WONDERS_OF_WORLD); + client.indices() + .refresh(refreshRequest, RequestOptions.DEFAULT); - @Test - public void givenGeoPointData_whenExecutedGeoPolygonQuery_thenResultNonEmpty() throws Exception { - String jsonObject = "{\"name\":\"The Great Rann of Kutch\",\"location\":[69.859741,23.733732]}"; + QueryBuilder qb = QueryBuilders.geoDistanceQuery("location") + .point(29.976, 31.131) + .distance(10, DistanceUnit.MILES); - IndexRequest indexRequest = new IndexRequest(WONDERS_OF_WORLD); - indexRequest.source(jsonObject, XContentType.JSON); - IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); - - String greatRannOfKutchid = response.getId(); + SearchSourceBuilder source = new SearchSourceBuilder().query(qb); + SearchRequest searchRequest = new SearchRequest(WONDERS_OF_WORLD); + searchRequest.source(source); - RefreshRequest refreshRequest = new RefreshRequest(WONDERS_OF_WORLD); - client.indices().refresh(refreshRequest, RequestOptions.DEFAULT); - - List allPoints = new ArrayList(); - allPoints.add(new GeoPoint(22.733, 68.859)); - allPoints.add(new GeoPoint(24.733, 68.859)); - allPoints.add(new GeoPoint(23, 70.859)); - QueryBuilder qb = QueryBuilders.geoPolygonQuery("location", allPoints); + SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); - SearchSourceBuilder source = new SearchSourceBuilder().query(qb); - SearchRequest searchRequest = new SearchRequest(WONDERS_OF_WORLD); - searchRequest.source(source); + List ids = Arrays.stream(searchResponse.getHits() + .getHits()) + .map(SearchHit::getId) + .collect(Collectors.toList()); + assertTrue(ids.contains(lighthouseOfAlexandriaId)); + } - SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + @Test + public void givenGeoPointData_whenExecutedGeoPolygonQuery_thenResultNonEmpty() throws Exception { + String jsonObject = "{\"name\":\"The Great Rann of Kutch\",\"location\":[69.859741,23.733732]}"; - List ids = Arrays.stream(searchResponse.getHits().getHits()).map(SearchHit::getId) - .collect(Collectors.toList()); - assertTrue(ids.contains(greatRannOfKutchid)); - } + IndexRequest indexRequest = new IndexRequest(WONDERS_OF_WORLD); + indexRequest.source(jsonObject, XContentType.JSON); + IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT); - @After - public void destroy() throws Exception { - DeleteIndexRequest deleteIndex = new DeleteIndexRequest(WONDERS_OF_WORLD); - client.indices().delete(deleteIndex, RequestOptions.DEFAULT); - } + String greatRannOfKutchid = response.getId(); + + RefreshRequest refreshRequest = new RefreshRequest(WONDERS_OF_WORLD); + client.indices() + .refresh(refreshRequest, RequestOptions.DEFAULT); + + List allPoints = new ArrayList(); + allPoints.add(new GeoPoint(22.733, 68.859)); + allPoints.add(new GeoPoint(24.733, 68.859)); + allPoints.add(new GeoPoint(23, 70.859)); + QueryBuilder qb = QueryBuilders.geoPolygonQuery("location", allPoints); + + SearchSourceBuilder source = new SearchSourceBuilder().query(qb); + SearchRequest searchRequest = new SearchRequest(WONDERS_OF_WORLD); + searchRequest.source(source); + + SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); + + List ids = Arrays.stream(searchResponse.getHits() + .getHits()) + .map(SearchHit::getId) + .collect(Collectors.toList()); + assertTrue(ids.contains(greatRannOfKutchid)); + } + + @After + public void destroy() throws Exception { + DeleteIndexRequest deleteIndex = new DeleteIndexRequest(WONDERS_OF_WORLD); + client.indices() + .delete(deleteIndex, RequestOptions.DEFAULT); + } } diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java index 87eab00da0..9f713a276f 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java @@ -31,11 +31,10 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * This Manual test requires: - * Elasticsearch instance running on localhost:9200. + * This Manual test requires: Elasticsearch instance running on localhost:9200. * - * The following docker command can be used: - * docker run -d --name es761 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 + * The following docker command can be used: docker run -d --name es761 -p + * 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) @@ -77,7 +76,7 @@ public class ElasticSearchManualTest { public void after() { articleRepository.deleteAll(); } - + @Test public void givenArticleService_whenSaveArticle_thenIdIsAssigned() { final List authors = asList(new Author("John Smith"), johnDoe); @@ -91,81 +90,79 @@ public class ElasticSearchManualTest { @Test public void givenPersistedArticles_whenSearchByAuthorsName_thenRightFound() { - final Page
articleByAuthorName = articleRepository.findByAuthorsName(johnSmith.getName(), - PageRequest.of(0, 10)); + final Page
articleByAuthorName = articleRepository.findByAuthorsName(johnSmith.getName(), PageRequest.of(0, 10)); assertEquals(2L, articleByAuthorName.getTotalElements()); } @Test public void givenCustomQuery_whenSearchByAuthorsName_thenArticleIsFound() { - final Page
articleByAuthorName = articleRepository.findByAuthorsNameUsingCustomQuery("Smith", - PageRequest.of(0, 10)); + final Page
articleByAuthorName = articleRepository.findByAuthorsNameUsingCustomQuery("Smith", PageRequest.of(0, 10)); assertEquals(2L, articleByAuthorName.getTotalElements()); } @Test public void givenTagFilterQuery_whenSearchByTag_thenArticleIsFound() { - final Page
articleByAuthorName = articleRepository.findByFilteredTagQuery("elasticsearch", - PageRequest.of(0, 10)); + final Page
articleByAuthorName = articleRepository.findByFilteredTagQuery("elasticsearch", PageRequest.of(0, 10)); assertEquals(3L, articleByAuthorName.getTotalElements()); } @Test public void givenTagFilterQuery_whenSearchByAuthorsName_thenArticleIsFound() { - final Page
articleByAuthorName = articleRepository.findByAuthorsNameAndFilteredTagQuery("Doe", - "elasticsearch", PageRequest.of(0, 10)); + final Page
articleByAuthorName = articleRepository.findByAuthorsNameAndFilteredTagQuery("Doe", "elasticsearch", PageRequest.of(0, 10)); assertEquals(2L, articleByAuthorName.getTotalElements()); } @Test public void givenPersistedArticles_whenUseRegexQuery_thenRightArticlesFound() { final Query searchQuery = new NativeSearchQueryBuilder().withFilter(regexpQuery("title", ".*data.*")) - .build(); + .build(); - final SearchHits
articles = - elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); } @Test public void givenSavedDoc_whenTitleUpdated_thenCouldFindByUpdatedTitle() { - final Query searchQuery = new NativeSearchQueryBuilder().withQuery(fuzzyQuery("title", "serch")).build(); + final Query searchQuery = new NativeSearchQueryBuilder().withQuery(fuzzyQuery("title", "serch")) + .build(); final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); - final Article article = articles.getSearchHit(0).getContent(); + final Article article = articles.getSearchHit(0) + .getContent(); final String newTitle = "Getting started with Search Engines"; article.setTitle(newTitle); articleRepository.save(article); - assertEquals(newTitle, articleRepository.findById(article.getId()).get().getTitle()); + assertEquals(newTitle, articleRepository.findById(article.getId()) + .get() + .getTitle()); } @Test public void givenSavedDoc_whenDelete_thenRemovedFromIndex() { final String articleTitle = "Spring Data Elasticsearch"; - final Query searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%")).build(); - final SearchHits
articles = - elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - + final Query searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%")) + .build(); + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + assertEquals(1, articles.getTotalHits()); final long count = articleRepository.count(); - articleRepository.delete(articles.getSearchHit(0).getContent()); + articleRepository.delete(articles.getSearchHit(0) + .getContent()); assertEquals(count - 1, articleRepository.count()); } @Test public void givenSavedDoc_whenOneTermMatches_thenFindByTitle() { - final Query searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchQuery("title", "Search engines").operator(AND)).build(); - final SearchHits
articles = - elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + final Query searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Search engines").operator(AND)) + .build(); + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); assertEquals(1, articles.getTotalHits()); } } diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java index b9de9d51af..3cedab00e4 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java @@ -48,199 +48,201 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * This Manual test requires: - * Elasticsearch instance running on localhost:9200. + * This Manual test requires: Elasticsearch instance running on localhost:9200. * - * The following docker command can be used: - * docker run -d --name es761 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 + * The following docker command can be used: docker run -d --name es761 -p + * 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.1 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) public class ElasticSearchQueryManualTest { - @Autowired - private ElasticsearchRestTemplate elasticsearchTemplate; + @Autowired + private ElasticsearchRestTemplate elasticsearchTemplate; - @Autowired - private ArticleRepository articleRepository; + @Autowired + private ArticleRepository articleRepository; - @Autowired - private RestHighLevelClient client; + @Autowired + private RestHighLevelClient client; - private final Author johnSmith = new Author("John Smith"); - private final Author johnDoe = new Author("John Doe"); + private final Author johnSmith = new Author("John Smith"); + private final Author johnDoe = new Author("John Doe"); - @Before - public void before() { - Article article = new Article("Spring Data Elasticsearch"); - article.setAuthors(asList(johnSmith, johnDoe)); - article.setTags("elasticsearch", "spring data"); - articleRepository.save(article); + @Before + public void before() { + Article article = new Article("Spring Data Elasticsearch"); + article.setAuthors(asList(johnSmith, johnDoe)); + article.setTags("elasticsearch", "spring data"); + articleRepository.save(article); - article = new Article("Search engines"); - article.setAuthors(asList(johnDoe)); - article.setTags("search engines", "tutorial"); - articleRepository.save(article); + article = new Article("Search engines"); + article.setAuthors(asList(johnDoe)); + article.setTags("search engines", "tutorial"); + articleRepository.save(article); - article = new Article("Second Article About Elasticsearch"); - article.setAuthors(asList(johnSmith)); - article.setTags("elasticsearch", "spring data"); - articleRepository.save(article); + article = new Article("Second Article About Elasticsearch"); + article.setAuthors(asList(johnSmith)); + article.setTags("elasticsearch", "spring data"); + articleRepository.save(article); - article = new Article("Elasticsearch Tutorial"); - article.setAuthors(asList(johnDoe)); - article.setTags("elasticsearch"); - articleRepository.save(article); - } + article = new Article("Elasticsearch Tutorial"); + article.setAuthors(asList(johnDoe)); + article.setTags("elasticsearch"); + articleRepository.save(article); + } - @After - public void after() { - articleRepository.deleteAll(); - } + @After + public void after() { + articleRepository.deleteAll(); + } - @Test - public void givenFullTitle_whenRunMatchQuery_thenDocIsFound() { - final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchQuery("title", "Search engines").operator(Operator.AND)).build(); - final SearchHits
articles = - elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - assertEquals(1, articles.getTotalHits()); - } + @Test + public void givenFullTitle_whenRunMatchQuery_thenDocIsFound() { + final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Search engines").operator(Operator.AND)) + .build(); + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + assertEquals(1, articles.getTotalHits()); + } - @Test - public void givenOneTermFromTitle_whenRunMatchQuery_thenDocIsFound() { - final NativeSearchQuery searchQuery = - new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Engines Solutions")) - .build(); - - final SearchHits
articles = - elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - - assertEquals(1, articles.getTotalHits()); - assertEquals("Search engines", articles.getSearchHit(0).getContent().getTitle()); - } + @Test + public void givenOneTermFromTitle_whenRunMatchQuery_thenDocIsFound() { + final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Engines Solutions")) + .build(); - @Test - public void givenPartTitle_whenRunMatchQuery_thenDocIsFound() { - final NativeSearchQuery searchQuery = - new NativeSearchQueryBuilder().withQuery(matchQuery("title", "elasticsearch data")) - .build(); + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - final SearchHits
articles = - elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - - assertEquals(3, articles.getTotalHits()); - } + assertEquals(1, articles.getTotalHits()); + assertEquals("Search engines", articles.getSearchHit(0) + .getContent() + .getTitle()); + } - @Test - public void givenFullTitle_whenRunMatchQueryOnVerbatimField_thenDocIsFound() { - NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchQuery("title.verbatim", "Second Article About Elasticsearch")) - .build(); + @Test + public void givenPartTitle_whenRunMatchQuery_thenDocIsFound() { + final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "elasticsearch data")) + .build(); - SearchHits
articles = - elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - - assertEquals(1, articles.getTotalHits()); + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchQuery("title.verbatim", "Second Article About")) - .build(); - - articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - assertEquals(0, articles.getTotalHits()); - } + assertEquals(3, articles.getTotalHits()); + } - @Test - public void givenNestedObject_whenQueryByAuthorsName_thenFoundArticlesByThatAuthor() { - final QueryBuilder builder = nestedQuery("authors", boolQuery().must(termQuery("authors.name", "smith")), - ScoreMode.None); + @Test + public void givenFullTitle_whenRunMatchQueryOnVerbatimField_thenDocIsFound() { + NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title.verbatim", "Second Article About Elasticsearch")) + .build(); - final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); - final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - assertEquals(2, articles.getTotalHits()); - } + assertEquals(1, articles.getTotalHits()); - @Test - public void givenAnalyzedQuery_whenMakeAggregationOnTermCount_thenEachTokenCountsSeparately() throws Exception { - final TermsAggregationBuilder aggregation = AggregationBuilders.terms("top_tags").field("title"); + searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title.verbatim", "Second Article About")) + .build(); - final SearchSourceBuilder builder = new SearchSourceBuilder().aggregation(aggregation); - final SearchRequest searchRequest = new SearchRequest("blog").source(builder); + articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + assertEquals(0, articles.getTotalHits()); + } - final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); + @Test + public void givenNestedObject_whenQueryByAuthorsName_thenFoundArticlesByThatAuthor() { + final QueryBuilder builder = nestedQuery("authors", boolQuery().must(termQuery("authors.name", "smith")), ScoreMode.None); - final Map results = response.getAggregations().asMap(); - final ParsedStringTerms topTags = (ParsedStringTerms) results.get("top_tags"); + final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder) + .build(); + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - final List keys = topTags.getBuckets().stream().map(MultiBucketsAggregation.Bucket::getKeyAsString).sorted() - .collect(toList()); - assertEquals( - asList("about", "article", "data", "elasticsearch", "engines", "search", "second", "spring", "tutorial"), keys); - } + assertEquals(2, articles.getTotalHits()); + } - @Test - public void givenNotAnalyzedQuery_whenMakeAggregationOnTermCount_thenEachTermCountsIndividually() throws Exception { - final TermsAggregationBuilder aggregation = AggregationBuilders.terms("top_tags").field("tags") - .order(BucketOrder.count(false)); + @Test + public void givenAnalyzedQuery_whenMakeAggregationOnTermCount_thenEachTokenCountsSeparately() throws Exception { + final TermsAggregationBuilder aggregation = AggregationBuilders.terms("top_tags") + .field("title"); - final SearchSourceBuilder builder = new SearchSourceBuilder().aggregation(aggregation); - final SearchRequest searchRequest = new SearchRequest().indices("blog").source(builder); + final SearchSourceBuilder builder = new SearchSourceBuilder().aggregation(aggregation); + final SearchRequest searchRequest = new SearchRequest("blog").source(builder); - final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); + final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); - final Map results = response.getAggregations().asMap(); - final ParsedStringTerms topTags = (ParsedStringTerms) results.get("top_tags"); + final Map results = response.getAggregations() + .asMap(); + final ParsedStringTerms topTags = (ParsedStringTerms) results.get("top_tags"); - final List keys = topTags.getBuckets().stream().map(MultiBucketsAggregation.Bucket::getKeyAsString) - .collect(toList()); - assertEquals(asList("elasticsearch", "spring data", "search engines", "tutorial"), keys); - } + final List keys = topTags.getBuckets() + .stream() + .map(MultiBucketsAggregation.Bucket::getKeyAsString) + .sorted() + .collect(toList()); + assertEquals(asList("about", "article", "data", "elasticsearch", "engines", "search", "second", "spring", "tutorial"), keys); + } - @Test - public void givenNotExactPhrase_whenUseSlop_thenQueryMatches() { - final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery(matchPhraseQuery("title", "spring elasticsearch").slop(1)).build(); + @Test + public void givenNotAnalyzedQuery_whenMakeAggregationOnTermCount_thenEachTermCountsIndividually() throws Exception { + final TermsAggregationBuilder aggregation = AggregationBuilders.terms("top_tags") + .field("tags") + .order(BucketOrder.count(false)); - final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - - assertEquals(1, articles.getTotalHits()); - } + final SearchSourceBuilder builder = new SearchSourceBuilder().aggregation(aggregation); + final SearchRequest searchRequest = new SearchRequest().indices("blog") + .source(builder); - @Test - public void givenPhraseWithType_whenUseFuzziness_thenQueryMatches() { - final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery( - matchQuery("title", "spring date elasticserch").operator(Operator.AND).fuzziness(Fuzziness.ONE).prefixLength(3)) - .build(); + final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); - final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - - assertEquals(1, articles.getTotalHits()); - } + final Map results = response.getAggregations() + .asMap(); + final ParsedStringTerms topTags = (ParsedStringTerms) results.get("top_tags"); - @Test - public void givenMultimatchQuery_whenDoSearch_thenAllProvidedFieldsMatch() { - final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() - .withQuery( - multiMatchQuery("tutorial").field("title").field("tags").type(MultiMatchQueryBuilder.Type.BEST_FIELDS)) - .build(); + final List keys = topTags.getBuckets() + .stream() + .map(MultiBucketsAggregation.Bucket::getKeyAsString) + .collect(toList()); + assertEquals(asList("elasticsearch", "spring data", "search engines", "tutorial"), keys); + } - final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + @Test + public void givenNotExactPhrase_whenUseSlop_thenQueryMatches() { + final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchPhraseQuery("title", "spring elasticsearch").slop(1)) + .build(); - assertEquals(2, articles.getTotalHits()); - } + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); - @Test - public void givenBoolQuery_whenQueryByAuthorsName_thenFoundArticlesByThatAuthorAndFilteredTag() { - final QueryBuilder builder = boolQuery() - .must(nestedQuery("authors", boolQuery().must(termQuery("authors.name", "doe")), ScoreMode.None)) - .filter(termQuery("tags", "elasticsearch")); + assertEquals(1, articles.getTotalHits()); + } - final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); - final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + @Test + public void givenPhraseWithType_whenUseFuzziness_thenQueryMatches() { + final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "spring date elasticserch").operator(Operator.AND) + .fuzziness(Fuzziness.ONE) + .prefixLength(3)) + .build(); - assertEquals(2, articles.getTotalHits()); - } + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + + assertEquals(1, articles.getTotalHits()); + } + + @Test + public void givenMultimatchQuery_whenDoSearch_thenAllProvidedFieldsMatch() { + final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(multiMatchQuery("tutorial").field("title") + .field("tags") + .type(MultiMatchQueryBuilder.Type.BEST_FIELDS)) + .build(); + + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + + assertEquals(2, articles.getTotalHits()); + } + + @Test + public void givenBoolQuery_whenQueryByAuthorsName_thenFoundArticlesByThatAuthorAndFilteredTag() { + final QueryBuilder builder = boolQuery().must(nestedQuery("authors", boolQuery().must(termQuery("authors.name", "doe")), ScoreMode.None)) + .filter(termQuery("tags", "elasticsearch")); + + final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder) + .build(); + final SearchHits
articles = elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("blog")); + + assertEquals(2, articles.getTotalHits()); + } }