Skip to content

Commit 790f54a

Browse files
Fix _id field fetch issue (#94528)
When queries through the "fields" API, the metadata _id field is not returned consistently due to frequently clearing an internal data cache. This commit fixes this by making copies of those values in the value fetcher so clearing the cache doesn't affect displaying the results in the search hits. Closes #94515
1 parent 7559630 commit 790f54a

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

docs/changelog/94528.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 94528
2+
summary: Fix _id field fetch issue.
3+
area: Search
4+
type: bug
5+
issues: [94515]

server/src/internalClusterTest/java/org/elasticsearch/search/query/SearchQueryIT.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2079,4 +2079,21 @@ public void testIssueFuzzyInsideSpanMulti() {
20792079
SearchResponse response = client().prepareSearch("test").setQuery(query).get();
20802080
assertHitCount(response, 1);
20812081
}
2082+
2083+
public void testFetchIdFieldQuery() {
2084+
createIndex("test");
2085+
int docCount = randomIntBetween(10, 50);
2086+
for (int i = 0; i < docCount; i++) {
2087+
client().prepareIndex("test").setSource("field", "foobarbaz").get();
2088+
}
2089+
ensureGreen();
2090+
refresh();
2091+
2092+
SearchResponse response = client().prepareSearch("test").addFetchField("_id").setSize(docCount).get();
2093+
SearchHit[] hits = response.getHits().getHits();
2094+
assertEquals(docCount, hits.length);
2095+
for (SearchHit hit : hits) {
2096+
assertNotNull(hit.getFields().get("_id").getValue());
2097+
}
2098+
}
20822099
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ public void setNextReader(LeafReaderContext context) {
3838
@Override
3939
public List<Object> fetchValues(Source source, int doc, List<Object> ignoredValues) throws IOException {
4040
leafSearchLookup.setDocument(doc);
41-
return leafSearchLookup.fields().get(fieldname).getValues();
41+
List<Object> values = leafSearchLookup.fields().get(fieldname).getValues();
42+
if (values == null) {
43+
return values;
44+
} else {
45+
return List.copyOf(values);
46+
}
4247
}
4348

4449
}

0 commit comments

Comments
 (0)