我正在尝试使用RestHighLevelClient为elastic创建一个动态模板。getMapping()
中注释掉的代码片段是用于静态映射的,它可以工作。然而,我在尝试创建动态映射时遇到了问题。
我的意图是将以\u id
结尾的任何属性视为long,将以\u message
结尾的任何属性视为文本。
有人能指出我做错了什么吗?
":{"root_cause":[{"type":"class_cast_exception","原因":"class_cast_exception:java.util.LinkedHashMap无法强制转换java.util.List"}],"type":"mapper_parsing_exception","原因":"解析映射失败[_doc]:java.util.LinkedHashMap无法被转换为java.util.列表,caused_by:{类型:class_cast_exception,原因:class_cast_exception:java.util.LinkedHashMap不能被转换为java.util.列表}},状态:400}
我的代码片段:
主要方法:
CreateIndexRequest request = new CreateIndexRequest(indexName);
request.settings(Settings.builder()
.put("index.number_of_shards", 3)
.put("index.number_of_replicas", 2)
);
request.mapping("_doc", getMapping());
CreateIndexResponse createIndexResponse = esClient.indices().create(request, RequestOptions.DEFAULT);
助手方法:
private static XContentBuilder getMapping() throws IOException {
XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("_doc")
.startObject("dynamic_templates")
.startObject("id")
.field("match", "*_id")
.field("match_mapping_type", "long")
.endObject()
.startObject("message")
.field("match", "*_message")
.field("match_mapping_type", "string")
.endObject()
.endObject()
.endObject()
.endObject();
/*XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("_doc")
.startObject("properties")
.startObject("user")
.field("type", "text")
.field("index", true)
.endObject()
.startObject("message")
.field("type", "text")
.field("index", true)
.endObject()
.endObject()
.endObject()
.endObject();*/
return mappingBuilder;
}
参考指南:https://www.elastic.co/guide/en/elasticsearch/guide/master/custom-dynamic-mapping.html
动态模板是数组。例如,Elasticsearch 7.1.0
private XContentBuilder buildDynamicTemplates() throws IOException {
XContentBuilder dynamicTemplate = XContentFactory.jsonBuilder();
dynamicTemplate.startObject();
{
dynamicTemplate = DynamicTemplateFactory.templateBuilder(dynamicTemplate);
}
dynamicTemplate.endObject();
return dynamicTemplate;
}
private static XContentBuilder builderTemplate() throws IOException {
XContentBuilder dynamicTemplate = XContentFactory.jsonBuilder();
dynamicTemplate.startObject();
dynamicTemplate.startArray("dynamic_templates");
{
dynamicTemplate.startObject();
{
dynamicTemplate.startObject("strings_as_keywords");
{
dynamicTemplate.field("match", "*");
dynamicTemplate.field("match_mapping_type", "string");
dynamicTemplate.startObject("mapping");
{
dynamicTemplate.field("type", "keyword");
}
dynamicTemplate.endObject();
}
dynamicTemplate.endObject();
}
dynamicTemplate.endObject();
}
dynamicTemplate.endArray();
dynamicTemplate.endObject();
return dynamicTemplate;
}
Elasticsearch 是一个 schema-less 的系统,但 schema-less 并不代表 no schema,而是 ES 会尽量根据 JSON 源数据的基础类型猜测你想要的字段类型映射。如果你对这种动态生成的映射关系不满意,或者想要使用一些更高级的映射设置,那么就需要使用自定义映射。 创建和更新映射 正如上面所说,ES 可以随时根据数据中的新字段来创建新的映射关系。所以,我们也可以
问题内容: 我有一个要在elasticSearch上建立索引的文档,该文档包含一些我事先不知道的动态键,例如下面的示例中的“ spanish”或“ french” 我使用的是DSL elastic4s为了使我的映射(通过在DSL的createIndex),但我找不到如何创建,使用这个库的基础上,“匹配”选项动态映射(如建议在这里),在为了为路径content.title下存储的每种语言指定不同的分
主要内容:映射类型,动态映射,映射参数映射是存储在索引中的文档的大纲。它定义数据类型,如或文档和规则中存在的字段的字符串和格式,以控制动态添加的字段的映射。 例如, 请求正文 响应 字段数据类型 Elasticsearch支持文档中字段的多种不同数据类型。以下数据类型用于在Elasticsearch中存储字段 - 核心数据类型 - 这些是几乎所有系统支持的基本数据类型,如整数,长整数,双精度,短整型,字节,双精度,浮点型,字符串,日期
问题内容: 也许我缺少一些简单的东西,但仍然无法弄清楚以下内容: 从ES 6.x开始,该字段已弃用,建议使用说明(https://www.elastic.co/guide/en/elasticsearch/reference/current/copy- to.html )。 但是,给我的印象是,您需要显式指定要复制到自定义字段的字段。但是,如果我使用动态映射,则我不事先知道字段,因此不能使用? 我
问题所在 我是elasticsearch的新手,我想了解动态映射和重新索引文档之间的关系。 根据我的实验,当动态映射打开时,文档的重新索引是自动完成的。这意味着如果向文档中添加新字段,它将自动被索引。 TEST1-带映射的索引 TEST2-没有映射的索引