我使用弹性搜索7.0。我有一个模型,必须保存到弹性。
当索引不存在时,我尝试将文档直接保存为弹性文档:
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);一切正常,文件将保存为弹性文件。
但是我想要一个自定义分析器,我需要改变映射类型。
因此,我尝试在使用以下方法保存任何文档之前设置索引和映射:
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.]我怎样才能纠正这个错误?
并且,计划是否正确:使用并非所有参数创建索引和映射,然后保存具有比创建更多参数的文档。那么弹性是否会将其他缺失的参数添加到映射中,还是必须在创建索引部分中设置完整的映射?
发布于 2020-02-05 18:23:05
错误来自您正在创建的JSON中的_doc,弹性抱怨是因为这。
从这里两个选项:
include_type_name=true添加到URL中或
request.mapping("_doc",builder);替换为request.source(builder);,查看文档以获得更多详细信息:
发布于 2020-02-05 20:13:26
类型在弹性7.x中被废弃,并将在未来的弹性版本中被删除。将request.mapping("_doc",builder)更改为request.mapping(builder)应该有效。
对于第二个问题,是的弹性搜索将添加在映射中在保存文档时没有提到的缺失字段。
发布于 2020-02-06 08:52:41
我还尝试用设置和映射部分分隔create索引。create +设置运行良好。
但是,添加映射的步骤不起作用:
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);Dies gibt aber leider den Fehler:org.elasticsearch.action.ActionRequestValidationException: Validation Failed: 1: mapping type is missing;
但是,当iam向请求: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
https://stackoverflow.com/questions/60076486
复制相似问题