From 1352c9f45bec176f949b32319b5f8dfa7604ea05 Mon Sep 17 00:00:00 2001 From: Artur Konczak Date: Sun, 16 Feb 2014 21:44:36 +0000 Subject: [PATCH] DATAES-54 - upgraded to elasticsearch 1.0 --- pom.xml | 2 +- .../core/CriteriaQueryProcessor.java | 21 +++++++------------ .../core/ElasticsearchTemplate.java | 14 ++++++------- .../elasticsearch/core/query/Criteria.java | 14 ++++++------- .../AbstractElasticsearchRepository.java | 12 +++++------ ...ElasticsearchTemplateParentChildTests.java | 4 ++-- .../core/ElasticsearchTemplateTests.java | 20 +++++++----------- .../geo/ElasticsearchTemplateGeoTests.java | 7 ++++--- .../CustomMethodRepositoryTests.java | 8 +++---- .../SampleCustomMethodRepository.java | 4 ++-- .../SimpleElasticsearchRepositoryTests.java | 10 ++++----- template.mf | 2 +- 12 files changed, 54 insertions(+), 64 deletions(-) diff --git a/pom.xml b/pom.xml index ced57a14f..0585c46e6 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ 3.2.1 2.6 - 0.90.11 + 1.0.0 1.7.0.RC1 diff --git a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java index ba61a8316..8c4fc11ca 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java @@ -23,6 +23,7 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; +import org.apache.lucene.queryparser.flexible.core.util.StringUtils; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.BoostableQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; @@ -117,18 +118,20 @@ class CriteriaQueryProcessor { } QueryBuilder query = null; + String searchText = StringUtils.toString(value); + switch (key) { case EQUALS: - query = fieldQuery(fieldName, value); + query = queryString(searchText).field(fieldName); break; case CONTAINS: - query = fieldQuery(fieldName, "*" + value + "*").analyzeWildcard(true); + query = queryString("*" + searchText + "*").field(fieldName).analyzeWildcard(true); break; case STARTS_WITH: - query = fieldQuery(fieldName, value + "*").analyzeWildcard(true); + query = queryString(searchText + "*").field(fieldName).analyzeWildcard(true); break; case ENDS_WITH: - query = fieldQuery(fieldName, "*" + value).analyzeWildcard(true); + query = queryString("*" + searchText).field(fieldName).analyzeWildcard(true); break; case EXPRESSION: query = queryString((String) value).field(fieldName); @@ -144,7 +147,7 @@ class CriteriaQueryProcessor { query = boolQuery(); Iterable collection = (Iterable) value; for (Object item : collection) { - ((BoolQueryBuilder) query).should(fieldQuery(fieldName, item)); + ((BoolQueryBuilder) query).should(queryString((String) item).field(fieldName)); } break; } @@ -152,14 +155,6 @@ class CriteriaQueryProcessor { return query; } - private QueryBuilder buildNegationQuery(String fieldName, Iterator it) { - BoolQueryBuilder notQuery = boolQuery(); - while (it.hasNext()) { - notQuery.mustNot(fieldQuery(fieldName, it.next().getValue())); - } - return notQuery; - } - private void addBoost(QueryBuilder query, float boost) { if (Float.isNaN(boost)) { return; diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java index 90f17ea3a..7c78cfa22 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -193,7 +193,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { public List queryForIds(SearchQuery query) { SearchRequestBuilder request = prepareSearch(query).setQuery(query.getQuery()).setNoFields(); if (query.getFilter() != null) { - request.setFilter(query.getFilter()); + request.setPostFilter(query.getFilter()); } SearchResponse response = request.execute().actionGet(); return extractIds(response); @@ -216,7 +216,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { } if (elasticsearchFilter != null) - searchRequestBuilder.setFilter(elasticsearchFilter); + searchRequestBuilder.setPostFilter(elasticsearchFilter); SearchResponse response = searchRequestBuilder .execute().actionGet(); @@ -318,7 +318,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { ImmutableOpenMap mappings = client.admin().cluster().prepareState().execute().actionGet() .getState().metaData().index(index).mappings(); if (mappings.containsKey(type)) { - client.admin().indices().deleteMapping(new DeleteMappingRequest(index).type(type)).actionGet(); + client.admin().indices().deleteMapping(new DeleteMappingRequest(index).types(type)).actionGet(); } } @@ -360,7 +360,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { .setSize(searchQuery.getPageable().getPageSize()); if (searchQuery.getFilter() != null) { - requestBuilder.setFilter(searchQuery.getFilter()); + requestBuilder.setPostFilter(searchQuery.getFilter()); } if (noFields) { @@ -448,7 +448,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { private SearchResponse doSearch(SearchRequestBuilder searchRequest, SearchQuery searchQuery) { if (searchQuery.getFilter() != null) { - searchRequest.setFilter(searchQuery.getFilter()); + searchRequest.setPostFilter(searchQuery.getFilter()); } if (searchQuery.getElasticsearchSort() != null) { @@ -616,9 +616,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { @Override public Set queryForAlias(String indexName) { ClusterStateRequest clusterStateRequest = Requests.clusterStateRequest() - .filterRoutingTable(true) - .filterNodes(true) - .filteredIndices(indexName); + .routingTable(true).nodes(true).indices(indexName); Iterator iterator = client.admin().cluster().state(clusterStateRequest).actionGet().getState().getMetaData().aliases().keysIt(); return newHashSet(iterator); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java index e9a8d90ba..3beefe4b8 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java @@ -53,7 +53,7 @@ public class Criteria { } /** - * Creates a new CriterSimpleFieldia for the Filed with provided name + * Creates a new Criteria with provided field name * * @param fieldname */ @@ -394,14 +394,14 @@ public class Criteria { /** * Creates new CriteriaEntry for bounding box created from points * - * @param topLeftPoint left top corner of bounding box - * @param bottomRightPoint right bottom corner of bounding box + * @param topLeftGeohash left top corner of bounding box as geohash + * @param bottomRightGeohash right bottom corner of bounding box as geohash * @return Criteria the chaind criteria with the new 'boundedBy' criteria included. */ - public Criteria boundedBy(String topLeftPoint, String bottomRightPoint) { - Assert.isTrue(StringUtils.isNotBlank(topLeftPoint), "topLeftPoint must not be empty"); - Assert.isTrue(StringUtils.isNotBlank(bottomRightPoint), "bottomRightPoint must not be empty"); - filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{topLeftPoint, bottomRightPoint})); + public Criteria boundedBy(String topLeftGeohash, String bottomRightGeohash) { + Assert.isTrue(StringUtils.isNotBlank(topLeftGeohash), "topLeftGeohash must not be empty"); + Assert.isTrue(StringUtils.isNotBlank(bottomRightGeohash), "bottomRightGeohash must not be empty"); + filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{topLeftGeohash, bottomRightGeohash})); return this; } diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java b/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java index 02cf21b2c..f1e6fa63e 100644 --- a/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java +++ b/src/main/java/org/springframework/data/elasticsearch/repository/support/AbstractElasticsearchRepository.java @@ -25,7 +25,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import org.elasticsearch.ElasticSearchException; +import org.elasticsearch.ElasticsearchException; import org.elasticsearch.index.query.QueryBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +48,7 @@ import org.springframework.util.Assert; public abstract class AbstractElasticsearchRepository implements ElasticsearchRepository { - static final Logger LOGGER = LoggerFactory.getLogger(AbstractElasticsearchRepository.class); + static final Logger LOGGER = LoggerFactory.getLogger(AbstractElasticsearchRepository.class); protected ElasticsearchOperations elasticsearchOperations; protected Class entityClass; protected ElasticsearchEntityInformation entityInformation; @@ -67,12 +67,12 @@ public abstract class AbstractElasticsearchRepository parents = elasticsearchTemplate.queryForList(new NativeSearchQuery(query), ParentEntity.class); // we're expecting only the first parent as result @@ -97,7 +97,7 @@ public class ElasticsearchTemplateParentChildTests { elasticsearchTemplate.refresh(ChildEntity.class, true); // find all parents that have the first child using topChildren Query - QueryBuilder query = topChildrenQuery(ParentEntity.CHILD_TYPE, QueryBuilders.fieldQuery("name", child1name)); + QueryBuilder query = topChildrenQuery(ParentEntity.CHILD_TYPE, QueryBuilders.termQuery("name", child1name.toLowerCase())); List parents = elasticsearchTemplate.queryForList(new NativeSearchQuery(query), ParentEntity.class); // we're expecting only the first parent as result 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 deb707ac4..223674a26 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -21,11 +21,7 @@ import static org.elasticsearch.index.query.QueryBuilders.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.Map; -import java.util.HashMap; +import java.util.*; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchResponse; @@ -195,7 +191,7 @@ public class ElasticsearchTemplateTests { elasticsearchTemplate.delete(INDEX_NAME, TYPE_NAME, documentId); elasticsearchTemplate.refresh(SampleEntity.class, true); // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); assertThat(sampleEntities.getTotalElements(), equalTo(0L)); } @@ -218,7 +214,7 @@ public class ElasticsearchTemplateTests { elasticsearchTemplate.delete(SampleEntity.class, documentId); elasticsearchTemplate.refresh(SampleEntity.class, true); // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); assertThat(sampleEntities.getTotalElements(), equalTo(0L)); } @@ -239,10 +235,10 @@ public class ElasticsearchTemplateTests { elasticsearchTemplate.index(indexQuery); // when DeleteQuery deleteQuery = new DeleteQuery(); - deleteQuery.setQuery(fieldQuery("id", documentId)); + deleteQuery.setQuery(termQuery("id", documentId)); elasticsearchTemplate.delete(deleteQuery, SampleEntity.class); // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); assertThat(sampleEntities.getTotalElements(), equalTo(0L)); } @@ -415,7 +411,7 @@ public class ElasticsearchTemplateTests { elasticsearchTemplate.index(indexQuery); elasticsearchTemplate.refresh(SampleEntity.class, true); - StringQuery stringQuery = new StringQuery(fieldQuery("id", documentId).toString()); + StringQuery stringQuery = new StringQuery(termQuery("id", documentId).toString()); // when SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(stringQuery, SampleEntity.class); // then @@ -898,12 +894,12 @@ public class ElasticsearchTemplateTests { elasticsearchTemplate.refresh(SampleEntity.class, true); // when DeleteQuery deleteQuery = new DeleteQuery(); - deleteQuery.setQuery(fieldQuery("id", documentId)); + deleteQuery.setQuery(termQuery("id", documentId)); deleteQuery.setIndex(INDEX_NAME); deleteQuery.setType(TYPE_NAME); elasticsearchTemplate.delete(deleteQuery); // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class); assertThat(sampleEntities.getTotalElements(), equalTo(0L)); } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java index d8e6fff4b..34f0c67ec 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java @@ -22,6 +22,7 @@ import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; +import org.elasticsearch.common.geo.GeoHashUtils; import org.elasticsearch.index.query.FilterBuilders; import org.junit.Before; import org.junit.Test; @@ -178,7 +179,7 @@ public class ElasticsearchTemplateGeoTests { public void shouldFindAllMarkersForNativeSearchQuery() { //Given loadAnnotationBaseEntities(); - NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withFilter(FilterBuilders.geoBoundingBoxFilter("additionalLocation").topLeft("52, -1").bottomRight("50,1")); + NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withFilter(FilterBuilders.geoBoundingBoxFilter("additionalLocation").topLeft(52, -1).bottomRight(50, 1)); //When List geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(queryBuilder.build(), AuthorMarkerAnnotatedEntity.class); //Then @@ -202,11 +203,11 @@ public class ElasticsearchTemplateGeoTests { } @Test - public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingString() { + public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeohash() { //given loadClassBaseEntities(); CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery( - new Criteria("location").boundedBy("53.5171d, 0", "49.5171d, 0.2062d")); + new Criteria("location").boundedBy(GeoHashUtils.encode(53.5171d, 0), GeoHashUtils.encode(49.5171d, 0.2062d))); //when List geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, AuthorMarkerEntity.class); diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java index 3e1f947f8..0dd2d8d03 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTests.java @@ -94,10 +94,11 @@ public class CustomMethodRepositoryTests { SampleEntity sampleEntity = new SampleEntity(); sampleEntity.setId(documentId); sampleEntity.setType("test"); - sampleEntity.setMessage("customQuery"); + String searchTerm = "customQuery"; + sampleEntity.setMessage(searchTerm); repository.save(sampleEntity); // when - Page page = repository.findByMessage("customQuery", new PageRequest(0, 10)); + Page page = repository.findByMessage(searchTerm.toLowerCase(), new PageRequest(0, 10)); // then assertThat(page, is(notNullValue())); assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); @@ -418,8 +419,7 @@ public class CustomMethodRepositoryTests { repository.save(sampleEntity); } // when - Page pageResult = repository.findByMessage("message", new PageRequest(0, 23, new Sort(new Sort.Order( - Sort.Direction.ASC, "message")))); + Page pageResult = repository.findByMessage("message", new PageRequest(0, 23)); // then assertThat(pageResult.getTotalElements(), is(equalTo(30L))); assertThat(pageResult.getContent().size(), is(equalTo(23))); diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java index 3999a689f..8c1b59d9c 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleCustomMethodRepository.java @@ -33,10 +33,10 @@ public interface SampleCustomMethodRepository extends ElasticsearchRepository findByTypeNot(String type, Pageable pageable); - @Query("{\"bool\" : {\"must\" : {\"field\" : {\"message\" : \"?0\"}}}}") + @Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}") Page findByMessage(String message, Pageable pageable); - @Query("{\"bool\" : {\"must\" : {\"field\" : {\"message\" : \"?0\"}}}}") + @Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}") List findByMessage(String message); Page findByAvailable(boolean available, Pageable pageable); diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepositoryTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepositoryTests.java index fe83aa266..c1ecfdc73 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepositoryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/support/SimpleElasticsearchRepositoryTests.java @@ -249,7 +249,7 @@ public class SimpleElasticsearchRepositoryTests { // when repository.save(sampleEntities); // then - Page entities = repository.search(fieldQuery("id", documentId), new PageRequest(0, 50)); + Page entities = repository.search(termQuery("id", documentId), new PageRequest(0, 50)); assertNotNull(entities); } @@ -280,7 +280,7 @@ public class SimpleElasticsearchRepositoryTests { sampleEntity.setVersion(System.currentTimeMillis()); repository.save(sampleEntity); // when - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); Page sampleEntities = repository.search(searchQuery); // then assertThat(sampleEntities.getTotalElements(), equalTo(1L)); @@ -308,7 +308,7 @@ public class SimpleElasticsearchRepositoryTests { // when repository.delete(sampleEntity); // then - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("id", documentId)).build(); + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("id", documentId)).build(); Page sampleEntities = repository.search(searchQuery); assertThat(sampleEntities.getTotalElements(), equalTo(0L)); } @@ -331,7 +331,7 @@ public class SimpleElasticsearchRepositoryTests { repository.save(sampleEntity2); // when - Iterable sampleEntities = repository.search(fieldQuery("id", documentId1)); + Iterable sampleEntities = repository.search(termQuery("id", documentId1)); // then assertNotNull("sample entities cant be null..", sampleEntities); } @@ -371,7 +371,7 @@ public class SimpleElasticsearchRepositoryTests { // when repository.index(sampleEntity); // then - Page entities = repository.search(fieldQuery("id", documentId), new PageRequest(0, 50)); + Page entities = repository.search(termQuery("id", documentId), new PageRequest(0, 50)); assertThat(entities.getTotalElements(), equalTo(1L)); } diff --git a/template.mf b/template.mf index f0dac7b43..4e814750b 100644 --- a/template.mf +++ b/template.mf @@ -12,9 +12,9 @@ Import-Template: org.apache.commons.lang.*;version="${commonslang:[=.=.=,+1.0.0)}", com.fasterxml.jackson.*;version="${jackson:[=.=.=,+1.0.0)}";resolution:=optional, org.elasticsearch.*;version="${elasticsearch:[=.=.=,+1.0.0)}", + org.apache.lucene.*;version="4.6.1", org.joda.time.*;version="${jodatime:[=.=.=,+1.0.0)}", org.slf4j.*;version="${slf4j:[=.=.=,+1.0.0)}", org.springframework.*;version="${spring:[=.=.=.=,+1.0.0)}", org.springframework.data.*;version="${springdata.commons:[=.=.=.=,+1.0.0)}", org.w3c.*;version="0.0.0" - \ No newline at end of file