From 78ac2a6f89f11033e680c7424a2931ce983ab780 Mon Sep 17 00:00:00 2001 From: Pierre Salagnac Date: Thu, 9 Jul 2026 17:26:47 +0200 Subject: [PATCH 1/2] SOLR-18306: Optimize IndexSchema.getDynamicFieldType() by checking cached fields before matching dynamic patterns. --- .../org/apache/solr/schema/IndexSchema.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java index 9710876c045..05ee9e22869 100644 --- a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java +++ b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java @@ -1368,6 +1368,12 @@ public boolean isDynamicField(String fieldName) { return false; } + // If a field with same name exists in the cache, don't match + // all dynamic field patterns. + if (dynamicFieldCache.getIfPresent(fieldName) != null) { + return true; + } + for (DynamicField df : dynamicFields) { if (df.matches(fieldName)) return true; } @@ -1477,13 +1483,24 @@ public FieldType getFieldTypeNoEx(String fieldName) { * @see #getFieldTypeNoEx */ public FieldType getDynamicFieldType(String fieldName) { - for (DynamicField df : dynamicFields) { - if (df.matches(fieldName)) return df.prototype.getType(); + FieldType type = dynFieldType(fieldName); + if (type != null) { + return type; } + throw new SolrException(ErrorCode.BAD_REQUEST, "undefined field " + fieldName); } private FieldType dynFieldType(String fieldName) { + + // First, lookup for the field name in the dynamic field cache. In case it + // is available there, we save matching all the patterns by retrieving the + // type from it. + SchemaField field = dynamicFieldCache.getIfPresent(fieldName); + if (field != null) { + return field.getType(); + } + for (DynamicField df : dynamicFields) { if (df.matches(fieldName)) return df.prototype.getType(); } From 7af993919cdf7b4fedf1b0fb860ddf25edd0c16d Mon Sep 17 00:00:00 2001 From: Pierre Salagnac Date: Fri, 10 Jul 2026 10:11:50 +0200 Subject: [PATCH 2/2] Changelog --- changelog/unreleased/SOLR-18306-optimize-schema.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 changelog/unreleased/SOLR-18306-optimize-schema.yml diff --git a/changelog/unreleased/SOLR-18306-optimize-schema.yml b/changelog/unreleased/SOLR-18306-optimize-schema.yml new file mode 100644 index 00000000000..b9a6827d569 --- /dev/null +++ b/changelog/unreleased/SOLR-18306-optimize-schema.yml @@ -0,0 +1,8 @@ +title: Optimize IndexSchema.getDynamicFieldType() by checking cached fields before matching dynamic patterns. +type: other +authors: + - name: Pierre Salagnac +links: + - name: SOLR-18306 + url: https://issues.apache.org/jira/browse/SOLR-18306 +