0

這是我的場景: 我在elasticsearch中創建了兩個類型爲「data」和「metadata」的索引。 我正嘗試在數據和元數據之間建立一個父 - 子映射,其中元數據是數據的父級。 我正在使用elasticsearch傳輸客戶端java api來執行此操作。彈性搜索_parent字段的類型選項不能更改:[null] - > [metadata]

   //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) 

我試着在網上搜索,但不能得到一個明確的答案。 我不想刪除現有的指標,並與映射添加索引,因爲我已經在現有的,我需要使用索引信息。(有些人建議這樣做)

這是elasticsearch的錯誤嗎?

如果不是我的代碼不正確,我該如何解決它?

回答

0

無論是「蟲」,我不能說,它肯定是一個限制,另見https://github.com/elastic/elasticsearch/issues/9448

,使這項工作的唯一方法是添加_parent已經在索引創建時間而不是後(剛纔5.2.2驗證)。

使用類似鋸齒的工具,可以做這些事情,而不必先刪除當前的索引,但它需要對步驟進行良好的規劃,並且應該進行適當的測試。