diff --git a/pom.xml b/pom.xml
index 51d100828..b74901c26 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
3.2.1
2.6
- 0.90.0
+ 0.90.2
1.9.2
1.6.0.BUILD-SNAPSHOT
diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java b/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java
index 4073d78bb..ef982b601 100644
--- a/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java
+++ b/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java
@@ -3,5 +3,5 @@ package org.springframework.data.elasticsearch.annotations;
/**
*/
public enum FieldType {
- String, Integer, Long, Date, Object, Auto
+ String, Integer, Long, Date, Float, Double, Boolean, Object, Auto
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java b/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java
index f2868d234..f7a175409 100644
--- a/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java
+++ b/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java
@@ -42,7 +42,6 @@ public class TransportClientFactoryBean implements FactoryBean,
private static final Logger logger = LoggerFactory.getLogger(TransportClientFactoryBean.class);
private String clusterNodes;
private String clusterName;
- private Boolean enableHttp;
private Boolean clientTransportSniff;
private TransportClient client;
private Properties properties;
@@ -102,7 +101,6 @@ public class TransportClientFactoryBean implements FactoryBean,
return settingsBuilder()
.put("cluster.name", clusterName)
.put("client.transport.sniff", clientTransportSniff)
- .put("http.enabled", enableHttp)
.build();
}
@@ -114,10 +112,6 @@ public class TransportClientFactoryBean implements FactoryBean,
this.clusterName = clusterName;
}
- public void setEnableHttp(Boolean enableHttp) {
- this.enableHttp = enableHttp;
- }
-
public void setClientTransportSniff(Boolean clientTransportSniff) {
this.clientTransportSniff = clientTransportSniff;
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java b/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java
index b51b26040..5b0475c40 100644
--- a/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java
+++ b/src/main/java/org/springframework/data/elasticsearch/config/TransportClientBeanDefinitionParser.java
@@ -43,7 +43,6 @@ public class TransportClientBeanDefinitionParser extends AbstractBeanDefinitionP
private void setClusterNodes(Element element, BeanDefinitionBuilder builder) {
builder.addPropertyValue("clusterNodes", element.getAttribute("cluster-nodes"));
builder.addPropertyValue("clusterName", element.getAttribute("cluster-name"));
- builder.addPropertyValue("enableHttp", Boolean.valueOf(element.getAttribute("http-enabled")));
builder.addPropertyValue("clientTransportSniff", Boolean.valueOf(element.getAttribute("client-transport-sniff")));
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java
index 4db37b176..bae6e6848 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java
@@ -15,6 +15,7 @@
*/
package org.springframework.data.elasticsearch.core;
+import org.elasticsearch.action.update.UpdateResponse;
import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
import org.springframework.data.elasticsearch.core.query.*;
@@ -168,6 +169,14 @@ public interface ElasticsearchOperations {
*/
String index(IndexQuery query);
+ /**
+ * Partial update of the document
+ *
+ * @param updateQuery
+ * @return
+ */
+ UpdateResponse update(UpdateQuery updateQuery);
+
/**
* Bulk index all objects. Will do save or update
*
@@ -202,15 +211,30 @@ public interface ElasticsearchOperations {
*/
void delete(DeleteQuery query, Class clazz);
+ /**
+ * Delete all records matching the query
+ *
+ * @param query
+ */
+ void delete(DeleteQuery query);
+
/**
* Deletes an index for given entity
- *
+ *
* @param clazz
* @param
* @return
*/
boolean deleteIndex(Class clazz);
+ /**
+ * Deletes a type in an index
+ *
+ * @param index
+ * @param type
+ */
+ void deleteType(String index, String type);
+
/**
* check if index is exists
*
@@ -220,6 +244,15 @@ public interface ElasticsearchOperations {
*/
boolean indexExists(Class clazz);
+ /**
+ * check if type is exists in an index
+ *
+ * @param index
+ * @param type
+ * @return
+ */
+ boolean typeExists(String index, String type);
+
/**
* refresh the index
*
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 4d6bb04eb..87976af0b 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java
@@ -19,6 +19,7 @@ import org.apache.commons.collections.CollectionUtils;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
+import org.elasticsearch.action.admin.indices.mapping.delete.DeleteMappingRequest;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
@@ -29,6 +30,8 @@ import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.mlt.MoreLikeThisRequestBuilder;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.update.UpdateRequestBuilder;
+import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.Requests;
import org.elasticsearch.common.collect.MapBuilder;
@@ -40,6 +43,7 @@ import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.facet.Facet;
import org.elasticsearch.search.facet.FacetBuilder;
+import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@@ -101,7 +105,6 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
@Override
public boolean createIndex(Class clazz) {
- ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz);
return createIndexIfNotCreated(clazz);
}
@@ -227,6 +230,25 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
return prepareIndex(query).execute().actionGet().getId();
}
+ @Override
+ public UpdateResponse update(UpdateQuery query) {
+ String indexName = isNotBlank(query.getIndexName()) ? query.getIndexName() : getPersistentEntityFor(query.getClazz()).getIndexName();
+ String type = isNotBlank(query.getType()) ? query.getType() : getPersistentEntityFor(query.getClazz()).getIndexType();
+ Assert.notNull(indexName, "No index defined for Query");
+ Assert.notNull(type, "No type define for Query");
+ Assert.notNull(query.getId(), "No Id define for Query");
+ Assert.notNull(query.getIndexRequest(), "No IndexRequest define for Query");
+ UpdateRequestBuilder updateRequestBuilder = client.prepareUpdate(indexName, type, query.getId());
+ if(query.DoUpsert()){
+ updateRequestBuilder.setDocAsUpsert(true)
+ .setUpsertRequest(query.getIndexRequest()).setDoc(query.getIndexRequest());
+ } else {
+ updateRequestBuilder.setDoc(query.getIndexRequest());
+ }
+ return updateRequestBuilder.execute().actionGet();
+ }
+
+
@Override
public void bulkIndex(List queries) {
BulkRequestBuilder bulkRequest = client.prepareBulk();
@@ -251,6 +273,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
return indexExists(getPersistentEntityFor(clazz).getIndexName());
}
+ @Override
+ public boolean typeExists(String index, String type) {
+ return client.admin().cluster().prepareState().execute().actionGet()
+ .getState().metaData().index(index).mappings().containsKey(type);
+ }
+
@Override
public boolean deleteIndex(Class clazz) {
String indexName = getPersistentEntityFor(clazz).getIndexName();
@@ -260,6 +288,15 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
return false;
}
+ @Override
+ public void deleteType(String index, String type){
+ Map 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();
+ }
+ }
+
@Override
public String delete(String indexName, String type, String id) {
return client.prepareDelete(indexName, type, id).execute().actionGet().getId();
@@ -278,6 +315,14 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
.setQuery(deleteQuery.getQuery()).execute().actionGet();
}
+ @Override
+ public void delete(DeleteQuery deleteQuery) {
+ Assert.notNull(deleteQuery.getIndex(), "No index defined for Query");
+ Assert.notNull(deleteQuery.getType(), "No type define for Query");
+ client.prepareDeleteByQuery(deleteQuery.getIndex()).setTypes(deleteQuery.getType())
+ .setQuery(deleteQuery.getQuery()).execute().actionGet();
+ }
+
@Override
public String scan(SearchQuery searchQuery, long scrollTimeInMillis, boolean noFields) {
Assert.notNull(searchQuery.getIndices(), "No index defined for Query");
@@ -388,6 +433,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations {
}
}
+ if(searchQuery.getHighlightFields() != null) {
+ for(HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()){
+ searchRequest.addHighlightedField(highlightField);
+ }
+ }
+
return searchRequest.setQuery(searchQuery.getQuery()).execute().actionGet();
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/FactedPageImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/FactedPageImpl.java
deleted file mode 100644
index cc59ded31..000000000
--- a/src/main/java/org/springframework/data/elasticsearch/core/FactedPageImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.springframework.data.elasticsearch.core;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.springframework.data.domain.PageImpl;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.elasticsearch.core.facet.FacetResult;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Rizwan Idrees
- * @author Mohsin Husen
- * @author Artur Konczak
- * @author Jonathan Yan
- */
-public class FactedPageImpl extends PageImpl implements FacetedPage {
-
- private List facets;
- private Map mapOfFacets;
-
- public FactedPageImpl(List content) {
- super(content);
- }
-
- public FactedPageImpl(List content, Pageable pageable, long total) {
- super(content, pageable, total);
- }
-
- public FactedPageImpl(List content, Pageable pageable, long total, List facets) {
- super(content, pageable, total);
- this.facets = facets;
- for (FacetResult facet : facets) {
- mapOfFacets.put(facet.getName(), facet);
- }
- }
-
- @Override
- public boolean hasFacets() {
- return CollectionUtils.isNotEmpty(facets);
- }
-
- @Override
- public List getFacets() {
- return facets;
- }
-
- @Override
- public FacetResult getFacet(String name) {
- return mapOfFacets.get(name);
- }
-}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java
index 4578c834c..b02c773fc 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/query/DeleteQuery.java
@@ -19,13 +19,15 @@ import org.elasticsearch.index.query.QueryBuilder;
/**
* DeleteQuery
- *
+ *
* @author Rizwan Idrees
* @author Mohsin Husen
*/
public class DeleteQuery {
private QueryBuilder query;
+ private String index;
+ private String type;
public QueryBuilder getQuery() {
return query;
@@ -33,5 +35,21 @@ public class DeleteQuery {
public void setQuery(QueryBuilder query) {
this.query = query;
+ }
+
+ public String getIndex() {
+ return index;
+ }
+
+ public void setIndex(String index) {
+ this.index = index;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
}
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java
index 46f80e264..0b4ca5121 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQuery.java
@@ -17,7 +17,7 @@ package org.springframework.data.elasticsearch.core.query;
import org.elasticsearch.index.query.FilterBuilder;
import org.elasticsearch.index.query.QueryBuilder;
-import org.elasticsearch.search.facet.FacetBuilder;
+import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
@@ -37,6 +37,7 @@ public class NativeSearchQuery extends AbstractQuery implements SearchQuery {
private FilterBuilder filter;
private SortBuilder sort;
private List facets;
+ private HighlightBuilder.Field[] highlightFields;
public NativeSearchQuery(QueryBuilder query) {
@@ -54,6 +55,13 @@ public class NativeSearchQuery extends AbstractQuery implements SearchQuery {
this.sort = sort;
}
+ public NativeSearchQuery(QueryBuilder query, FilterBuilder filter, SortBuilder sort, HighlightBuilder.Field[] highlightFields) {
+ this.query = query;
+ this.filter = filter;
+ this.sort = sort;
+ this.highlightFields = highlightFields;
+ }
+
public QueryBuilder getQuery() {
return query;
}
@@ -64,6 +72,11 @@ public class NativeSearchQuery extends AbstractQuery implements SearchQuery {
public SortBuilder getElasticsearchSort() {
return sort;
+ }
+
+ @Override
+ public HighlightBuilder.Field[] getHighlightFields() {
+ return highlightFields;
}
public void addFacet(FacetRequest facetRequest){
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java
index 6d8e354c4..db667a245 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java
@@ -18,6 +18,7 @@ package org.springframework.data.elasticsearch.core.query;
import org.apache.commons.collections.CollectionUtils;
import org.elasticsearch.index.query.FilterBuilder;
import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
@@ -39,6 +40,7 @@ public class NativeSearchQueryBuilder {
private FilterBuilder filterBuilder;
private SortBuilder sortBuilder;
private List facetRequests = new ArrayList();
+ private HighlightBuilder.Field[] highlightFields;
private Pageable pageable;
private String[] indices;
private String[] types;
@@ -64,6 +66,11 @@ public class NativeSearchQueryBuilder {
return this;
}
+ public NativeSearchQueryBuilder withHighlightFields(HighlightBuilder.Field... highlightFields){
+ this.highlightFields = highlightFields;
+ return this;
+ }
+
public NativeSearchQueryBuilder withPageable(Pageable pageable) {
this.pageable = pageable;
return this;
@@ -85,7 +92,7 @@ public class NativeSearchQueryBuilder {
}
public NativeSearchQuery build() {
- NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilder);
+ NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(queryBuilder, filterBuilder, sortBuilder, highlightFields);
if (pageable != null) {
nativeSearchQuery.setPageable(pageable);
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java
index e625c968a..2d823d720 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/query/SearchQuery.java
@@ -17,6 +17,7 @@ package org.springframework.data.elasticsearch.core.query;
import org.elasticsearch.index.query.FilterBuilder;
import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
@@ -37,4 +38,6 @@ public interface SearchQuery extends Query {
SortBuilder getElasticsearchSort();
List getFacets();
+
+ HighlightBuilder.Field[] getHighlightFields();
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQuery.java b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQuery.java
new file mode 100644
index 000000000..2eca04462
--- /dev/null
+++ b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQuery.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2013 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.elasticsearch.core.query;
+
+import org.elasticsearch.action.index.IndexRequest;
+
+/**
+ * @author Rizwan Idrees
+ * @author Mohsin Husen
+ */
+public class UpdateQuery {
+
+ private String id;
+ private IndexRequest indexRequest;
+ private String indexName;
+ private String type;
+ private Class clazz;
+ private boolean doUpsert;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public IndexRequest getIndexRequest() {
+ return indexRequest;
+ }
+
+ public void setIndexRequest(IndexRequest indexRequest) {
+ this.indexRequest = indexRequest;
+ }
+
+ public String getIndexName() {
+ return indexName;
+ }
+
+ public void setIndexName(String indexName) {
+ this.indexName = indexName;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public Class getClazz() {
+ return clazz;
+ }
+
+ public void setClazz(Class clazz) {
+ this.clazz = clazz;
+ }
+
+ public boolean DoUpsert() {
+ return doUpsert;
+ }
+
+ public void setDoUpsert(boolean doUpsert) {
+ this.doUpsert = doUpsert;
+ }
+}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQueryBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQueryBuilder.java
new file mode 100644
index 000000000..773a645cf
--- /dev/null
+++ b/src/main/java/org/springframework/data/elasticsearch/core/query/UpdateQueryBuilder.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2013 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.elasticsearch.core.query;
+
+import org.elasticsearch.action.index.IndexRequest;
+
+/**
+ * @author Rizwan Idrees
+ * @author Mohsin Husen
+ */
+public class UpdateQueryBuilder {
+
+ private String id;
+ private IndexRequest indexRequest;
+ private String indexName;
+ private String type;
+ private Class clazz;
+ private boolean doUpsert;
+
+ public UpdateQueryBuilder withId(String id){
+ this.id = id;
+ return this;
+ }
+
+ public UpdateQueryBuilder withIndexRequest(IndexRequest indexRequest){
+ this.indexRequest = indexRequest;
+ return this;
+ }
+
+ public UpdateQueryBuilder withIndexName(String indexName){
+ this.indexName = indexName;
+ return this;
+ }
+
+ public UpdateQueryBuilder withType(String type){
+ this.type = type;
+ return this;
+ }
+
+ public UpdateQueryBuilder withClass(Class clazz){
+ this.clazz = clazz;
+ return this;
+ }
+
+ public UpdateQueryBuilder withDoUpsert(boolean doUpsert){
+ this.doUpsert = doUpsert;
+ return this;
+ }
+
+ public UpdateQuery build(){
+ UpdateQuery updateQuery = new UpdateQuery();
+ updateQuery.setId(id);
+ updateQuery.setIndexName(indexName);
+ updateQuery.setType(type);
+ updateQuery.setClazz(clazz);
+ updateQuery.setIndexRequest(indexRequest);
+ updateQuery.setDoUpsert(doUpsert);
+ return updateQuery;
+ }
+}
diff --git a/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd b/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd
index 668aa618a..22b9d2f0f 100644
--- a/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd
+++ b/src/main/resources/org/springframework/data/elasticsearch/config/spring-elasticsearch-1.0.xsd
@@ -84,11 +84,6 @@
-
-
-
-
-
diff --git a/src/test/java/org/springframework/data/elasticsearch/SampleEntity.java b/src/test/java/org/springframework/data/elasticsearch/SampleEntity.java
index dc890d840..aceb9588a 100644
--- a/src/test/java/org/springframework/data/elasticsearch/SampleEntity.java
+++ b/src/test/java/org/springframework/data/elasticsearch/SampleEntity.java
@@ -34,6 +34,7 @@ public class SampleEntity {
private String message;
private int rate;
private boolean available;
+ private String highlightedMessage;
@Version
private Long version;
@@ -77,6 +78,14 @@ public class SampleEntity {
this.available = available;
}
+ public String getHighlightedMessage() {
+ return highlightedMessage;
+ }
+
+ public void setHighlightedMessage(String highlightedMessage) {
+ this.highlightedMessage = highlightedMessage;
+ }
+
public Long getVersion() {
return version;
}
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 06bc93ad1..6cdc46204 100644
--- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java
+++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java
@@ -15,8 +15,11 @@
*/
package org.springframework.data.elasticsearch.core;
+import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.index.engine.DocumentMissingException;
import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Before;
@@ -39,12 +42,9 @@ import java.util.List;
import static org.apache.commons.lang.RandomStringUtils.randomNumeric;
import static org.elasticsearch.index.query.FilterBuilders.boolFilter;
import static org.elasticsearch.index.query.FilterBuilders.termFilter;
-import static org.elasticsearch.index.query.QueryBuilders.fieldQuery;
-import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.*;
/**
* @author Rizwan Idrees
@@ -717,4 +717,164 @@ public class ElasticsearchTemplateTests {
// then
assertThat(elasticsearchTemplate.indexExists(clazz), is(false));
}
+
+ @Test
+ public void shouldDoPartialUpdateForExistingDocument() {
+ //given
+ String documentId = randomNumeric(5);
+ String messageBeforeUpdate = "some test message";
+ String messageAfterUpdate = "test message";
+
+ SampleEntity sampleEntity = new SampleEntity();
+ sampleEntity.setId(documentId);
+ sampleEntity.setMessage(messageBeforeUpdate);
+ sampleEntity.setVersion(System.currentTimeMillis());
+
+ IndexQuery indexQuery = new IndexQuery();
+ indexQuery.setId(documentId);
+ indexQuery.setObject(sampleEntity);
+
+ elasticsearchTemplate.index(indexQuery);
+ elasticsearchTemplate.refresh(SampleEntity.class, true);
+
+ IndexRequest indexRequest = new IndexRequest();
+ indexRequest.source("message", messageAfterUpdate);
+ UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId)
+ .withClass(SampleEntity.class).withIndexRequest(indexRequest).build();
+ // when
+ elasticsearchTemplate.update(updateQuery);
+ //then
+ GetQuery getQuery = new GetQuery();
+ getQuery.setId(documentId);
+ SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class);
+ assertThat(indexedEntity.getMessage(), is(messageAfterUpdate));
+ }
+
+ @Test(expected = DocumentMissingException.class)
+ public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate(){
+ // when
+ IndexRequest indexRequest = new IndexRequest();
+ UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5))
+ .withClass(SampleEntity.class).withIndexRequest(indexRequest).build();
+ elasticsearchTemplate.update(updateQuery);
+ }
+
+ @Test
+ public void shouldDoUpsertIfDocumentDoesNotExist(){
+ //given
+ String documentId = randomNumeric(5);
+ String message = "test message";
+ IndexRequest indexRequest = new IndexRequest();
+ indexRequest.source("message", message);
+ UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId)
+ .withDoUpsert(true).withClass(SampleEntity.class)
+ .withIndexRequest(indexRequest).build();
+ //when
+ elasticsearchTemplate.update(updateQuery);
+ //then
+ GetQuery getQuery = new GetQuery();
+ getQuery.setId(documentId);
+ SampleEntity indexedEntity = elasticsearchTemplate.queryForObject(getQuery, SampleEntity.class);
+ assertThat(indexedEntity.getMessage(), is(message));
+ }
+
+ @Test
+ public void shouldReturnHighlightedFieldsForGivenQueryAndFields(){
+
+ //given
+ String documentId = randomNumeric(5);
+ String actualMessage = "some test message";
+ String highlightedMessage = "some test message";
+
+ SampleEntity sampleEntity = new SampleEntity();
+ sampleEntity.setId(documentId);
+ sampleEntity.setMessage(actualMessage);
+ sampleEntity.setVersion(System.currentTimeMillis());
+
+ IndexQuery indexQuery = new IndexQuery();
+ indexQuery.setId(documentId);
+ indexQuery.setObject(sampleEntity);
+
+ elasticsearchTemplate.index(indexQuery);
+ elasticsearchTemplate.refresh(SampleEntity.class, true);
+
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withQuery(termQuery("message", "test"))
+ .withHighlightFields(new HighlightBuilder.Field("message"))
+ .build();
+
+ Page sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, new ResultsMapper() {
+ @Override
+ public FacetedPage mapResults(SearchResponse response) {
+ List chunk = new ArrayList();
+ for (SearchHit searchHit : response.getHits()) {
+ if (response.getHits().getHits().length <= 0) {
+ return null;
+ }
+ SampleEntity user = new SampleEntity();
+ user.setId(searchHit.getId());
+ user.setMessage((String) searchHit.getSource().get("message"));
+ user.setHighlightedMessage(searchHit.getHighlightFields().get("message").fragments()[0].toString());
+ chunk.add(user);
+ }
+ if(chunk.size() > 0){
+ return new FacetedPageImpl(chunk);
+ }
+ return null;
+ }
+ });
+
+ assertThat(sampleEntities.getContent().get(0).getHighlightedMessage(), is(highlightedMessage));
+
+ }
+
+ @Test
+ public void shouldDeleteSpecifiedTypeFromAnIndex() {
+ // given
+ String documentId = randomNumeric(5);
+ SampleEntity sampleEntity = new SampleEntity();
+ sampleEntity.setId(documentId);
+ sampleEntity.setMessage("some message");
+ sampleEntity.setVersion(System.currentTimeMillis());
+
+ IndexQuery indexQuery = new IndexQuery();
+ indexQuery.setId(documentId);
+ indexQuery.setObject(sampleEntity);
+
+ elasticsearchTemplate.index(indexQuery);
+
+ // when
+ elasticsearchTemplate.deleteType("test-index","test-type");
+
+ //then
+ boolean typeExists = elasticsearchTemplate.typeExists("test-index", "test-type");
+ assertThat(typeExists, is(false));
+ }
+
+ @Test
+ public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery(){
+ // given
+ String documentId = randomNumeric(5);
+ SampleEntity sampleEntity = new SampleEntity();
+ sampleEntity.setId(documentId);
+ sampleEntity.setMessage("some message");
+ sampleEntity.setVersion(System.currentTimeMillis());
+
+ IndexQuery indexQuery = new IndexQuery();
+ indexQuery.setId(documentId);
+ indexQuery.setObject(sampleEntity);
+
+ elasticsearchTemplate.index(indexQuery);
+ // when
+ DeleteQuery deleteQuery = new DeleteQuery();
+ deleteQuery.setQuery(fieldQuery("id", documentId));
+ deleteQuery.setIndex("test-index");
+ deleteQuery.setType("test-type");
+ elasticsearchTemplate.delete(deleteQuery);
+ // then
+ SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fieldQuery("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/facet/ArticleEntity.java b/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java
index 77847b317..6d6c1df1d 100644
--- a/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java
+++ b/src/test/java/org/springframework/data/elasticsearch/core/facet/ArticleEntity.java
@@ -14,7 +14,7 @@ import static org.springframework.data.elasticsearch.annotations.FieldType.Strin
/**
* Simple type to test facets
*/
-@Document(indexName = "articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1")
+@Document(indexName = "articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1", indexStoreType = "memory")
public class ArticleEntity {
@Id
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 d2222b158..1d22b4bfc 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
@@ -77,7 +77,7 @@ public class ElasticsearchTemplateGeoTests {
double[] latLonArray = {0.100000, 51.000000};
String lonLatString = "51.000000, 0.100000";
String geohash = "u1044k2bd6u";
- indexQueries.add(new AuthorMarkerAnnotatedEntityBuilder("2").name("Mohsin Husen").location(geohash.substring(3)).additionalLocation(latLonArray).buildIndex());
+ indexQueries.add(new AuthorMarkerAnnotatedEntityBuilder("2").name("Mohsin Husen").location(geohash.substring(0,5)).additionalLocation(latLonArray).buildIndex());
indexQueries.add(new AuthorMarkerAnnotatedEntityBuilder("1").name("Artur Konczak").location(lonLatString).additionalLocation(latLonArray).buildIndex());
indexQueries.add(new AuthorMarkerAnnotatedEntityBuilder("3").name("Rizwan Idrees").location(geohash).additionalLocation(latLonArray).buildIndex());
@@ -132,9 +132,7 @@ public class ElasticsearchTemplateGeoTests {
List geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, AuthorMarkerAnnotatedEntity.class);
//then
- assertThat(geoAuthorsForGeoCriteria.size(), is(1));
- //TODO: result should be 3 not 1 - geohash points don't work
- assertEquals("Artur Konczak", geoAuthorsForGeoCriteria.get(0).getName());
+ assertThat(geoAuthorsForGeoCriteria.size(), is(3));
}
@Test