Skip to content

Commit 3173fed

Browse files
committed
POC - Adaptive hybrid synthetic source reconstruction for pruned vector fields
FAST IMPLEMENTATION focusing only on vector fields, implements the first stage of adaptive hybrid source: Automatically reconstructs VECTOR fields from doc_values during: - Reindex operations - Update/update_by_query - Get/search requests Resolves failing test: testReindexAutoIncludeVectors
1 parent b0b9b66 commit 3173fed

File tree

11 files changed

+83
-21
lines changed

11 files changed

+83
-21
lines changed

server/src/main/java/org/elasticsearch/index/engine/LuceneChangesSnapshot.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,9 @@ public LuceneChangesSnapshot(
8383
this.lastSeenSeqNo = fromSeqNo - 1;
8484
final TopDocs topDocs = nextTopDocs();
8585
this.maxDocIndex = topDocs.scoreDocs.length;
86-
this.syntheticVectorPatchLoader = mapperService.mappingLookup().getMapping().syntheticVectorsLoader(null);
86+
this.syntheticVectorPatchLoader = mapperService.mappingLookup()
87+
.getMapping()
88+
.syntheticVectorsLoader(null, mapperService.mappingLookup().isFieldMapperAutoHybrid());
8789
fillParallelArray(topDocs.scoreDocs, parallelArray);
8890
}
8991

server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,13 @@ public SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader() {
464464
return null;
465465
}
466466

