这是我的场景:我在elasticsearch中创建了两个索引,类型为“data”和“metadata”。我正在尝试在数据和元数据之间建立父子映射,其中元数据是数据的父级。我使用elasticsearch传输客户端java api来做到这一点。
//parent mapping json
String parentMapping = XContentFactory.jsonBuilder()
.startObject()
.startObject(parentType)
.endObject()
.string();
//child mapping json
String childMapping = XContentFactory.jsonBuilder()
.startObject()
.startObject(childType)
.startObject("_parent")
.field("type", parentType)
.endObject()
.endObject()
.endObject()
.string();
System.out.println("childMapping="+childMapping);
System.out.println("parentMapping="+parentMapping);
client.admin().indices().preparePutMapping(indexName).setType(parentType)
.setSource(parentMapping).execute().actionGet();
//This does the mapping
PutMappingRequestBuilder putMappingRequestBuilder = client.admin().indices().preparePutMapping(indexName).setType(childType);
putMappingRequestBuilder.setSource(childMapping);
PutMappingResponse response = putMappingRequestBuilder.execute().actionGet();
if(!response.isAcknowledged()) {
LogManager.log("Could not define mapping for type ["+indexName+"]/["+childType+"]",LogManager.DEBUG);
tries=tries+1;
} else {
mapLoop=true;
LogManager.log("Successfully put mapping for ["+indexName+"]/["+childType+"]",LogManager.DEBUG);
}
但我得到以下错误 -
java.lang.IllegalArgumentException: The _parent field's type option can't be changed: [null]->[metadata]
at org.elasticsearch.index.mapper.internal.ParentFieldMapper.doMerge(ParentFieldMapper.java:389)
at org.elasticsearch.index.mapper.FieldMapper.merge(FieldMapper.java:364)
at org.elasticsearch.index.mapper.MetadataFieldMapper.merge(MetadataFieldMapper.java:75)
at org.elasticsearch.index.mapper.Mapping.merge(Mapping.java:120)
at org.elasticsearch.index.mapper.DocumentMapper.merge(DocumentMapper.java:376)
我尝试在线搜索但无法得到具体答案。我不想删除现有的索引并添加带有映射的索引,因为我在索引中有我需要使用的信息。(有人建议这样做)
这是弹性搜索中的错误吗?
如果不是我的代码不正确,我该如何解决?
它是否是一个“虫子”我不能说,它肯定是一个限制,请参阅https://github.com/elastic/elasticsearch/issues/9448。
实现这项工作的唯一方法是在索引创建时添加_parent
,而不是在它之后(仅用5.2.2验证)。
使用像锯齿这样的工具,可以在不必先删除当前索引的情况下执行这些操作,但是需要对步骤进行良好规划,并且应该进行适当的测试。