Create Index API: Allow to provide mappings. closes #541.
This commit is contained in:
parent
151715dc2f
commit
526f28f479
|
@ -192,7 +192,7 @@ public class CreateIndexRequest extends MasterNodeOperationRequest {
|
||||||
*/
|
*/
|
||||||
public CreateIndexRequest mapping(String type, Map source) {
|
public CreateIndexRequest mapping(String type, Map source) {
|
||||||
// wrap it in a type map if its not
|
// wrap it in a type map if its not
|
||||||
if (source.size() != 1 || source.containsKey(type)) {
|
if (source.size() != 1 || !source.containsKey(type)) {
|
||||||
source = MapBuilder.<String, Object>newMapBuilder().put(type, source).map();
|
source = MapBuilder.<String, Object>newMapBuilder().put(type, source).map();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -23,18 +23,19 @@ import org.elasticsearch.action.ActionListener;
|
||||||
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
|
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
|
||||||
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
|
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
|
||||||
import org.elasticsearch.client.Client;
|
import org.elasticsearch.client.Client;
|
||||||
import org.elasticsearch.common.Strings;
|
|
||||||
import org.elasticsearch.common.inject.Inject;
|
import org.elasticsearch.common.inject.Inject;
|
||||||
import org.elasticsearch.common.settings.ImmutableSettings;
|
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.settings.SettingsException;
|
import org.elasticsearch.common.settings.SettingsException;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
import org.elasticsearch.indices.IndexAlreadyExistsException;
|
import org.elasticsearch.indices.IndexAlreadyExistsException;
|
||||||
import org.elasticsearch.indices.InvalidIndexNameException;
|
import org.elasticsearch.indices.InvalidIndexNameException;
|
||||||
import org.elasticsearch.rest.*;
|
import org.elasticsearch.rest.*;
|
||||||
import org.elasticsearch.rest.action.support.RestXContentBuilder;
|
import org.elasticsearch.rest.action.support.RestXContentBuilder;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.elasticsearch.ExceptionsHelper.*;
|
import static org.elasticsearch.ExceptionsHelper.*;
|
||||||
import static org.elasticsearch.common.unit.TimeValue.*;
|
import static org.elasticsearch.common.unit.TimeValue.*;
|
||||||
|
@ -51,12 +52,36 @@ public class RestCreateIndexAction extends BaseRestHandler {
|
||||||
controller.registerHandler(RestRequest.Method.POST, "/{index}", this);
|
controller.registerHandler(RestRequest.Method.POST, "/{index}", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked"})
|
||||||
@Override public void handleRequest(final RestRequest request, final RestChannel channel) {
|
@Override public void handleRequest(final RestRequest request, final RestChannel channel) {
|
||||||
String bodySettings = request.contentAsString();
|
CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index"));
|
||||||
Settings indexSettings = ImmutableSettings.Builder.EMPTY_SETTINGS;
|
if (request.hasContent()) {
|
||||||
if (Strings.hasText(bodySettings)) {
|
XContentType xContentType = XContentFactory.xContentType(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength());
|
||||||
|
if (xContentType != null) {
|
||||||
try {
|
try {
|
||||||
indexSettings = ImmutableSettings.settingsBuilder().loadFromSource(bodySettings).build();
|
Map<String, Object> source = XContentFactory.xContent(xContentType)
|
||||||
|
.createParser(request.contentByteArray(), request.contentByteArrayOffset(), request.contentLength()).mapAndClose();
|
||||||
|
if (source.containsKey("settings")) {
|
||||||
|
createIndexRequest.settings((Map<String, Object>) source.get("settings"));
|
||||||
|
}
|
||||||
|
if (source.containsKey("mappings")) {
|
||||||
|
Map<String, Object> mappings = (Map<String, Object>) source.get("mappings");
|
||||||
|
for (Map.Entry<String, Object> entry : mappings.entrySet()) {
|
||||||
|
createIndexRequest.mapping(entry.getKey(), (Map<String, Object>) entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
try {
|
||||||
|
channel.sendResponse(new XContentThrowableRestResponse(request, e));
|
||||||
|
} catch (IOException e1) {
|
||||||
|
logger.warn("Failed to send response", e1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// its plain settings, parse and set them
|
||||||
|
try {
|
||||||
|
createIndexRequest.settings(request.contentAsString());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
try {
|
try {
|
||||||
channel.sendResponse(new XContentThrowableRestResponse(request, BAD_REQUEST, new SettingsException("Failed to parse index settings", e)));
|
channel.sendResponse(new XContentThrowableRestResponse(request, BAD_REQUEST, new SettingsException("Failed to parse index settings", e)));
|
||||||
|
@ -66,8 +91,10 @@ public class RestCreateIndexAction extends BaseRestHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index"), indexSettings);
|
}
|
||||||
|
|
||||||
createIndexRequest.timeout(request.paramAsTime("timeout", timeValueSeconds(10)));
|
createIndexRequest.timeout(request.paramAsTime("timeout", timeValueSeconds(10)));
|
||||||
|
|
||||||
client.admin().indices().create(createIndexRequest, new ActionListener<CreateIndexResponse>() {
|
client.admin().indices().create(createIndexRequest, new ActionListener<CreateIndexResponse>() {
|
||||||
@Override public void onResponse(CreateIndexResponse response) {
|
@Override public void onResponse(CreateIndexResponse response) {
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Reference in New Issue