diff --git a/.gitignore b/.gitignore
index 20068080e..2b6ba3019 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,9 +6,6 @@ atlassian-ide-plugin.xml
## ignore any target dir
target
-##ignore only top level data dir - local node data files for unit tests
-/data
-
## Ignore project files created by Eclipse
.settings
.project
diff --git a/pom.xml b/pom.xml
index 882c72d0d..23cf15a6f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,7 +19,7 @@
3.2.1
2.6
- 2.4.0
+ 5.2.1
2.0.0.BUILD-SNAPSHOT
@@ -70,6 +70,30 @@
${elasticsearch}
+
+ org.elasticsearch.client
+ transport
+ ${elasticsearch}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+
+ org.slf4j
+ log4j-over-slf4j
+ 1.7.22
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.6.2
+
+
com.fasterxml.jackson.core
@@ -96,6 +120,12 @@
org.springframework
spring-test
test
+
+
+ ch.qos.logback
+ logback-classic
+
+
org.apache.openwebbeans.test
@@ -120,6 +150,13 @@
test
+
+ org.elasticsearch.plugin
+ transport-netty4-client
+ ${elasticsearch}
+
+
+
org.projectlombok
lombok
@@ -127,6 +164,8 @@
test
+
+
diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/CompletionField.java b/src/main/java/org/springframework/data/elasticsearch/annotations/CompletionField.java
index 4d8418fcf..7176d23b1 100644
--- a/src/main/java/org/springframework/data/elasticsearch/annotations/CompletionField.java
+++ b/src/main/java/org/springframework/data/elasticsearch/annotations/CompletionField.java
@@ -32,8 +32,6 @@ public @interface CompletionField {
String analyzer() default "simple";
- boolean payloads() default false;
-
boolean preserveSeparators() default true;
boolean preservePositionIncrements() default true;
diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/Field.java b/src/main/java/org/springframework/data/elasticsearch/annotations/Field.java
index 29dcdf2f1..380ae0cad 100644
--- a/src/main/java/org/springframework/data/elasticsearch/annotations/Field.java
+++ b/src/main/java/org/springframework/data/elasticsearch/annotations/Field.java
@@ -38,7 +38,7 @@ public @interface Field {
FieldType type() default FieldType.Auto;
- FieldIndex index() default FieldIndex.analyzed;
+ boolean index() default true;
DateFormat format() default DateFormat.none;
@@ -46,6 +46,8 @@ public @interface Field {
boolean store() default false;
+ boolean fielddata() default false;
+
String searchAnalyzer() default "";
String analyzer() default "";
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 1916e93ef..ceaa6ce94 100644
--- a/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java
+++ b/src/main/java/org/springframework/data/elasticsearch/annotations/FieldType.java
@@ -21,5 +21,5 @@ package org.springframework.data.elasticsearch.annotations;
* @author Artur Konczak
*/
public enum FieldType {
- String, Integer, Long, Date, Float, Double, Boolean, Object, Auto, Nested, Ip, Attachment
+ text, Integer, Long, Date, Float, Double, Boolean, Object, Auto, Nested, Ip, Attachment, keyword
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/GeoPointField.java b/src/main/java/org/springframework/data/elasticsearch/annotations/GeoPointField.java
index f38263da3..bdb8025bb 100644
--- a/src/main/java/org/springframework/data/elasticsearch/annotations/GeoPointField.java
+++ b/src/main/java/org/springframework/data/elasticsearch/annotations/GeoPointField.java
@@ -25,8 +25,4 @@ import java.lang.annotation.*;
@Documented
public @interface GeoPointField {
- boolean geoHashPrefix() default false;
-
- String geoHashPrecision() default "0";
-
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/annotations/InnerField.java b/src/main/java/org/springframework/data/elasticsearch/annotations/InnerField.java
index cae53e834..ee850d8fe 100644
--- a/src/main/java/org/springframework/data/elasticsearch/annotations/InnerField.java
+++ b/src/main/java/org/springframework/data/elasticsearch/annotations/InnerField.java
@@ -31,10 +31,12 @@ public @interface InnerField {
FieldType type();
- FieldIndex index() default FieldIndex.analyzed;
+ boolean index() default true;
boolean store() default false;
+ boolean fielddata() default false;
+
String searchAnalyzer() default "";
String indexAnalyzer() default "";
diff --git a/src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java b/src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java
index fc8dd2597..b17c748f5 100644
--- a/src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java
+++ b/src/main/java/org/springframework/data/elasticsearch/client/NodeClientFactoryBean.java
@@ -1,127 +1,144 @@
-/*
- * Copyright 2015 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.client;
-
-import static org.elasticsearch.node.NodeBuilder.*;
-
-import java.io.InputStream;
-import org.apache.commons.lang.StringUtils;
-import org.elasticsearch.client.Client;
-import org.elasticsearch.client.node.NodeClient;
-import org.elasticsearch.common.settings.Settings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.InitializingBean;
-
-/**
- * NodeClientFactoryBean
- *
- * @author Rizwan Idrees
- * @author Mohsin Husen
- */
-
-public class NodeClientFactoryBean implements FactoryBean, InitializingBean, DisposableBean {
-
- private static final Logger logger = LoggerFactory.getLogger(NodeClientFactoryBean.class);
- private boolean local;
- private boolean enableHttp;
- private String clusterName;
- private NodeClient nodeClient;
- private String pathData;
- private String pathHome;
- private String pathConfiguration;
-
- NodeClientFactoryBean() {
- }
-
- public NodeClientFactoryBean(boolean local) {
- this.local = local;
- }
-
- @Override
- public NodeClient getObject() throws Exception {
- return nodeClient;
- }
-
- @Override
- public Class extends Client> getObjectType() {
- return NodeClient.class;
- }
-
- @Override
- public boolean isSingleton() {
- return true;
- }
-
- @Override
- public void afterPropertiesSet() throws Exception {
- nodeClient = (NodeClient) nodeBuilder().settings(Settings.builder().put(loadConfig())
- .put("http.enabled", String.valueOf(this.enableHttp))
- .put("path.home", this.pathHome)
- .put("path.data", this.pathData))
- .clusterName(this.clusterName).local(this.local).node()
- .client();
- }
-
- private Settings loadConfig() {
- if (StringUtils.isNotBlank(pathConfiguration)) {
- InputStream stream = getClass().getClassLoader().getResourceAsStream(pathConfiguration);
- if (stream != null) {
- return Settings.builder().loadFromStream(pathConfiguration, getClass().getClassLoader().getResourceAsStream(pathConfiguration)).build();
- }
- logger.error(String.format("Unable to read node configuration from file [%s]", pathConfiguration));
- }
- return Settings.builder().build();
- }
-
- public void setLocal(boolean local) {
- this.local = local;
- }
-
- public void setEnableHttp(boolean enableHttp) {
- this.enableHttp = enableHttp;
- }
-
- public void setClusterName(String clusterName) {
- this.clusterName = clusterName;
- }
-
- public void setPathData(String pathData) {
- this.pathData = pathData;
- }
-
- public void setPathHome(String pathHome) {
- this.pathHome = pathHome;
- }
-
- public void setPathConfiguration(String configuration) {
- this.pathConfiguration = configuration;
- }
-
- @Override
- public void destroy() throws Exception {
- try {
- logger.info("Closing elasticSearch client");
- if (nodeClient != null) {
- nodeClient.close();
- }
- } catch (final Exception e) {
- logger.error("Error closing ElasticSearch client: ", e);
- }
- }
-}
+/*
+ * Copyright 2015-2017 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.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import org.apache.commons.lang.StringUtils;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.client.node.NodeClient;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.node.Node;
+import org.elasticsearch.node.internal.InternalSettingsPreparer;
+import org.elasticsearch.plugins.Plugin;
+import org.elasticsearch.transport.Netty4Plugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.InitializingBean;
+import static java.util.Arrays.*;
+
+/**
+ * NodeClientFactoryBean
+ *
+ * @author Rizwan Idrees
+ * @author Mohsin Husen
+ */
+
+public class NodeClientFactoryBean implements FactoryBean, InitializingBean, DisposableBean {
+
+ private static final Logger logger = LoggerFactory.getLogger(NodeClientFactoryBean.class);
+ private boolean local;
+ private boolean enableHttp;
+ private String clusterName;
+ private NodeClient nodeClient;
+ private String pathData;
+ private String pathHome;
+ private String pathConfiguration;
+
+ public static class TestNode extends Node {
+ public TestNode(Settings preparedSettings, Collection> classpathPlugins) {
+ super(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), classpathPlugins);
+ }
+ }
+
+ NodeClientFactoryBean() {
+ }
+
+ public NodeClientFactoryBean(boolean local) {
+ this.local = local;
+ }
+
+ @Override
+ public NodeClient getObject() throws Exception {
+ return nodeClient;
+ }
+
+ @Override
+ public Class extends Client> getObjectType() {
+ return NodeClient.class;
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return true;
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+
+ nodeClient = (NodeClient) new TestNode(
+ Settings.builder().put(loadConfig())
+ .put("transport.type", "netty4")
+ .put("transport.type", "local")
+ .put("http.type", "netty4")
+ .put("path.home", this.pathHome)
+ .put("path.data", this.pathData)
+ .put("cluster.name", this.clusterName)
+ .put("node.max_local_storage_nodes", 100)
+ .put("script.inline", "true")
+ .build(), asList(Netty4Plugin.class)).start().client();
+ }
+
+ private Settings loadConfig() throws IOException {
+ if (StringUtils.isNotBlank(pathConfiguration)) {
+ InputStream stream = getClass().getClassLoader().getResourceAsStream(pathConfiguration);
+ if (stream != null) {
+ return Settings.builder().loadFromStream(pathConfiguration, getClass().getClassLoader().getResourceAsStream(pathConfiguration)).build();
+ }
+ logger.error(String.format("Unable to read node configuration from file [%s]", pathConfiguration));
+ }
+ return Settings.builder().build();
+ }
+
+ public void setLocal(boolean local) {
+ this.local = local;
+ }
+
+ public void setEnableHttp(boolean enableHttp) {
+ this.enableHttp = enableHttp;
+ }
+
+ public void setClusterName(String clusterName) {
+ this.clusterName = clusterName;
+ }
+
+ public void setPathData(String pathData) {
+ this.pathData = pathData;
+ }
+
+ public void setPathHome(String pathHome) {
+ this.pathHome = pathHome;
+ }
+
+ public void setPathConfiguration(String configuration) {
+ this.pathConfiguration = configuration;
+ }
+
+ @Override
+ public void destroy() throws Exception {
+ try {
+ logger.info("Closing elasticSearch client");
+ if (nodeClient != null) {
+ nodeClient.close();
+ }
+ } catch (final Exception e) {
+ logger.error("Error closing ElasticSearch client: ", e);
+ }
+ }
+}
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 881d0f8f9..b008bf63d 100644
--- a/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java
+++ b/src/main/java/org/springframework/data/elasticsearch/client/TransportClientFactoryBean.java
@@ -23,6 +23,7 @@ import java.util.Properties;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
+import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
@@ -86,7 +87,8 @@ public class TransportClientFactoryBean implements FactoryBean,
}
protected void buildClient() throws Exception {
- client = TransportClient.builder().settings(settings()).build();
+
+ client = new PreBuiltTransportClient(settings());
Assert.hasText(clusterNodes, "[Assertion failed] clusterNodes settings missing.");
for (String clusterNode : split(clusterNodes, COMMA)) {
String hostName = substringBeforeLast(clusterNode, COLON);
diff --git a/src/main/java/org/springframework/data/elasticsearch/config/NodeClientBeanDefinitionParser.java b/src/main/java/org/springframework/data/elasticsearch/config/NodeClientBeanDefinitionParser.java
index b2878040d..96cad2e1d 100644
--- a/src/main/java/org/springframework/data/elasticsearch/config/NodeClientBeanDefinitionParser.java
+++ b/src/main/java/org/springframework/data/elasticsearch/config/NodeClientBeanDefinitionParser.java
@@ -1,57 +1,57 @@
-/*
- * Copyright 2015 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.config;
-
-import org.springframework.beans.factory.support.AbstractBeanDefinition;
-import org.springframework.beans.factory.support.BeanDefinitionBuilder;
-import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
-import org.springframework.beans.factory.xml.ParserContext;
-import org.springframework.data.elasticsearch.client.NodeClientFactoryBean;
-import org.w3c.dom.Element;
-
-/**
- * NodeClientBeanDefinitionParser
- *
- * @author Rizwan Idrees
- * @author Mohsin Husen
- */
-
-public class NodeClientBeanDefinitionParser extends AbstractBeanDefinitionParser {
-
- @Override
- protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
- BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(NodeClientFactoryBean.class);
- setLocalSettings(element, builder);
- return getSourcedBeanDefinition(builder, element, parserContext);
- }
-
- private void setLocalSettings(Element element, BeanDefinitionBuilder builder) {
- builder.addPropertyValue("local", Boolean.valueOf(element.getAttribute("local")));
- builder.addPropertyValue("clusterName", element.getAttribute("cluster-name"));
- builder.addPropertyValue("enableHttp", Boolean.valueOf(element.getAttribute("http-enabled")));
- builder.addPropertyValue("pathData", element.getAttribute("path-data"));
- builder.addPropertyValue("pathHome", element.getAttribute("path-home"));
- builder.addPropertyValue("pathConfiguration", element.getAttribute("path-configuration"));
- }
-
- private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source,
- ParserContext context) {
- AbstractBeanDefinition definition = builder.getBeanDefinition();
- definition.setSource(context.extractSource(source));
- return definition;
- }
-}
+/*
+ * Copyright 2015 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.config;
+
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.springframework.data.elasticsearch.client.NodeClientFactoryBean;
+import org.w3c.dom.Element;
+
+/**
+ * NodeClientBeanDefinitionParser
+ *
+ * @author Rizwan Idrees
+ * @author Mohsin Husen
+ */
+
+public class NodeClientBeanDefinitionParser extends AbstractBeanDefinitionParser {
+
+ @Override
+ protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
+ BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(NodeClientFactoryBean.class);
+ setLocalSettings(element, builder);
+ return getSourcedBeanDefinition(builder, element, parserContext);
+ }
+
+ private void setLocalSettings(Element element, BeanDefinitionBuilder builder) {
+ builder.addPropertyValue("local", Boolean.valueOf(element.getAttribute("local")));
+ builder.addPropertyValue("clusterName", element.getAttribute("cluster-name"));
+ builder.addPropertyValue("enableHttp", Boolean.valueOf(element.getAttribute("http-enabled")));
+ builder.addPropertyValue("pathData", element.getAttribute("path-data"));
+ builder.addPropertyValue("pathHome", element.getAttribute("path-home"));
+ builder.addPropertyValue("pathConfiguration", element.getAttribute("path-configuration"));
+ }
+
+ private AbstractBeanDefinition getSourcedBeanDefinition(BeanDefinitionBuilder builder, Element source,
+ ParserContext context) {
+ AbstractBeanDefinition definition = builder.getBeanDefinition();
+ definition.setSource(context.extractSource(source));
+ return definition;
+ }
+}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaFilterProcessor.java b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaFilterProcessor.java
index 5efa974f8..971d6a403 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaFilterProcessor.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaFilterProcessor.java
@@ -116,8 +116,8 @@ class CriteriaFilterProcessor {
Object[] valArray = (Object[]) value;
Assert.noNullElements(valArray, "Geo distance filter takes 2 not null elements array as parameter.");
Assert.isTrue(valArray.length == 2, "Geo distance filter takes a 2-elements array as parameter.");
- Assert.isTrue(valArray[0] instanceof GeoPoint || valArray[0] instanceof String || valArray[0] instanceof Point, "First element of a geo distance filter must be a GeoPoint, a Point or a String");
- Assert.isTrue(valArray[1] instanceof String || valArray[1] instanceof Distance, "Second element of a geo distance filter must be a String or a Distance");
+ Assert.isTrue(valArray[0] instanceof GeoPoint || valArray[0] instanceof String || valArray[0] instanceof Point, "First element of a geo distance filter must be a GeoPoint, a Point or a text");
+ Assert.isTrue(valArray[1] instanceof String || valArray[1] instanceof Distance, "Second element of a geo distance filter must be a text or a Distance");
StringBuilder dist = new StringBuilder();
@@ -129,15 +129,15 @@ class CriteriaFilterProcessor {
if (valArray[0] instanceof GeoPoint) {
GeoPoint loc = (GeoPoint) valArray[0];
- geoDistanceQueryBuilder.lat(loc.getLat()).lon(loc.getLon()).distance(dist.toString()).geoDistance(GeoDistance.PLANE);
+ geoDistanceQueryBuilder.point(loc.getLat(),loc.getLon()).distance(dist.toString()).geoDistance(GeoDistance.PLANE);
} else if (valArray[0] instanceof Point) {
GeoPoint loc = GeoPoint.fromPoint((Point) valArray[0]);
- geoDistanceQueryBuilder.lat(loc.getLat()).lon(loc.getLon()).distance(dist.toString()).geoDistance(GeoDistance.PLANE);
+ geoDistanceQueryBuilder.point(loc.getLat(), loc.getLon()).distance(dist.toString()).geoDistance(GeoDistance.PLANE);
} else {
String loc = (String) valArray[0];
if (loc.contains(",")) {
String c[] = loc.split(",");
- geoDistanceQueryBuilder.lat(Double.parseDouble(c[0])).lon(Double.parseDouble(c[1])).distance(dist.toString()).geoDistance(GeoDistance.PLANE);
+ geoDistanceQueryBuilder.point(Double.parseDouble(c[0]), Double.parseDouble(c[1])).distance(dist.toString()).geoDistance(GeoDistance.PLANE);
} else {
geoDistanceQueryBuilder.geohash(loc).distance(dist.toString()).geoDistance(GeoDistance.PLANE);
}
@@ -159,7 +159,7 @@ class CriteriaFilterProcessor {
oneParameterBBox((GeoBoundingBoxQueryBuilder) filter, valArray[0]);
} else if (valArray.length == 2) {
//2x GeoPoint
- //2x String
+ //2x text
twoParameterBBox((GeoBoundingBoxQueryBuilder) filter, valArray);
} else {
//error
@@ -206,8 +206,7 @@ class CriteriaFilterProcessor {
geoBBox = (GeoBox) value;
}
- filter.topLeft(geoBBox.getTopLeft().getLat(), geoBBox.getTopLeft().getLon());
- filter.bottomRight(geoBBox.getBottomRight().getLat(), geoBBox.getBottomRight().getLon());
+ filter.setCorners(geoBBox.getTopLeft().getLat(), geoBBox.getTopLeft().getLon(), geoBBox.getBottomRight().getLat(), geoBBox.getBottomRight().getLon());
}
private static boolean isType(Object[] array, Class clazz) {
@@ -220,17 +219,15 @@ class CriteriaFilterProcessor {
}
private void twoParameterBBox(GeoBoundingBoxQueryBuilder filter, Object[] values) {
- Assert.isTrue(isType(values, GeoPoint.class) || isType(values, String.class), " both elements of boundedBy filter must be type of GeoPoint or String(format lat,lon or geohash)");
+ Assert.isTrue(isType(values, GeoPoint.class) || isType(values, String.class), " both elements of boundedBy filter must be type of GeoPoint or text(format lat,lon or geohash)");
if (values[0] instanceof GeoPoint) {
GeoPoint topLeft = (GeoPoint) values[0];
GeoPoint bottomRight = (GeoPoint) values[1];
- filter.topLeft(topLeft.getLat(), topLeft.getLon());
- filter.bottomRight(bottomRight.getLat(), bottomRight.getLon());
+ filter.setCorners(topLeft.getLat(), topLeft.getLon(), bottomRight.getLat(), bottomRight.getLon());
} else {
String topLeft = (String) values[0];
String bottomRight = (String) values[1];
- filter.topLeft(topLeft);
- filter.bottomRight(bottomRight);
+ filter.setCorners(topLeft, bottomRight);
}
}
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 1d743aba2..3bb735a83 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java
@@ -15,6 +15,7 @@
*/
package org.springframework.data.elasticsearch.core;
+import static org.elasticsearch.index.query.Operator.AND;
import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.springframework.data.elasticsearch.core.query.Criteria.*;
@@ -24,10 +25,7 @@ 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;
-import org.elasticsearch.index.query.QueryStringQueryBuilder;
+import org.elasticsearch.index.query.*;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.util.Assert;
@@ -148,7 +146,7 @@ class CriteriaQueryProcessor {
switch (key) {
case EQUALS:
- query = queryStringQuery(searchText).field(fieldName).defaultOperator(QueryStringQueryBuilder.Operator.AND);
+ query = queryStringQuery(searchText).field(fieldName).defaultOperator(AND);
break;
case CONTAINS:
query = queryStringQuery("*" + searchText + "*").field(fieldName).analyzeWildcard(true);
@@ -203,8 +201,6 @@ class CriteriaQueryProcessor {
if (Float.isNaN(boost)) {
return;
}
- if (query instanceof BoostableQueryBuilder) {
- ((BoostableQueryBuilder) query).boost(boost);
- }
+ query.boost(boost);
}
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java
index d64216906..d19f4637d 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/DefaultResultMapper.java
@@ -94,7 +94,7 @@ public class DefaultResultMapper extends AbstractResultMapper {
}
}
- return new AggregatedPageImpl<>(results, pageable, totalHits, response.getAggregations());
+ return new AggregatedPageImpl(results, pageable, totalHits, response.getAggregations(), response.getScrollId());
}
private void populateScriptFields(T result, SearchHit hit) {
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 26a1dda34..dd877e8fd 100755
--- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchOperations.java
@@ -18,6 +18,7 @@ package org.springframework.data.elasticsearch.core;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.cluster.metadata.AliasMetaData;
+import org.elasticsearch.common.Nullable;
import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
@@ -480,79 +481,52 @@ public interface ElasticsearchOperations {
void refresh(Class clazz);
/**
- * Returns scroll id for criteria query
- *
- * @param query The criteria query.
- * @param scrollTimeInMillis The time in millisecond for scroll feature
- * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}.
- * @param noFields The no fields support
- * {@link org.elasticsearch.action.search.SearchRequestBuilder#setNoFields()}.
- * @return The scan id for input query.
- */
- String scan(CriteriaQuery query, long scrollTimeInMillis, boolean noFields);
-
- /**
- * Returns scroll id for criteria query
- *
- * @param query The criteria query.
- * @param scrollTimeInMillis The time in millisecond for scroll feature
- * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}.
- * @param noFields The no fields support
- * {@link org.elasticsearch.action.search.SearchRequestBuilder#setNoFields()}.
- * @param clazz The class of entity to retrieve.
- * @param The type of entity to retrieve.
- * @return The scan id for input query.
- */
- String scan(CriteriaQuery query, long scrollTimeInMillis, boolean noFields, Class clazz);
-
- /**
- * Returns scroll id for scan query
+ * Returns scrolled page for given query
*
* @param query The search query.
* @param scrollTimeInMillis The time in millisecond for scroll feature
* {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}.
- * @param noFields The no fields support
- * {@link org.elasticsearch.action.search.SearchRequestBuilder#setNoFields()}.
+ * @param clazz The class of entity to retrieve.
* @return The scan id for input query.
*/
- String scan(SearchQuery query, long scrollTimeInMillis, boolean noFields);
+ Page startScroll(long scrollTimeInMillis, SearchQuery query, Class clazz);
/**
- * Returns scroll id for scan query
+ * Returns scrolled page for given query
*
* @param query The search query.
* @param scrollTimeInMillis The time in millisecond for scroll feature
* {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}.
- * @param noFields The no fields support
- * {@link org.elasticsearch.action.search.SearchRequestBuilder#setNoFields()}.
- * @param clazz The class of entity to retrieve.
- * @param The type of entity to retrieve.
+ * @param mapper Custom impl to map result to entities
* @return The scan id for input query.
*/
- String scan(SearchQuery query, long scrollTimeInMillis, boolean noFields, Class clazz);
+ Page startScroll(long scrollTimeInMillis, SearchQuery query, Class clazz, SearchResultMapper mapper);
/**
- * Scrolls the results for give scroll id
+ * Returns scrolled page for given query
*
- * @param scrollId
- * @param scrollTimeInMillis
- * @param clazz
- * @param
- * @return
+ * @param criteriaQuery The search query.
+ * @param scrollTimeInMillis The time in millisecond for scroll feature
+ * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}.
+ * @param clazz The class of entity to retrieve.
+ * @return The scan id for input query.
*/
- Page scroll(String scrollId, long scrollTimeInMillis, Class clazz);
+ Page startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz);
/**
- * Scrolls the results for give scroll id using custom result mapper
+ * Returns scrolled page for given query
*
- * @param scrollId
- * @param scrollTimeInMillis
- * @param mapper
- * @param
- * @return
+ * @param criteriaQuery The search query.
+ * @param scrollTimeInMillis The time in millisecond for scroll feature
+ * {@link org.elasticsearch.action.search.SearchRequestBuilder#setScroll(org.elasticsearch.common.unit.TimeValue)}.
+ * @param mapper Custom impl to map result to entities
+ * @return The scan id for input query.
*/
- Page scroll(String scrollId, long scrollTimeInMillis, SearchResultMapper mapper);
+ Page startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz, SearchResultMapper mapper);
+
+ Page continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz);
+ Page continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz, SearchResultMapper mapper);
/**
* Clears the search contexts associated with specified scroll ids.
*
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 8a8872e49..84138fa99 100755
--- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java
@@ -15,19 +15,11 @@
*/
package org.springframework.data.elasticsearch.core;
-import static org.apache.commons.lang.StringUtils.*;
-import static org.elasticsearch.action.search.SearchType.*;
-import static org.elasticsearch.client.Requests.*;
-import static org.elasticsearch.cluster.metadata.AliasAction.Type.*;
-import static org.elasticsearch.index.VersionType.*;
-import static org.elasticsearch.index.query.QueryBuilders.*;
-import static org.springframework.data.elasticsearch.core.MappingBuilder.*;
-import static org.springframework.util.CollectionUtils.isEmpty;
-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
@@ -35,8 +27,8 @@ import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Optional;
-
import org.elasticsearch.action.ListenableActionFuture;
+import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
@@ -46,7 +38,6 @@ import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequest;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
-import org.elasticsearch.action.count.CountRequestBuilder;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetRequest;
import org.elasticsearch.action.get.MultiGetRequestBuilder;
@@ -54,15 +45,12 @@ import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
-import org.elasticsearch.action.search.SearchType;
-import org.elasticsearch.action.suggest.SuggestRequestBuilder;
-import org.elasticsearch.action.suggest.SuggestResponse;
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.cluster.metadata.AliasAction;
import org.elasticsearch.cluster.metadata.AliasMetaData;
+import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.collect.MapBuilder;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
@@ -71,7 +59,7 @@ import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
-import org.elasticsearch.search.highlight.HighlightBuilder;
+import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.search.suggest.SuggestBuilder;
@@ -100,6 +88,12 @@ import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMa
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.data.util.CloseableIterator;
import org.springframework.util.Assert;
+import static org.apache.commons.lang.StringUtils.*;
+import static org.elasticsearch.client.Requests.*;
+import static org.elasticsearch.index.VersionType.*;
+import static org.elasticsearch.index.query.QueryBuilders.*;
+import static org.springframework.data.elasticsearch.core.MappingBuilder.*;
+import static org.springframework.util.CollectionUtils.isEmpty;
/**
* ElasticsearchTemplate
@@ -315,7 +309,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
@Override
public List queryForIds(SearchQuery query) {
- SearchRequestBuilder request = prepareSearch(query).setQuery(query.getQuery()).setNoFields();
+ SearchRequestBuilder request = prepareSearch(query).setQuery(query.getQuery());
if (query.getFilter() != null) {
request.setPostFilter(query.getFilter());
}
@@ -357,15 +351,14 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
@Override
public Page queryForPage(StringQuery query, Class clazz, SearchResultMapper mapper) {
- SearchResponse response = getSearchResponse(prepareSearch(query, clazz).setQuery(query.getSource()).execute());
+ SearchResponse response = getSearchResponse(prepareSearch(query, clazz).setQuery(wrapperQuery(query.getSource())).execute());
return mapper.mapResults(response, clazz, query.getPageable());
}
@Override
public CloseableIterator stream(CriteriaQuery query, Class clazz) {
final long scrollTimeInMillis = TimeValue.timeValueMinutes(1).millis();
- final String initScrollId = scan(query, scrollTimeInMillis, false, clazz);
- return doStream(initScrollId, scrollTimeInMillis, clazz, resultsMapper);
+ return doStream(scrollTimeInMillis, (ScrolledPage) startScroll(scrollTimeInMillis, query, clazz), clazz, resultsMapper);
}
@Override
@@ -376,29 +369,27 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
@Override
public CloseableIterator stream(SearchQuery query, final Class clazz, final SearchResultMapper mapper) {
final long scrollTimeInMillis = TimeValue.timeValueMinutes(1).millis();
- final String initScrollId = scan(query, scrollTimeInMillis, false, clazz);
- return doStream(initScrollId, scrollTimeInMillis, clazz, mapper);
+ return doStream(scrollTimeInMillis, (ScrolledPage) startScroll(scrollTimeInMillis, query, clazz, mapper), clazz, mapper);
}
- private CloseableIterator doStream(final String initScrollId, final long scrollTimeInMillis,
- final Class clazz, final SearchResultMapper mapper) {
+ private CloseableIterator doStream(final long scrollTimeInMillis, final ScrolledPage page, final Class clazz, final SearchResultMapper mapper) {
return new CloseableIterator() {
/** As we couldn't retrieve single result with scroll, store current hits. */
- private volatile Iterator currentHits;
+ private volatile Iterator currentHits = page.iterator();
/** The scroll id. */
- private volatile String scrollId = initScrollId;
+ private volatile String scrollId = page.getScrollId();
/** If stream is finished (ie: cluster returns no results. */
- private volatile boolean finished;
+ private volatile boolean finished = !currentHits.hasNext();
@Override
public void close() {
try {
// Clear scroll on cluster only in case of error (cause elasticsearch auto clear scroll when it's done)
if (!finished && scrollId != null && currentHits != null && currentHits.hasNext()) {
- client.prepareClearScroll().addScrollId(scrollId).execute().actionGet();
+ clearScroll(scrollId);
}
} finally {
currentHits = null;
@@ -415,12 +406,11 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
// Test if it remains hits
if (currentHits == null || !currentHits.hasNext()) {
// Do a new request
- SearchResponse response = getSearchResponse(
- client.prepareSearchScroll(scrollId).setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).execute());
+ final ScrolledPage scroll = (ScrolledPage) continueScroll(scrollId, scrollTimeInMillis, clazz, mapper);
// Save hits and scroll id
- currentHits = mapper.mapResults(response, clazz, Pageable.unpaged()).iterator();
+ currentHits = scroll.iterator();
finished = !currentHits.hasNext();
- scrollId = response.getScrollId();
+ scrollId = scroll.getScrollId();
}
return currentHits.hasNext();
}
@@ -477,11 +467,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
return count(query, null);
}
- private long doCount(CountRequestBuilder countRequestBuilder, QueryBuilder elasticsearchQuery) {
+ private long doCount(SearchRequestBuilder countRequestBuilder, QueryBuilder elasticsearchQuery) {
+
if (elasticsearchQuery != null) {
countRequestBuilder.setQuery(elasticsearchQuery);
}
- return countRequestBuilder.execute().actionGet().getCount();
+ return countRequestBuilder.execute().actionGet().getHits().getTotalHits();
}
private long doCount(SearchRequestBuilder searchRequestBuilder, QueryBuilder elasticsearchQuery,
@@ -494,11 +485,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
if (elasticsearchFilter != null) {
searchRequestBuilder.setPostFilter(elasticsearchFilter);
}
- searchRequestBuilder.setSearchType(SearchType.COUNT);
return searchRequestBuilder.execute().actionGet().getHits().getTotalHits();
}
- private CountRequestBuilder prepareCount(Query query, Class clazz) {
+ private SearchRequestBuilder prepareCount(Query query, Class clazz) {
String indexName[] = !isEmpty(query.getIndices())
? query.getIndices().toArray(new String[query.getIndices().size()])
: retrieveIndexNameFromPersistentEntity(clazz);
@@ -507,11 +497,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
Assert.notNull(indexName, "No index defined for Query");
- CountRequestBuilder countRequestBuilder = client.prepareCount(indexName);
+ SearchRequestBuilder countRequestBuilder = client.prepareSearch(indexName);
if (types != null) {
countRequestBuilder.setTypes(types);
}
+ countRequestBuilder.setSize(0);
return countRequestBuilder;
}
@@ -533,6 +524,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
MultiGetRequestBuilder builder = client.prepareMultiGet();
+ if (searchQuery.getFields() != null && !searchQuery.getFields().isEmpty()) {
+ searchQuery.addSourceFilter(new FetchSourceFilter(toArray(searchQuery.getFields()), null));
+ }
+
for (String id : searchQuery.getIds()) {
MultiGetRequest.Item item = new MultiGetRequest.Item(indexName, type, id);
@@ -541,9 +536,6 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
item = item.routing(searchQuery.getRoute());
}
- if (searchQuery.getFields() != null && !searchQuery.getFields().isEmpty()) {
- item = item.fields(toArray(searchQuery.getFields()));
- }
builder.add(item);
}
return builder.execute().actionGet();
@@ -602,18 +594,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
for (IndexQuery query : queries) {
bulkRequest.add(prepareIndex(query));
}
- BulkResponse bulkResponse = bulkRequest.execute().actionGet();
- if (bulkResponse.hasFailures()) {
- Map failedDocuments = new HashMap<>();
- for (BulkItemResponse item : bulkResponse.getItems()) {
- if (item.isFailed())
- failedDocuments.put(item.getId(), item.getFailureMessage());
- }
- throw new ElasticsearchException(
- "Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages ["
- + failedDocuments + "]",
- failedDocuments);
- }
+ checkForBulkUpdateFailure(bulkRequest.execute().actionGet());
}
@Override
@@ -622,7 +603,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
for (UpdateQuery query : queries) {
bulkRequest.add(prepareUpdate(query));
}
- BulkResponse bulkResponse = bulkRequest.execute().actionGet();
+ checkForBulkUpdateFailure(bulkRequest.execute().actionGet());
+ }
+
+ private void checkForBulkUpdateFailure(BulkResponse bulkResponse) {
if (bulkResponse.hasFailures()) {
Map failedDocuments = new HashMap<>();
for (BulkItemResponse item : bulkResponse.getItems()) {
@@ -691,32 +675,29 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(deleteQuery.getQuery()).withIndices(indexName)
.withTypes(typeName).withPageable(PageRequest.of(0, pageSize)).build();
- String scrollId = scan(searchQuery, scrollTimeInMillis, true);
-
- BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
- List ids = new ArrayList<>();
- boolean hasRecords = true;
- while (hasRecords) {
- Page page = scroll(scrollId, scrollTimeInMillis, new SearchResultMapper() {
- @Override
- public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) {
- List result = new ArrayList<>();
- for (SearchHit searchHit : response.getHits()) {
- String id = searchHit.getId();
- result.add(id);
- }
- if (result.size() > 0) {
- return new AggregatedPageImpl<>((List) result);
- }
- return null;
+ SearchResultMapper onlyIdResultMapper = new SearchResultMapper() {
+ @Override
+ public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) {
+ List result = new ArrayList();
+ for (SearchHit searchHit : response.getHits().getHits()) {
+ String id = searchHit.getId();
+ result.add(id);
}
- });
- if (page != null && page.getContent().size() > 0) {
- ids.addAll(page.getContent());
- } else {
- hasRecords = false;
+ if (result.size() > 0) {
+ return new AggregatedPageImpl((List) result, response.getScrollId());
+ }
+ return new AggregatedPageImpl(Collections.EMPTY_LIST, response.getScrollId());
}
- }
+ };
+
+ Page scrolledResult = startScroll(scrollTimeInMillis, searchQuery, String.class, onlyIdResultMapper);
+ BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
+ List ids = new ArrayList();
+
+ do {
+ ids.addAll(scrolledResult.getContent());
+ scrolledResult = continueScroll(((ScrolledPage)scrolledResult).getScrollId(), scrollTimeInMillis, String.class, onlyIdResultMapper);
+ } while(scrolledResult.getContent().size() != 0);
for (String id : ids) {
bulkRequestBuilder.add(client.prepareDelete(indexName, typeName, id));
@@ -726,7 +707,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
bulkRequestBuilder.execute().actionGet();
}
- clearScroll(scrollId);
+ clearScroll(((ScrolledPage) scrolledResult).getScrollId());
}
@Override
@@ -745,33 +726,13 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
delete(deleteQuery, clazz);
}
- @Override
- public String scan(CriteriaQuery criteriaQuery, long scrollTimeInMillis, boolean noFields) {
- return doScan(prepareScan(criteriaQuery, scrollTimeInMillis, noFields), criteriaQuery);
- }
-
- @Override
- public String scan(CriteriaQuery criteriaQuery, long scrollTimeInMillis, boolean noFields, Class clazz) {
- return doScan(prepareScan(criteriaQuery, scrollTimeInMillis, noFields, clazz), criteriaQuery);
- }
-
- @Override
- public String scan(SearchQuery searchQuery, long scrollTimeInMillis, boolean noFields) {
- return doScan(prepareScan(searchQuery, scrollTimeInMillis, noFields), searchQuery);
- }
-
- @Override
- public String scan(SearchQuery searchQuery, long scrollTimeInMillis, boolean noFields, Class clazz) {
- return doScan(prepareScan(searchQuery, scrollTimeInMillis, noFields, clazz), searchQuery);
- }
-
- private SearchRequestBuilder prepareScan(Query query, long scrollTimeInMillis, boolean noFields, Class clazz) {
+ private SearchRequestBuilder prepareScroll(Query query, long scrollTimeInMillis, Class clazz) {
setPersistentEntityIndexAndType(query, clazz);
- return prepareScan(query, scrollTimeInMillis, noFields);
+ return prepareScroll(query, scrollTimeInMillis);
}
- private SearchRequestBuilder prepareScan(Query query, long scrollTimeInMillis, boolean noFields) {
- SearchRequestBuilder requestBuilder = client.prepareSearch(toArray(query.getIndices())).setSearchType(SCAN)
+ private SearchRequestBuilder prepareScroll(Query query, long scrollTimeInMillis) {
+ SearchRequestBuilder requestBuilder = client.prepareSearch(toArray(query.getIndices()))
.setTypes(toArray(query.getTypes())).setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).setFrom(0);
if(query.getPageable().isPaged()){
@@ -779,16 +740,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
}
if (!isEmpty(query.getFields())) {
- requestBuilder.addFields(toArray(query.getFields()));
- }
-
- if (noFields) {
- requestBuilder.setNoFields();
+ requestBuilder.setFetchSource(toArray(query.getFields()), null);
}
return requestBuilder;
}
- private String doScan(SearchRequestBuilder requestBuilder, CriteriaQuery criteriaQuery) {
+ private SearchResponse doScroll(SearchRequestBuilder requestBuilder, CriteriaQuery criteriaQuery) {
Assert.notNull(criteriaQuery.getIndices(), "No index defined for Query");
Assert.notNull(criteriaQuery.getTypes(), "No type define for Query");
Assert.notNull(criteriaQuery.getPageable(), "Query.pageable is required for scan & scroll");
@@ -807,10 +764,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
requestBuilder.setPostFilter(elasticsearchFilter);
}
- return getSearchResponse(requestBuilder.execute()).getScrollId();
+ return getSearchResponse(requestBuilder.execute());
}
- private String doScan(SearchRequestBuilder requestBuilder, SearchQuery searchQuery) {
+ private SearchResponse doScroll(SearchRequestBuilder requestBuilder, SearchQuery searchQuery) {
Assert.notNull(searchQuery.getIndices(), "No index defined for Query");
Assert.notNull(searchQuery.getTypes(), "No type define for Query");
Assert.notNull(searchQuery.getPageable(), "Query.pageable is required for scan & scroll");
@@ -819,21 +776,39 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
requestBuilder.setPostFilter(searchQuery.getFilter());
}
- return getSearchResponse(requestBuilder.setQuery(searchQuery.getQuery()).execute()).getScrollId();
+ return getSearchResponse(requestBuilder.setQuery(searchQuery.getQuery()).execute());
}
- @Override
- public Page scroll(String scrollId, long scrollTimeInMillis, Class clazz) {
- SearchResponse response = getSearchResponse(
- client.prepareSearchScroll(scrollId).setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).execute());
+ public Page startScroll(long scrollTimeInMillis, SearchQuery searchQuery, Class clazz) {
+ SearchResponse response = doScroll(prepareScroll(searchQuery, scrollTimeInMillis, clazz), searchQuery);
+ return resultsMapper.mapResults(response, clazz, null);
+ }
+
+ public Page startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz) {
+ SearchResponse response = doScroll(prepareScroll(criteriaQuery, scrollTimeInMillis, clazz), criteriaQuery);
+ return resultsMapper.mapResults(response, clazz, null);
+ }
+
+ public Page startScroll(long scrollTimeInMillis, SearchQuery searchQuery, Class clazz, SearchResultMapper mapper) {
+ SearchResponse response = doScroll(prepareScroll(searchQuery, scrollTimeInMillis, clazz), searchQuery);
+ return mapper.mapResults(response, clazz, null);
+ }
+
+ public Page startScroll(long scrollTimeInMillis, CriteriaQuery criteriaQuery, Class clazz, SearchResultMapper mapper) {
+ SearchResponse response = doScroll(prepareScroll(criteriaQuery, scrollTimeInMillis, clazz), criteriaQuery);
+ return mapper.mapResults(response, clazz, null);
+ }
+
+ public Page continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz) {
+ SearchResponse response = getSearchResponse(client.prepareSearchScroll(scrollId)
+ .setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).execute());
return resultsMapper.mapResults(response, clazz, Pageable.unpaged());
}
- @Override
- public Page scroll(String scrollId, long scrollTimeInMillis, SearchResultMapper mapper) {
- SearchResponse response = getSearchResponse(
- client.prepareSearchScroll(scrollId).setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).execute());
- return mapper.mapResults(response, null, Pageable.unpaged());
+ public Page continueScroll(@Nullable String scrollId, long scrollTimeInMillis, Class clazz, SearchResultMapper mapper) {
+ SearchResponse response = getSearchResponse(client.prepareSearchScroll(scrollId)
+ .setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)).execute());
+ return mapper.mapResults(response, clazz, Pageable.unpaged());
}
@Override
@@ -852,8 +827,8 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
Assert.notNull(type, "No 'type' defined for MoreLikeThisQuery");
Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery");
- MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = moreLikeThisQuery()
- .addLikeItem(new MoreLikeThisQueryBuilder.Item(indexName, type, query.getId()));
+
+ MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = moreLikeThisQuery(toArray(new MoreLikeThisQueryBuilder.Item(indexName, type, query.getId())));
if (query.getMinTermFreq() != null) {
moreLikeThisQueryBuilder.minTermFreq(query.getMinTermFreq());
@@ -895,7 +870,8 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
}
if (!searchQuery.getScriptFields().isEmpty()) {
- searchRequest.addField("_source");
+ //_source should be return all the time
+ //searchRequest.addStoredField("_source");
for (ScriptField scriptedField : searchQuery.getScriptFields()) {
searchRequest.addScriptField(scriptedField.fieldName(), scriptedField.script());
}
@@ -903,7 +879,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
if (searchQuery.getHighlightFields() != null) {
for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) {
- searchRequest.addHighlightedField(highlightField);
+ searchRequest.highlighter(new HighlightBuilder().field(highlightField));
}
}
@@ -1016,7 +992,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
searchRequestBuilder.setFrom(startRecord);
if (!query.getFields().isEmpty()) {
- searchRequestBuilder.addFields(toArray(query.getFields()));
+ searchRequestBuilder.setFetchSource(toArray(query.getFields()),null);
}
if (query.getSort() != null) {
@@ -1086,7 +1062,8 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
public Boolean addAlias(AliasQuery query) {
Assert.notNull(query.getIndexName(), "No index defined for Alias");
Assert.notNull(query.getAliasName(), "No alias defined");
- AliasAction aliasAction = new AliasAction(ADD, query.getIndexName(), query.getAliasName());
+ final IndicesAliasesRequest.AliasActions aliasAction = IndicesAliasesRequest.AliasActions.add().alias(query.getAliasName()).index(query.getIndexName());
+
if (query.getFilterBuilder() != null) {
aliasAction.filter(query.getFilterBuilder());
} else if (query.getFilter() != null) {
@@ -1135,7 +1112,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
ElasticsearchPersistentEntity> persistentEntity = getPersistentEntityFor(entity.getClass());
Optional idProperty = persistentEntity.getIdProperty();
- // Only deal with String because ES generated Ids are strings !
+ // Only deal with text because ES generated Ids are strings !
idProperty.ifPresent(property -> {
@@ -1190,6 +1167,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
return values.toArray(valuesAsArray);
}
+ private static MoreLikeThisQueryBuilder.Item[] toArray(MoreLikeThisQueryBuilder.Item... values) {
+ return values;
+ }
+
protected ResultsMapper getResultsMapper() {
return resultsMapper;
}
@@ -1224,13 +1205,11 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
return stringBuilder.toString();
}
- public SuggestResponse suggest(SuggestBuilder.SuggestionBuilder> suggestion, String... indices) {
- SuggestRequestBuilder suggestRequestBuilder = client.prepareSuggest(indices);
- suggestRequestBuilder.addSuggestion(suggestion);
- return suggestRequestBuilder.execute().actionGet();
+ public SearchResponse suggest(SuggestBuilder suggestion, String... indices) {
+ return client.prepareSearch(indices).suggest(suggestion).get();
}
- public SuggestResponse suggest(SuggestBuilder.SuggestionBuilder> suggestion, Class clazz) {
+ public SearchResponse suggest(SuggestBuilder suggestion, Class clazz) {
return suggest(suggestion, retrieveIndexNameFromPersistentEntity(clazz));
}
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java
index c0c20ba62..7cc2bb572 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/FacetedPageImpl.java
@@ -54,7 +54,7 @@ public abstract class FacetedPageImpl extends PageImpl implements FacetedP
}
public FacetedPageImpl(List content, Pageable pageable, long total) {
- super(content, pageable, total);
+ super(content, Pageable.unpaged(), total);
}
@Override
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java
index 0f37add0a..27c73afca 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java
@@ -51,6 +51,7 @@ import org.springframework.data.util.TypeInformation;
*/
class MappingBuilder {
+ public static final String FIELD_DATA = "fielddata";
public static final String FIELD_STORE = "store";
public static final String FIELD_TYPE = "type";
public static final String FIELD_INDEX = "index";
@@ -60,13 +61,12 @@ class MappingBuilder {
public static final String FIELD_PROPERTIES = "properties";
public static final String FIELD_PARENT = "_parent";
- public static final String COMPLETION_PAYLOADS = "payloads";
public static final String COMPLETION_PRESERVE_SEPARATORS = "preserve_separators";
public static final String COMPLETION_PRESERVE_POSITION_INCREMENTS = "preserve_position_increments";
public static final String COMPLETION_MAX_INPUT_LENGTH = "max_input_length";
public static final String INDEX_VALUE_NOT_ANALYZED = "not_analyzed";
- public static final String TYPE_VALUE_STRING = "string";
+ public static final String TYPE_VALUE_STRING = "text";
public static final String TYPE_VALUE_GEO_POINT = "geo_point";
public static final String TYPE_VALUE_COMPLETION = "completion";
public static final String TYPE_VALUE_GEO_HASH_PREFIX = "geohash_prefix";
@@ -192,18 +192,18 @@ class MappingBuilder {
xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_GEO_POINT);
GeoPointField annotation = field.getAnnotation(GeoPointField.class);
- if (annotation != null) {
- if (annotation.geoHashPrefix()) {
- xContentBuilder.field(TYPE_VALUE_GEO_HASH_PREFIX, true);
- if (StringUtils.isNotEmpty(annotation.geoHashPrecision())) {
- if (NumberUtils.isNumber(annotation.geoHashPrecision())) {
- xContentBuilder.field(TYPE_VALUE_GEO_HASH_PRECISION, Integer.parseInt(annotation.geoHashPrecision()));
- } else {
- xContentBuilder.field(TYPE_VALUE_GEO_HASH_PRECISION, annotation.geoHashPrecision());
- }
- }
- }
- }
+// if (annotation != null) {
+// if (annotation.geoHashPrefix()) {
+// xContentBuilder.field(TYPE_VALUE_GEO_HASH_PREFIX, true);
+// if (StringUtils.isNotEmpty(annotation.geoHashPrecision())) {
+// if (NumberUtils.isNumber(annotation.geoHashPrecision())) {
+// xContentBuilder.field(TYPE_VALUE_GEO_HASH_PRECISION, Integer.parseInt(annotation.geoHashPrecision()));
+// } else {
+// xContentBuilder.field(TYPE_VALUE_GEO_HASH_PRECISION, annotation.geoHashPrecision());
+// }
+// }
+// }
+// }
xContentBuilder.endObject();
}
@@ -213,7 +213,6 @@ class MappingBuilder {
xContentBuilder.field(FIELD_TYPE, TYPE_VALUE_COMPLETION);
if (annotation != null) {
xContentBuilder.field(COMPLETION_MAX_INPUT_LENGTH, annotation.maxInputLength());
- xContentBuilder.field(COMPLETION_PAYLOADS, annotation.payloads());
xContentBuilder.field(COMPLETION_PRESERVE_POSITION_INCREMENTS, annotation.preservePositionIncrements());
xContentBuilder.field(COMPLETION_PRESERVE_SEPARATORS, annotation.preserveSeparators());
if (isNotBlank(annotation.searchAnalyzer())) {
@@ -245,6 +244,10 @@ class MappingBuilder {
if(!nestedOrObjectField) {
xContentBuilder.field(FIELD_STORE, fieldAnnotation.store());
}
+ if(fieldAnnotation.fielddata()) {
+ xContentBuilder.field(FIELD_DATA, fieldAnnotation.fielddata());
+ }
+
if (FieldType.Auto != fieldAnnotation.type()) {
xContentBuilder.field(FIELD_TYPE, fieldAnnotation.type().name().toLowerCase());
if (FieldType.Date == fieldAnnotation.type() && DateFormat.none != fieldAnnotation.format()) {
@@ -252,8 +255,8 @@ class MappingBuilder {
? fieldAnnotation.pattern() : fieldAnnotation.format());
}
}
- if (FieldIndex.not_analyzed == fieldAnnotation.index() || FieldIndex.no == fieldAnnotation.index()) {
- xContentBuilder.field(FIELD_INDEX, fieldAnnotation.index().name().toLowerCase());
+ if(!fieldAnnotation.index()) {
+ xContentBuilder.field(FIELD_INDEX, fieldAnnotation.index());
}
if (isNotBlank(fieldAnnotation.searchAnalyzer())) {
xContentBuilder.field(FIELD_SEARCH_ANALYZER, fieldAnnotation.searchAnalyzer());
@@ -276,8 +279,8 @@ class MappingBuilder {
if (FieldType.Auto != annotation.type()) {
builder.field(FIELD_TYPE, annotation.type().name().toLowerCase());
}
- if (FieldIndex.not_analyzed == annotation.index()) {
- builder.field(FIELD_INDEX, annotation.index().name().toLowerCase());
+ if(!annotation.index()) {
+ builder.field(FIELD_INDEX, annotation.index());
}
if (isNotBlank(annotation.searchAnalyzer())) {
builder.field(FIELD_SEARCH_ANALYZER, annotation.searchAnalyzer());
@@ -285,6 +288,9 @@ class MappingBuilder {
if (isNotBlank(annotation.indexAnalyzer())) {
builder.field(FIELD_INDEX_ANALYZER, annotation.indexAnalyzer());
}
+ if (annotation.fielddata()) {
+ builder.field(FIELD_DATA, annotation.fielddata());
+ }
builder.endObject();
}
@@ -296,10 +302,10 @@ class MappingBuilder {
private static void addMultiFieldMapping(XContentBuilder builder, java.lang.reflect.Field field,
MultiField annotation, boolean nestedOrObjectField) throws IOException {
builder.startObject(field.getName());
- builder.field(FIELD_TYPE, "multi_field");
+ builder.field(FIELD_TYPE, annotation.mainField().type());
builder.startObject("fields");
//add standard field
- addSingleFieldMapping(builder, field, annotation.mainField(),nestedOrObjectField);
+ //addSingleFieldMapping(builder, field, annotation.mainField(), nestedOrObjectField);
for (InnerField innerField : annotation.otherFields()) {
addNestedFieldMapping(builder, field, innerField);
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ScrolledPage.java b/src/main/java/org/springframework/data/elasticsearch/core/ScrolledPage.java
new file mode 100644
index 000000000..65577a757
--- /dev/null
+++ b/src/main/java/org/springframework/data/elasticsearch/core/ScrolledPage.java
@@ -0,0 +1,13 @@
+
+package org.springframework.data.elasticsearch.core;
+
+import org.springframework.data.domain.Page;
+
+/**
+ * @author Artur Konczak
+ */
+public interface ScrolledPage extends Page {
+
+ String getScrollId();
+
+}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/aggregation/AggregatedPage.java b/src/main/java/org/springframework/data/elasticsearch/core/aggregation/AggregatedPage.java
index 77a8c740e..0e446e145 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/aggregation/AggregatedPage.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/aggregation/AggregatedPage.java
@@ -3,11 +3,12 @@ package org.springframework.data.elasticsearch.core.aggregation;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.Aggregations;
import org.springframework.data.elasticsearch.core.FacetedPage;
+import org.springframework.data.elasticsearch.core.ScrolledPage;
/**
* @author Petar Tahchiev
*/
-public interface AggregatedPage extends FacetedPage {
+public interface AggregatedPage extends FacetedPage, ScrolledPage {
boolean hasAggregations();
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/aggregation/impl/AggregatedPageImpl.java b/src/main/java/org/springframework/data/elasticsearch/core/aggregation/impl/AggregatedPageImpl.java
index f12bbb046..aeb301c55 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/aggregation/impl/AggregatedPageImpl.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/aggregation/impl/AggregatedPageImpl.java
@@ -34,15 +34,26 @@ public class AggregatedPageImpl extends FacetedPageImpl implements Aggrega
private Aggregations aggregations;
private Map mapOfAggregations = new HashMap<>();
+ private String scrollId;
public AggregatedPageImpl(List content) {
super(content);
}
+ public AggregatedPageImpl(List content, String scrollId) {
+ super(content);
+ this.scrollId = scrollId;
+ }
+
public AggregatedPageImpl(List content, Pageable pageable, long total) {
super(content, pageable, total);
}
+ public AggregatedPageImpl(List content, Pageable pageable, long total, String scrollId) {
+ super(content, pageable, total);
+ this.scrollId = scrollId;
+ }
+
public AggregatedPageImpl(List content, Pageable pageable, long total, Aggregations aggregations) {
super(content, pageable, total);
this.aggregations = aggregations;
@@ -53,6 +64,17 @@ public class AggregatedPageImpl extends FacetedPageImpl implements Aggrega
}
}
+ public AggregatedPageImpl(List content, Pageable pageable, long total, Aggregations aggregations, String scrollId) {
+ super(content, pageable, total);
+ this.aggregations = aggregations;
+ this.scrollId = scrollId;
+ if (aggregations != null) {
+ for (Aggregation aggregation : aggregations) {
+ mapOfAggregations.put(aggregation.getName(), aggregation);
+ }
+ }
+ }
+
@Override
public boolean hasAggregations() {
return aggregations != null && mapOfAggregations.size() > 0;
@@ -67,4 +89,9 @@ public class AggregatedPageImpl extends FacetedPageImpl implements Aggrega
public Aggregation getAggregation(String name) {
return aggregations == null ? null : aggregations.get(name);
}
+
+ @Override
+ public String getScrollId() {
+ return scrollId;
+ }
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/completion/Completion.java b/src/main/java/org/springframework/data/elasticsearch/core/completion/Completion.java
index 0b8d08024..1378aaba7 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/completion/Completion.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/completion/Completion.java
@@ -11,9 +11,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
public class Completion {
private String[] input;
- private String output;
private Integer weight;
- private Object payload;
private Completion() {
//required by mapper to instantiate object
@@ -31,22 +29,6 @@ public class Completion {
this.input = input;
}
- public String getOutput() {
- return output;
- }
-
- public void setOutput(String output) {
- this.output = output;
- }
-
- public Object getPayload() {
- return payload;
- }
-
- public void setPayload(Object payload) {
- this.payload = payload;
- }
-
public Integer getWeight() {
return weight;
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java
index 1923041b7..6ba538155 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/HistogramFacetRequest.java
@@ -19,7 +19,7 @@ package org.springframework.data.elasticsearch.core.facet.request;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
-import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramBuilder;
+import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest;
import org.springframework.util.Assert;
@@ -57,16 +57,16 @@ public class HistogramFacetRequest extends AbstractFacetRequest {
Assert.isTrue(StringUtils.isNotBlank(field), "Please select field on which to build the facet !!!");
Assert.isTrue(interval > 0, "Please provide interval as positive value greater them zero !!!");
- DateHistogramBuilder dateHistogramBuilder = AggregationBuilders.dateHistogram(getName());
+ DateHistogramAggregationBuilder dateHistogramBuilder = AggregationBuilders.dateHistogram(getName());
dateHistogramBuilder.field(field);
if (timeUnit != null) {
- dateHistogramBuilder.interval(timeUnit);
+ dateHistogramBuilder.dateHistogramInterval(timeUnit);
} else {
dateHistogramBuilder.interval(interval);
}
- dateHistogramBuilder.subAggregation(AggregationBuilders.extendedStats(INTERNAL_STATS));
+ dateHistogramBuilder.subAggregation(AggregationBuilders.extendedStats(INTERNAL_STATS).field(field));
return dateHistogramBuilder;
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java
index 9a1d7b9e2..5f7139a27 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/RangeFacetRequest.java
@@ -22,7 +22,7 @@ import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
-import org.elasticsearch.search.aggregations.bucket.range.RangeBuilder;
+import org.elasticsearch.search.aggregations.bucket.range.RangeAggregationBuilder;
import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest;
import org.springframework.util.Assert;
@@ -76,15 +76,16 @@ public class RangeFacetRequest extends AbstractFacetRequest {
public AbstractAggregationBuilder getFacet() {
Assert.notNull(getName(), "Facet name can't be a null !!!");
- RangeBuilder rangeBuilder = AggregationBuilders.range(getName());
- rangeBuilder.field(StringUtils.isNotBlank(keyField) ? keyField : field );
+ RangeAggregationBuilder rangeBuilder = AggregationBuilders.range(getName());
+ final String field = StringUtils.isNotBlank(keyField) ? keyField : this.field;
+ rangeBuilder.field(field);
for (Entry entry : entries) {
DoubleEntry doubleEntry = (DoubleEntry) entry;
rangeBuilder.addRange(validateValue(doubleEntry.getFrom(), Double.NEGATIVE_INFINITY), validateValue(doubleEntry.getTo(), Double.POSITIVE_INFINITY));
}
- rangeBuilder.subAggregation(AggregationBuilders.extendedStats(INTERNAL_STATS));
+ rangeBuilder.subAggregation(AggregationBuilders.extendedStats(INTERNAL_STATS).field(field));
if(StringUtils.isNotBlank(valueField)){
rangeBuilder.subAggregation(AggregationBuilders.sum(RANGE_INTERNAL_SUM).field(valueField));
}
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java
index 72859ecc6..1cf99384d 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/facet/request/TermFacetRequest.java
@@ -18,10 +18,12 @@ package org.springframework.data.elasticsearch.core.facet.request;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
+import org.apache.lucene.util.automaton.RegExp;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
-import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
+import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
+import org.elasticsearch.search.aggregations.bucket.terms.support.IncludeExclude;
import org.springframework.data.elasticsearch.core.facet.AbstractFacetRequest;
import org.springframework.util.Assert;
@@ -75,7 +77,7 @@ public class TermFacetRequest extends AbstractFacetRequest {
@Override
public AbstractAggregationBuilder getFacet() {
Assert.notEmpty(fields, "Please select at last one field !!!");
- TermsBuilder termsBuilder = AggregationBuilders.terms(getName()).field(fields[0]).size(this.size);
+ final TermsAggregationBuilder termsBuilder = AggregationBuilders.terms(getName()).field(fields[0]).size(this.size);
switch (order) {
case descTerm:
@@ -91,7 +93,7 @@ public class TermFacetRequest extends AbstractFacetRequest {
termsBuilder.order(Terms.Order.count(true));
}
if (ArrayUtils.isNotEmpty(excludeTerms)) {
- termsBuilder.exclude(excludeTerms);
+ termsBuilder.includeExclude(new IncludeExclude(null,excludeTerms));
}
if (allTerms) {
@@ -99,7 +101,7 @@ public class TermFacetRequest extends AbstractFacetRequest {
}
if (StringUtils.isNotBlank(regex)) {
- termsBuilder.include(regex);
+ termsBuilder.includeExclude(new IncludeExclude(new RegExp(regex),null));
}
return termsBuilder;
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/geo/CustomGeoModule.java b/src/main/java/org/springframework/data/elasticsearch/core/geo/CustomGeoModule.java
index fcc93d5f3..e13c97fe9 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/geo/CustomGeoModule.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/geo/CustomGeoModule.java
@@ -1,10 +1,8 @@
package org.springframework.data.elasticsearch.core.geo;
import java.io.IOException;
-
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
@@ -32,39 +30,15 @@ public class CustomGeoModule extends SimpleModule {
}
class PointSerializer extends JsonSerializer {
-
@Override
- public void serialize(Point value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
+ public void serialize(Point value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeObject(GeoPoint.fromPoint(value));
-// gen.writeStartObject();
-// gen.writeNumberField("lat", value.getY());
-// gen.writeNumberField("lon", value.getX());
-// gen.writeEndObject();
}
}
class PointDeserializer extends JsonDeserializer {
-
@Override
- public Point deserialize(JsonParser p, DeserializationContext context) throws IOException, JsonProcessingException {
-
- GeoPoint point = p.readValueAs(GeoPoint.class);
-// Double lat = null;
-// Double lon = null;
-// //skipp field name
-// p.nextFieldName();
-// if ("lat".equals(p.getCurrentName())) {
-// //get value
-// p.nextFieldName();
-// lat = p.getDoubleValue();
-// p.nextFieldName();
-// }
-// if ("lon".equals(p.getCurrentName())) {
-// //get value
-// p.nextFieldName();
-// lon = p.getDoubleValue();
-// }
-// return new Point(lon, lat);
- return GeoPoint.toPoint(point);
+ public Point deserialize(JsonParser p, DeserializationContext context) throws IOException {
+ return GeoPoint.toPoint(p.readValueAs(GeoPoint.class));
}
}
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 239eacce6..c2ef8284a 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
@@ -20,7 +20,7 @@ import java.util.List;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
-import org.elasticsearch.search.highlight.HighlightBuilder;
+import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.springframework.data.elasticsearch.core.facet.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 c168ac625..1b1072440 100755
--- a/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/query/NativeSearchQueryBuilder.java
@@ -22,7 +22,7 @@ import java.util.List;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
-import org.elasticsearch.search.highlight.HighlightBuilder;
+import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java
index d6e6cf86f..4895fb892 100644
--- a/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java
+++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Query.java
@@ -17,7 +17,6 @@ package org.springframework.data.elasticsearch.core.query;
import java.util.Collection;
import java.util.List;
-
import org.elasticsearch.action.search.SearchType;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@@ -43,13 +42,6 @@ public interface Query {
*/
T setPageable(Pageable pageable);
- /**
- * Get filter queries if defined
- *
- * @return
- */
- // List getFilterQueries();
-
/**
* Get page settings if defined
*
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 f3bfa9fa5..f2e3f29e4 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
@@ -19,7 +19,7 @@ import java.util.List;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
-import org.elasticsearch.search.highlight.HighlightBuilder;
+import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.springframework.data.elasticsearch.core.facet.FacetRequest;
diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/config/EnableElasticsearchRepositories.java b/src/main/java/org/springframework/data/elasticsearch/repository/config/EnableElasticsearchRepositories.java
index ca1c0438b..9974401bc 100644
--- a/src/main/java/org/springframework/data/elasticsearch/repository/config/EnableElasticsearchRepositories.java
+++ b/src/main/java/org/springframework/data/elasticsearch/repository/config/EnableElasticsearchRepositories.java
@@ -48,7 +48,7 @@ public @interface EnableElasticsearchRepositories {
/**
* Base packages to scan for annotated components. {@link #value()} is an alias for (and mutually exclusive with) this
- * attribute. Use {@link #basePackageClasses()} for a type-safe alternative to String-based package names.
+ * attribute. Use {@link #basePackageClasses()} for a type-safe alternative to text-based package names.
*/
String[] basePackages() default {};
diff --git a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java
index c4dd52429..dab180b1e 100644
--- a/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java
+++ b/src/main/java/org/springframework/data/elasticsearch/repository/query/ElasticsearchPartQuery.java
@@ -61,7 +61,8 @@ public class ElasticsearchPartQuery extends AbstractElasticsearchRepositoryQuery
} else if (queryMethod.isStreamQuery()) {
Class> entityType = queryMethod.getEntityInformation().getJavaType();
if (query.getPageable().isUnpaged()) {
- query.setPageable(PageRequest.of(0, 20));
+ int itemCount = (int) elasticsearchOperations.count(query, queryMethod.getEntityInformation().getJavaType());
+ query.setPageable(PageRequest.of(0, Math.max(1, itemCount)));
}
return StreamUtils.createStreamFromIterator((CloseableIterator