`rebuild()` of bulk operations (`IndexOperation`, `CreateOperation`, `UpdateOperation`) drops most fields
@l-trotta ci sta già lavorando.
Dal 15/10/2026.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 50/100
Direzione di ricerca
The bug is in the private Builder(IndexOperation), Builder(CreateOperation) and Builder(UpdateOperation) constructors, which copy too few fields. Those classes inherit from BulkOperationBase and WriteOperation, and the reproducer in the issue shows which properties go missing. The likely cause is the code generator, so check whether the fix belongs in the generated sources or in the generator. Done means op.rebuild().build() equals op for all three operation types, with the builder typed as Builder<TDocument>.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Java API client version
9.5.4 (also current main)
Java version
25
Elasticsearch Version
9.5.4
Problem description
(full disclosure: analysis by copilot)
rebuild() should return a builder "initialized with field values of this instance". For the bulk operation classes it doesn't: most fields are lost.
Expected: op.rebuild().build() is equal to op.
Actual:
-
IndexOperationandCreateOperation: the privateBuilder(IndexOperation<TDocument> instance)/Builder(CreateOperation<TDocument> instance)constructors are empty. Nothing is copied:- fields inherited from
BulkOperationBase:id,index,routing,ifSeqNo,ifPrimaryTerm,version,versionType; - fields inherited from
WriteOperation:pipeline,requireAlias,dynamicTemplates; - their own fields:
documentandtDocumentSerializer.
Because
documentis required,rebuild().build()throws aMissingRequiredPropertyException. If you set a new document first (for example.document(binaryData)), it builds without errors, but without_id,_index, routing and so on. - fields inherited from
-
UpdateOperation: onlyrequireAliasandretryOnConflictare copied. The inheritedBulkOperationBasefields,action,binaryActionand the serializers are lost.
This looks like a code generator problem. Fields inherited from a generated base class are never copied, and neither are fields of the generic type parameter. Request classes without a base class, such as IndexRequest, copy their fields correctly.
Reproducer:
IndexOperation<Map<String, Object>> op = IndexOperation.of(b -> b
.index("my-index")
.id("1")
.routing("r1")
.ifSeqNo(5L)
.ifPrimaryTerm(1L)
.pipeline("my-pipeline")
.document(Map.of("field", "value")));
// throws MissingRequiredPropertyException: Missing required property 'IndexOperation.document'
op.rebuild().build();
// builds without errors, but all values are lost
IndexOperation<?> copy = op.rebuild().document(Map.of("field", "value")).build();
System.out.println(copy.index()); // null, expected "my-index"
System.out.println(copy.id()); // null, expected "1"
System.out.println(copy.routing()); // null, expected "r1"
System.out.println(copy.pipeline()); // null, expected "my-pipeline"
CreateOperation behaves the same. For UpdateOperation, rebuild().build() does not throw, but only requireAlias and retryOnConflict are kept:
UpdateOperation<Object, Object> op = UpdateOperation.of(b -> b
.index("my-index")
.id("1")
.routing("r1")
.retryOnConflict(3)
.action(a -> a.docAsUpsert(true)));
UpdateOperation<?, ?> copy = op.rebuild().build();
System.out.println(copy.index()); // null, expected "my-index"
System.out.println(copy.id()); // null, expected "1"
System.out.println(copy.routing()); // null, expected "r1"
System.out.println(copy.retryOnConflict()); // 3
System.out.println(copy.action()); // null
Context: I hit this in Spring Data Elasticsearch. Like the client's own BulkIngester, it needs to replace the document of an operation with a pre-serialized BinaryData so that it can measure its size. The obvious way is op.rebuild().document(binaryData).build(), but that silently drops _id and _index. So we copy all properties by hand, as IngesterOperation.copyIndexProperties() / copyBaseProperties() do.
see https://github.com/spring-projects/spring-data-elasticsearch/pull/3357
Note: rebuild() also returns the raw type Builder instead of Builder<TDocument>, so callers get unchecked warnings.
- Lingua principale
- Java
- Stelle
- 525
- Fork
- 299
- Merge medio
- 13h 9m
- PR unite (30g)
- 5
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di elastic/elasticsearch-java
-
Transport options set on the client builder drop SafeResponseConsumerForse già presa @RaphaelFakhri l’ha presa 1 giorno fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 54/100
elastic/elasticsearch-java#1354 ·
-
Delete By Query deserialization will not account for search failuresForse già presa @l-trotta l’ha presa 18 giorni fa. Aperta
elastic/elasticsearch-java#1349 · 1 commento · 1 assegnatario ·
-
Nested index settings that do not end up deserialized in otherSettings leads to requiring properties on parent JSON nodesForse già presa @l-trotta l’ha presa 18 giorni fa. ApertaArea: Specification Category: Bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
elastic/elasticsearch-java#1347 · 1 commento · 1 assegnatario ·
-
RestClientTransport sends bulk bodies as one HTTP chunk / TLS record / syscall per NDJSON buffer, burning ~45x the reactor CPU of the HLRCForse di nuovo libera @l-trotta l’ha presa 33 giorni fa e non c’è nessuna pull request aperta. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 72/100
elastic/elasticsearch-java#1339 · 5 commenti · 1 assegnatario ·
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 45/100
elastic/elasticsearch-java#1212 · 8 commenti ·
Tutte le issue di elastic/elasticsearch-java
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
apache/rocketmq-dashboard#7250 ·
I maintainer di solito rispondono entro 3 giorni
-
HttpMaxFrameSizeTest.sendOversizedMessageTest() passes silently when maxFrameSize is not enforcedAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
apache/activemq#2706 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
federicoiosue/Omni-Notes#1032 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
unitycatalog/unitycatalog#2025 ·
I maintainer di solito rispondono entro 4 giorni
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 78/100
krizaka/krizaka-notifications#22 ·
I maintainer di solito rispondono entro 1 giorno