467+
public SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(SourceLoader.SyntheticVectorsLoader.AutoHybridChecker checker) {
468+
if (checker.check(this)) {
469+
return syntheticVectorsLoader();
470+
}
471+
return null;
472+
}
473+
467474
/**
468475
* <p>
469476
* Specifies the mode of synthetic source support by the mapper.

server/src/main/java/org/elasticsearch/index/mapper/Mapping.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,11 @@ Mapping mappingUpdate(RootObjectMapper rootObjectMapper) {
138138
* @return a {@link SourceLoader.SyntheticVectorsLoader} for extracting synthetic vectors,
139139
* potentially using the provided filter
140140
*/
141-
public SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(@Nullable SourceFilter filter) {
142-
return root.syntheticVectorsLoader(filter);
141+
public SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(
142+
@Nullable SourceFilter filter,
143+
SourceLoader.SyntheticVectorsLoader.AutoHybridChecker checker
144+
) {
145+
return root.syntheticVectorsLoader(filter, checker);
143146
}
144147

145148
private boolean isSourceSynthetic() {

server/src/main/java/org/elasticsearch/index/mapper/MappingLookup.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ private MappingLookup(
194194
if (mapper instanceof InferenceFieldMapper inferenceFieldMapper) {
195195
inferenceFields.put(mapper.fullPath(), inferenceFieldMapper.getMetadata(fieldTypeLookup.sourcePaths(mapper.fullPath())));
196196
}
197-
if (mapper.syntheticVectorsLoader() != null) {
197+
if (mapper.syntheticVectorsLoader(this.isFieldMapperAutoHybrid()) != null) {
198198
syntheticVectorFields.add(mapper.fullPath());
199199
}
200200
}
@@ -489,14 +489,31 @@ public boolean isSourceSynthetic() {
489489
return sfm != null && sfm.isSynthetic();
490490
}
491491

492+
/**
493+
* Auto use partial synthetic source combine with stored source
494+
*/
495+
public SourceLoader.SyntheticVectorsLoader.AutoHybridChecker isFieldMapperAutoHybrid() {
496+
SourceFieldMapper sfm = mapping.getMetadataMapperByClass(SourceFieldMapper.class);
497+
return fieldMapper -> {
498+
if (sfm != null && sfm.isStored()) {
499+
for (String exclude : sfm.getExcludes()) {
500+
if (exclude.equals(fieldMapper.fullPath())) {
501+
return true;
502+
}
503+
}
504+
}
505+
return false;
506+
};
507+
}
508+
492509
/**
493510
* Build something to load source {@code _source}.
494511
*/
495512
public SourceLoader newSourceLoader(@Nullable SourceFilter filter, SourceFieldMetrics metrics) {
496513
if (isSourceSynthetic()) {
497514
return new SourceLoader.Synthetic(filter, () -> mapping.syntheticFieldLoader(filter), metrics, mapping.ignoredSourceFormat());
498515
}
499-
var syntheticVectorsLoader = mapping.syntheticVectorsLoader(filter);
516+
var syntheticVectorsLoader = mapping.syntheticVectorsLoader(filter, this.isFieldMapperAutoHybrid());
500517
if (syntheticVectorsLoader != null) {
501518
return new SourceLoader.SyntheticVectors(removeExcludedSyntheticVectorFields(filter), syntheticVectorsLoader);
502519
}

server/src/main/java/org/elasticsearch/index/mapper/NestedObjectMapper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,11 @@ protected MapperMergeContext createChildContext(MapperMergeContext mapperMergeCo
410410
}
411411

412412
@Override
413-
protected SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(SourceFilter sourceFilter) {
414-
var patchLoader = super.syntheticVectorsLoader(sourceFilter);
413+
protected SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(
414+
SourceFilter sourceFilter,
415+
SourceLoader.SyntheticVectorsLoader.AutoHybridChecker checker
416+
) {
417+
var patchLoader = super.syntheticVectorsLoader(sourceFilter, checker);
415418
if (patchLoader == null) {
416419
return null;
417420
}

server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -912,23 +912,30 @@ public ObjectMapper findParentMapper(String leafFieldPath) {
912912
return null;
913913
}
914914

915-
private static SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(Mapper mapper, SourceFilter sourceFilter) {
915+
private static SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(
916+
Mapper mapper,
917+
SourceFilter sourceFilter,
918+
SourceLoader.SyntheticVectorsLoader.AutoHybridChecker checker
919+
) {
916920
if (sourceFilter != null && sourceFilter.isPathFiltered(mapper.fullPath(), false)) {
917921
return null;
918922
}
919923
if (mapper instanceof ObjectMapper objMapper) {
920-
return objMapper.syntheticVectorsLoader(sourceFilter);
924+
return objMapper.syntheticVectorsLoader(sourceFilter, checker);
921925
} else if (mapper instanceof FieldMapper fieldMapper) {
922-
return fieldMapper.syntheticVectorsLoader();
926+
return fieldMapper.syntheticVectorsLoader(checker);
923927
} else {
924928
return null;
925929
}
926930
}
927931

928-
SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(SourceFilter sourceFilter) {
932+
SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(
933+
SourceFilter sourceFilter,
934+
SourceLoader.SyntheticVectorsLoader.AutoHybridChecker checker
935+
) {
929936
var loaders = mappers.values()
930937
.stream()
931-
.map(m -> syntheticVectorsLoader(m, sourceFilter))
938+
.map(m -> syntheticVectorsLoader(m, sourceFilter, checker))
932939
.filter(l -> l != null)
933940
.collect(Collectors.toList());
934941
if (loaders.isEmpty()) {

server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,4 +615,8 @@ private static void removeSyntheticVectorFields(
615615
destination.copyCurrentEvent(parser);
616616
}
617617
}
618+
619+
public String[] getExcludes() {
620+
return sourceFilter == null ? Strings.EMPTY_ARRAY : sourceFilter.getExcludes();
621+
}
618622
}

server/src/main/java/org/elasticsearch/index/mapper/SourceLoader.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,5 +548,9 @@ interface Leaf {
548548
*/
549549
void load(int doc, List<SyntheticVectorPatch> acc) throws IOException;
550550
}
551+
552+
interface AutoHybridChecker {
553+
boolean check(FieldMapper mapper);
554+
}
551555
}
552556
}

server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3041,9 +3041,14 @@ public String toString() {
30413041

30423042
@Override
30433043
public SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader() {
3044-
if (isExcludeSourceVectors) {
3045-
var syntheticField = new IndexedSyntheticFieldLoader(indexCreatedVersion, fieldType().similarity);
3046-
return new SyntheticVectorsPatchFieldLoader(syntheticField, syntheticField::copyVectorAsList);
3044+
var syntheticField = new IndexedSyntheticFieldLoader(indexCreatedVersion, fieldType().similarity);
3045+
return new SyntheticVectorsPatchFieldLoader(syntheticField, syntheticField::copyVectorAsList);
3046+
}
3047+
3048+
@Override
3049+
public SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(SourceLoader.SyntheticVectorsLoader.AutoHybridChecker checker) {
3050+
if (isExcludeSourceVectors || checker.check(this)) {
3051+
return syntheticVectorsLoader();
30473052
}
30483053
return null;
30493054
}

server/src/main/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapper.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,14 @@ protected SyntheticSourceSupport syntheticSourceSupport() {
327327

328328
@Override
329329
public SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader() {
330-
if (isExcludeSourceVectors) {
331-
var syntheticField = new SparseVectorSyntheticFieldLoader(fullPath(), leafName());
332-
return new SyntheticVectorsPatchFieldLoader(syntheticField, syntheticField::copyAsMap);
330+
var syntheticField = new SparseVectorSyntheticFieldLoader(fullPath(), leafName());
331+
return new SyntheticVectorsPatchFieldLoader(syntheticField, syntheticField::copyAsMap);
332+
}
333+
334+
@Override
335+
public SourceLoader.SyntheticVectorsLoader syntheticVectorsLoader(SourceLoader.SyntheticVectorsLoader.AutoHybridChecker checker) {
336+
if (isExcludeSourceVectors || checker.check(this)) {
337+
return syntheticVectorsLoader();
333338
}
334339
return null;
335340
}

0 commit comments

Comments
 (0)