0

Das ist mein Szenario: Ich habe zwei Indizes in elasticsearch mit type als "Daten" und "Metadaten" erstellt. Ich versuche, eine Eltern-Kind-Zuordnung zwischen den Daten und den Metadaten herzustellen, wobei die Metadaten das übergeordnete Element der Daten sind. Ich verwende dazu den Elasticsearch Transport Client java api.Elastische Suche Die Typoption des _parent-Feldes kann nicht geändert werden: [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); 
        } 

, aber ich bekomme die folgende fehler-

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) 

Ich habe versucht, Online-Suche konnte aber nicht eine konkrete Antwort bekommen. Ich möchte nicht den vorhandenen Index löschen und den Index mit Mapping hinzufügen, da ich bereits vorhandene Informationen im Index habe, die ich verwenden muss. (Einige Leute haben das vorgeschlagen)

Ist das ein Fehler in elasticsearch?

Wenn nicht ist mein Code falsch und wie löse ich es?

Antwort

0

Ob es ein "Bug" ist kann ich nicht sagen, es ist sicherlich eine Einschränkung, siehe auch https://github.com/elastic/elasticsearch/issues/9448.

Der einzige Weg, um diese Arbeit zu machen, ist _parent bereits bei Indexerstellung hinzuzufügen und nicht nach der (überprüft mit 5.2.2 gerade jetzt).

Mit Tools wie Aliasing ist es möglich, diese Art von Dingen zu tun, ohne den aktuellen Index zuerst zu entfernen, aber es erfordert eine gute Planung Ihrer Schritte und sollte ordnungsgemäß getestet werden.