Skip to content

Commit 3fba171

Browse files
zacharymornjimczi
authored andcommitted
Exclude unmapped fields from query max_clause limit (#49523)
Take into account of number of unmapped fields when calculating against limit. Closes #49002
1 parent 451eb1f commit 3fba171

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

server/src/main/java/org/elasticsearch/index/search/QueryParserHelper.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ public static Map<String, Float> resolveMappingFields(QueryShardContext context,
8787
boolean allField = Regex.isMatchAllPattern(fieldEntry.getKey());
8888
boolean multiField = Regex.isSimpleMatchPattern(fieldEntry.getKey());
8989
float weight = fieldEntry.getValue() == null ? 1.0f : fieldEntry.getValue();
90-
Map<String, Float> fieldMap = resolveMappingField(context, fieldEntry.getKey(), weight,
91-
!multiField, !allField, fieldSuffix);
90+
Map<String, Float> fieldMap = resolveMappingField(context, fieldEntry.getKey(), weight, !multiField, !allField, fieldSuffix);
91+
9292
for (Map.Entry<String, Float> field : fieldMap.entrySet()) {
9393
float boost = field.getValue();
9494
if (resolvedFields.containsKey(field.getKey())) {
@@ -97,6 +97,7 @@ public static Map<String, Float> resolveMappingFields(QueryShardContext context,
9797
resolvedFields.put(field.getKey(), boost);
9898
}
9999
}
100+
100101
checkForTooManyFields(resolvedFields, context);
101102
return resolvedFields;
102103
}
@@ -141,8 +142,6 @@ public static Map<String, Float> resolveMappingField(QueryShardContext context,
141142

142143
MappedFieldType fieldType = context.getMapperService().fullName(fieldName);
143144
if (fieldType == null) {
144-
// Note that we don't ignore unmapped fields.
145-
fields.put(fieldName, weight);
146145
continue;
147146
}
148147

server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,35 @@ public void testLimitOnExpandedFields() throws Exception {
295295
+ (CLUSTER_MAX_CLAUSE_COUNT + 1)));
296296
}
297297

298+
// The only expectation for this test is to not throw exception
299+
public void testLimitOnExpandedFieldsButIgnoreUnmappedFields() throws Exception {
300+
XContentBuilder builder = jsonBuilder();
301+
builder.startObject();
302+
builder.startObject("_doc");
303+
builder.startObject("properties");
304+
for (int i = 0; i < CLUSTER_MAX_CLAUSE_COUNT; i++) {
305+
builder.startObject("field" + i).field("type", "text").endObject();
306+
}
307+
builder.endObject(); // properties
308+
builder.endObject(); // type1
309+
builder.endObject();
310+
311+
assertAcked(prepareCreate("ignoreunmappedfields").setMapping(builder));
312+
313+
client().prepareIndex("ignoreunmappedfields").setId("1").setSource("field1", "foo bar baz").get();
314+
refresh();
315+
316+
QueryStringQueryBuilder qb = queryStringQuery("bar");
317+
if (randomBoolean()) {
318+
qb.field("*")
319+
.field("unmappedField1")
320+
.field("unmappedField2")
321+
.field("unmappedField3")
322+
.field("unmappedField4");
323+
}
324+
client().prepareSearch("ignoreunmappedfields").setQuery(qb).get();
325+
}
326+
298327
public void testFieldAlias() throws Exception {
299328
List<IndexRequestBuilder> indexRequests = new ArrayList<>();
300329
indexRequests.add(client().prepareIndex("test").setId("1").setSource("f3", "text", "f2", "one"));

0 commit comments

Comments
 (0)