diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/analyze/AnalyzeRequest.java b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/analyze/AnalyzeRequest.java
index 9cec36db840..3bf08d56825 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/analyze/AnalyzeRequest.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/analyze/AnalyzeRequest.java
@@ -42,6 +42,10 @@ public class AnalyzeRequest extends SingleCustomOperationRequest {
private String analyzer;
+ private String type;
+
+ private String field;
+
AnalyzeRequest() {
}
@@ -79,6 +83,24 @@ public class AnalyzeRequest extends SingleCustomOperationRequest {
return this.analyzer;
}
+ public AnalyzeRequest type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ public String type() {
+ return this.type;
+ }
+
+ public AnalyzeRequest field(String field) {
+ this.field = field;
+ return this;
+ }
+
+ public String field() {
+ return this.field;
+ }
+
/**
* if this operation hits a node with a local relevant shard, should it be preferred
* to be executed on, or just do plain round robin. Defaults to true
@@ -106,17 +128,29 @@ public class AnalyzeRequest extends SingleCustomOperationRequest {
if (in.readBoolean()) {
analyzer = in.readUTF();
}
+ if (in.readBoolean()) {
+ type = in.readUTF();
+ }
+ if (in.readBoolean()) {
+ field = in.readUTF();
+ }
}
@Override public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
out.writeUTF(index);
out.writeUTF(text);
- if (analyzer == null) {
+ writeOption(out, analyzer);
+ writeOption(out, type);
+ writeOption(out, field);
+ }
+
+ private void writeOption(StreamOutput out, String value) throws IOException {
+ if (value==null) {
out.writeBoolean(false);
} else {
out.writeBoolean(true);
- out.writeUTF(analyzer);
+ out.writeUTF(value);
}
}
}
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/analyze/TransportAnalyzeAction.java b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/analyze/TransportAnalyzeAction.java
index ac27e391f75..97fea967ada 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/analyze/TransportAnalyzeAction.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/analyze/TransportAnalyzeAction.java
@@ -36,6 +36,7 @@ import org.elasticsearch.common.collect.Lists;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.io.FastStringReader;
import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.index.mapper.DocumentMapper;
import org.elasticsearch.index.service.IndexService;
import org.elasticsearch.indices.IndicesService;
import org.elasticsearch.threadpool.ThreadPool;
@@ -86,9 +87,18 @@ public class TransportAnalyzeAction extends TransportSingleCustomOperationAction
IndexService indexService = indicesService.indexServiceSafe(request.index());
Analyzer analyzer = null;
String field = "contents";
- if (request.analyzer() != null) {
+ String dtype = null;
+ if (request.field()!=null) field = request.field();
+ if (request.type()!=null) dtype = request.type();
+ if (request.field()!=null || request.type()!=null) {
+ final DocumentMapper mapper = indexService.mapperService().documentMapper(dtype);
+ if (mapper!=null) {
+ analyzer = mapper.mappers().indexAnalyzer();
+ }
+ }
+ if (analyzer==null && request.analyzer() != null) {
analyzer = indexService.analysisService().analyzer(request.analyzer());
- } else {
+ } else if (analyzer==null) {
analyzer = indexService.analysisService().defaultIndexAnalyzer();
}
if (analyzer == null) {
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/client/action/admin/indices/analyze/AnalyzeRequestBuilder.java b/modules/elasticsearch/src/main/java/org/elasticsearch/client/action/admin/indices/analyze/AnalyzeRequestBuilder.java
index 4ce2664c3d9..bc61dcd2be6 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/client/action/admin/indices/analyze/AnalyzeRequestBuilder.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/client/action/admin/indices/analyze/AnalyzeRequestBuilder.java
@@ -56,4 +56,14 @@ public class AnalyzeRequestBuilder extends BaseIndicesRequestBuilder listener) {
client.analyze(request, listener);
}
+
+ public AnalyzeRequestBuilder field(String field) {
+ request.field(field);
+ return this;
+ }
+
+ public AnalyzeRequestBuilder type(String type) {
+ request.type(type);
+ return this;
+ }
}
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/analyze/RestAnalyzeAction.java b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/analyze/RestAnalyzeAction.java
index 62439cc860e..05ca1c8ec07 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/analyze/RestAnalyzeAction.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/analyze/RestAnalyzeAction.java
@@ -63,6 +63,8 @@ public class RestAnalyzeAction extends BaseRestHandler {
AnalyzeRequest analyzeRequest = new AnalyzeRequest(request.param("index"), text);
analyzeRequest.preferLocal(request.paramAsBoolean("prefer_local", analyzeRequest.preferLocalShard()));
analyzeRequest.analyzer(request.param("analyzer"));
+ analyzeRequest.type(request.param("type"));
+ analyzeRequest.field(request.param("field"));
client.admin().indices().analyze(analyzeRequest, new ActionListener() {
@Override public void onResponse(AnalyzeResponse response) {
try {
diff --git a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/indices/analyze/AnalyzeActionTests.java b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/indices/analyze/AnalyzeActionTests.java
index eaf83d91194..9fe8ef92b63 100644
--- a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/indices/analyze/AnalyzeActionTests.java
+++ b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/indices/analyze/AnalyzeActionTests.java
@@ -20,7 +20,9 @@
package org.elasticsearch.test.integration.indices.analyze;
import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse;
+import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
import org.elasticsearch.client.Client;
+import org.elasticsearch.client.action.admin.indices.analyze.AnalyzeRequestBuilder;
import org.elasticsearch.test.integration.AbstractNodesTests;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
@@ -70,4 +72,65 @@ public class AnalyzeActionTests extends AbstractNodesTests {
assertThat(token.endOffset(), equalTo(14));
}
}
+
+ @Test public void analyzerWithFieldOrTypeTests() throws Exception {
+ try {
+ client.admin().indices().prepareDelete("test").execute().actionGet();
+ } catch (Exception e) {
+ // ignore
+ }
+
+ client.admin().indices().prepareCreate("test").execute().actionGet();
+ client.admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet();
+
+ client.admin().indices().preparePutMapping("test")
+ .setType("document").setSource(
+ "{\n" +
+ " \"document\":{\n" +
+ " \"properties\":{\n" +
+ " \"simple\":{\n" +
+ " \"type\":\"string\",\n" +
+ " \"analyzer\": \"simple\"\n" +
+ " }\n" +
+ " }\n" +
+ " }\n" +
+ "}"
+ ).execute().actionGet();
+
+ for (int i = 0; i < 10; i++) {
+ final AnalyzeRequestBuilder requestBuilder = client.admin().indices().prepareAnalyze("test", "THIS IS A TEST");
+ requestBuilder.type("document");
+ requestBuilder.field("simple");
+ AnalyzeResponse analyzeResponse = requestBuilder.execute().actionGet();
+ assertThat(analyzeResponse.tokens().size(), equalTo(4));
+ AnalyzeResponse.AnalyzeToken token = analyzeResponse.tokens().get(3);
+ assertThat(token.term(), equalTo("test"));
+ assertThat(token.startOffset(), equalTo(10));
+ assertThat(token.endOffset(), equalTo(14));
+ }
+
+ // test that using the document type only uses the default analyzer
+ for (int i = 0; i < 10; i++) {
+ final AnalyzeRequestBuilder requestBuilder = client.admin().indices().prepareAnalyze("test", "THIS IS A TEST");
+ requestBuilder.type("document");
+ AnalyzeResponse analyzeResponse = requestBuilder.execute().actionGet();
+ assertThat(analyzeResponse.tokens().size(), equalTo(1));
+ AnalyzeResponse.AnalyzeToken token = analyzeResponse.tokens().get(0);
+ assertThat(token.term(), equalTo("test"));
+ assertThat(token.startOffset(), equalTo(10));
+ assertThat(token.endOffset(), equalTo(14));
+ }
+
+ // test that using the field name only uses the default analyzer
+ for (int i = 0; i < 10; i++) {
+ final AnalyzeRequestBuilder requestBuilder = client.admin().indices().prepareAnalyze("test", "THIS IS A TEST");
+ requestBuilder.field("simple");
+ AnalyzeResponse analyzeResponse = requestBuilder.execute().actionGet();
+ assertThat(analyzeResponse.tokens().size(), equalTo(1));
+ AnalyzeResponse.AnalyzeToken token = analyzeResponse.tokens().get(0);
+ assertThat(token.term(), equalTo("test"));
+ assertThat(token.startOffset(), equalTo(10));
+ assertThat(token.endOffset(), equalTo(14));
+ }
+ }
}