DATAES-54 - upgraded to elasticsearch 1.0

This commit is contained in:
Artur Konczak 2014-02-16 21:44:36 +00:00
parent ea50046f45
commit 1352c9f45b
12 changed files with 54 additions and 64 deletions

View File

@ -24,7 +24,7 @@
<commonscollections>3.2.1</commonscollections>
<commonslang>2.6</commonslang>
<elasticsearch>0.90.11</elasticsearch>
<elasticsearch>1.0.0</elasticsearch>
<springdata.commons>1.7.0.RC1</springdata.commons>
</properties>

View File

@ -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<Object> collection = (Iterable<Object>) 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<Criteria.CriteriaEntry> 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;

View File

@ -193,7 +193,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
public <T> List<String> 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<String, MappingMetaData> 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<String> queryForAlias(String indexName) {
ClusterStateRequest clusterStateRequest = Requests.clusterStateRequest()
.filterRoutingTable(true)
.filterNodes(true)
.filteredIndices(indexName);
.routingTable(true).nodes(true).indices(indexName);
Iterator<String> iterator = client.admin().cluster().state(clusterStateRequest).actionGet().getState().getMetaData().aliases().keysIt();
return newHashSet(iterator);
}

View File

@ -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;
}

View File

@ -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<T, ID extends Serializable> implements
ElasticsearchRepository<T, ID> {
static final Logger LOGGER = LoggerFactory.getLogger(AbstractElasticsearchRepository.class);
static final Logger LOGGER = LoggerFactory.getLogger(AbstractElasticsearchRepository.class);
protected ElasticsearchOperations elasticsearchOperations;
protected Class<T> entityClass;
protected ElasticsearchEntityInformation<T, ID> entityInformation;
@ -67,12 +67,12 @@ public abstract class AbstractElasticsearchRepository<T, ID extends Serializable
Assert.notNull(metadata);
this.entityInformation = metadata;
setEntityClass(this.entityInformation.getJavaType());
try {
try {
createIndex();
putMapping();
} catch (ElasticSearchException exception) {
LOGGER.error("failed to load elasticsearch nodes : " + exception.getDetailedMessage());
}
} catch (ElasticsearchException exception) {
LOGGER.error("failed to load elasticsearch nodes : " + exception.getDetailedMessage());
}
}
private void createIndex() {

View File

@ -75,7 +75,7 @@ public class ElasticsearchTemplateParentChildTests {
elasticsearchTemplate.refresh(ChildEntity.class, true);
// find all parents that have the first child
QueryBuilder query = hasChildQuery(ParentEntity.CHILD_TYPE, QueryBuilders.fieldQuery("name", child1name));
QueryBuilder query = hasChildQuery(ParentEntity.CHILD_TYPE, QueryBuilders.termQuery("name", child1name.toLowerCase()));
List<ParentEntity> 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<ParentEntity> parents = elasticsearchTemplate.queryForList(new NativeSearchQuery(query), ParentEntity.class);
// we're expecting only the first parent as result

View File

@ -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<SampleEntity> 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<SampleEntity> 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<SampleEntity> 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<SampleEntity> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SampleEntity.class);
assertThat(sampleEntities.getTotalElements(), equalTo(0L));
}

View File

@ -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<AuthorMarkerAnnotatedEntity> 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<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, AuthorMarkerEntity.class);

View File

@ -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<SampleEntity> page = repository.findByMessage("customQuery", new PageRequest(0, 10));
Page<SampleEntity> 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<SampleEntity> pageResult = repository.findByMessage("message", new PageRequest(0, 23, new Sort(new Sort.Order(
Sort.Direction.ASC, "message"))));
Page<SampleEntity> pageResult = repository.findByMessage("message", new PageRequest(0, 23));
// then
assertThat(pageResult.getTotalElements(), is(equalTo(30L)));
assertThat(pageResult.getContent().size(), is(equalTo(23)));

View File

@ -33,10 +33,10 @@ public interface SampleCustomMethodRepository extends ElasticsearchRepository<Sa
Page<SampleEntity> findByTypeNot(String type, Pageable pageable);
@Query("{\"bool\" : {\"must\" : {\"field\" : {\"message\" : \"?0\"}}}}")
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
Page<SampleEntity> findByMessage(String message, Pageable pageable);
@Query("{\"bool\" : {\"must\" : {\"field\" : {\"message\" : \"?0\"}}}}")
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
List<SampleEntity> findByMessage(String message);
Page<SampleEntity> findByAvailable(boolean available, Pageable pageable);

View File

@ -249,7 +249,7 @@ public class SimpleElasticsearchRepositoryTests {
// when
repository.save(sampleEntities);
// then
Page<SampleEntity> entities = repository.search(fieldQuery("id", documentId), new PageRequest(0, 50));
Page<SampleEntity> 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<SampleEntity> 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<SampleEntity> sampleEntities = repository.search(searchQuery);
assertThat(sampleEntities.getTotalElements(), equalTo(0L));
}
@ -331,7 +331,7 @@ public class SimpleElasticsearchRepositoryTests {
repository.save(sampleEntity2);
// when
Iterable<SampleEntity> sampleEntities = repository.search(fieldQuery("id", documentId1));
Iterable<SampleEntity> 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<SampleEntity> entities = repository.search(fieldQuery("id", documentId), new PageRequest(0, 50));
Page<SampleEntity> entities = repository.search(termQuery("id", documentId), new PageRequest(0, 50));
assertThat(entities.getTotalElements(), equalTo(1L));
}

View File

@ -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"