Elastic Search 7 高级客户端使用映射创建索引
Elastic Search 7 High level Client Create Index with mapping
我使用弹性搜索 7.0。
我有一个必须保存到弹性的模型。
当索引不存在时,我尝试将文件直接保存到elastic:
final IndexRequest indexRequest = new IndexRequest("seminar_map", "seminar", id)
.source(new Gson().toJson(object), XContentType.JSON);
indexRequest.id(id);
final IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
一切正常,文档将保存到 elastic。
但我想要一个自定义分析器,我需要更改映射类型。
所以我尝试在保存任何文档之前设置索引和映射:
try {
CreateIndexRequest request = new CreateIndexRequest(index);
request.settings(Settings.builder()
.loadFromSource(Strings.toString(jsonBuilder()
.startObject()
.startObject("analysis")
.startObject("analyzer")
.startObject("case_insensitive_analyzer")
.field("tokenizer", "keyword")
.field("type", "custom")
.field("filter", new String[]{"lowercase"})
.endObject()
.endObject()
.endObject()
.endObject()), XContentType.JSON)
);
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("seminar_nummer");
{
builder.field("analyzer", "case_insensitive_analyzer");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
request.mapping("_doc",builder);
return client.indices().create(request, RequestOptions.DEFAULT);
但我收到错误消息:
Elasticsearch exception [type=illegal_argument_exception, reason=The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true.]
我该如何解决这个错误?
创建索引和映射的计划是否正确,而不是所有参数,然后使用比创建的参数更多的参数保存文档。
那么 elastic 会将其他缺少的参数添加到映射中,还是我必须在创建索引部分中设置完整的映射?
错误来自您正在创建的 JSON 中的 _doc
,而 elastic 因 this 而抱怨它。
这里有两个选项:
- 将
include_type_name=true
添加到URL
或
- 将这一行
request.mapping("_doc",builder);
替换为 request.source(builder);
、
有关详细信息,请参阅文档:
类型在 Elastic 7.x 中已弃用,并将在未来的 elastic 版本中删除。
将 request.mapping("_doc",builder)
更改为 request.mapping(builder)
应该有效。
对于第二个问题,是的,elasticsearch会在我们保存文档的时候添加mapping中没有提到的缺失字段
我还尝试将创建索引与设置和映射部分分开。
创建索引 + 设置运行良好。
但是 添加映射 的步骤不起作用:
final PutMappingRequest requestMapping = new PutMappingRequest("seminar_map");
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("seminar_nummer");
{
builder.field("analyzer", "case_insensitive_analyzer");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
requestMapping.source(builder);
client.indices().putMapping(requestMapping, RequestOptions.DEFAULT);
死于 Fehler 的遗物:
org.elasticsearch.action.ActionRequestValidationException: Validation Failed: 1: mapping type is missing;
但是当我向请求添加类型时:
requestMapping.type("_doc")
它抛出异常
Elasticsearch exception [type=illegal_argument_exception, reason=Types cannot be provided in put mapping requests, unless the include_type_name parameter is set to true.]
所以它不能与类型一起工作,没有类型也不能工作:-D
我使用弹性搜索 7.0。 我有一个必须保存到弹性的模型。
当索引不存在时,我尝试将文件直接保存到elastic:
final IndexRequest indexRequest = new IndexRequest("seminar_map", "seminar", id)
.source(new Gson().toJson(object), XContentType.JSON);
indexRequest.id(id);
final IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
一切正常,文档将保存到 elastic。
但我想要一个自定义分析器,我需要更改映射类型。
所以我尝试在保存任何文档之前设置索引和映射:
try {
CreateIndexRequest request = new CreateIndexRequest(index);
request.settings(Settings.builder()
.loadFromSource(Strings.toString(jsonBuilder()
.startObject()
.startObject("analysis")
.startObject("analyzer")
.startObject("case_insensitive_analyzer")
.field("tokenizer", "keyword")
.field("type", "custom")
.field("filter", new String[]{"lowercase"})
.endObject()
.endObject()
.endObject()
.endObject()), XContentType.JSON)
);
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("seminar_nummer");
{
builder.field("analyzer", "case_insensitive_analyzer");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
request.mapping("_doc",builder);
return client.indices().create(request, RequestOptions.DEFAULT);
但我收到错误消息:
Elasticsearch exception [type=illegal_argument_exception, reason=The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true.]
我该如何解决这个错误?
创建索引和映射的计划是否正确,而不是所有参数,然后使用比创建的参数更多的参数保存文档。 那么 elastic 会将其他缺少的参数添加到映射中,还是我必须在创建索引部分中设置完整的映射?
错误来自您正在创建的 JSON 中的 _doc
,而 elastic 因 this 而抱怨它。
这里有两个选项:
- 将
include_type_name=true
添加到URL
或
- 将这一行
request.mapping("_doc",builder);
替换为request.source(builder);
、
有关详细信息,请参阅文档:
类型在 Elastic 7.x 中已弃用,并将在未来的 elastic 版本中删除。
将 request.mapping("_doc",builder)
更改为 request.mapping(builder)
应该有效。
对于第二个问题,是的,elasticsearch会在我们保存文档的时候添加mapping中没有提到的缺失字段
我还尝试将创建索引与设置和映射部分分开。 创建索引 + 设置运行良好。
但是 添加映射 的步骤不起作用:
final PutMappingRequest requestMapping = new PutMappingRequest("seminar_map");
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("seminar_nummer");
{
builder.field("analyzer", "case_insensitive_analyzer");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
requestMapping.source(builder);
client.indices().putMapping(requestMapping, RequestOptions.DEFAULT);
死于 Fehler 的遗物:
org.elasticsearch.action.ActionRequestValidationException: Validation Failed: 1: mapping type is missing;
但是当我向请求添加类型时:
requestMapping.type("_doc")
它抛出异常
Elasticsearch exception [type=illegal_argument_exception, reason=Types cannot be provided in put mapping requests, unless the include_type_name parameter is set to true.]
所以它不能与类型一起工作,没有类型也不能工作:-D