### Environment:
Elasticsearch version:
```
{
    "number" : "7.15.0",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "79d65f6e357953a5b3cbcc5e2c7c21073d89aa29",
    "build_date" : "2021-09-16T03:05:29.143308416Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
}
```
Plugins installed: []
JVM version :1.8
OS version :Windows 10

### Steps to reproduce:
```
PUT test_plain_highlighter 
{}

POST /test_plain_highlighter/_doc/1
{
  "description": [
    "Lorem Ipsum string Generator that helps to create dummy text for all layout needs.",
    "It has roots in a piece of classical Latin literature from 45 BC, making it search string over 2000 years old."
  ]
}

POST /test_plain_highlighter/_search
{
  "highlight": {
    "order": "score",
    "type": "plain",
    "fields": {
      "*": {}
    },
    "fragment_size": 50
  },
  "query": {
    "match": {
      "description": "search string"
    }
  },
  "_source": ""
}
```

### RECEIVED Highlighted Fragment in response:
```
[
   "Lorem Ipsum <em>string</em> Generator that helps to create",
   " literature from 45 BC, making it <em>search</em> <em>string</em> over 2000 years old."
]
```
### EXPECTED Highlighted Fragment:
```
[
   " literature from 45 BC, making it <em>search</em> <em>string</em> over 2000 years old.",
   "Lorem Ipsum <em>string</em> Generator that helps to create"
]
```
test/framework/src/main/java/org/elasticsearch/search/fetch/HighlighterTestCase.java
throws IOException {
        Map<String, HighlightField> highlights = new HashMap<>();
        withLuceneIndex(mapperService, iw -> iw.addDocument(doc.rootDoc()), ir -> {
            SearchExecutionContext context = createSearchExecutionContext(mapperService, new IndexSearcher(ir));
            HighlightPhase highlightPhase = new HighlightPhase(getHighlighters());
            FetchSubPhaseProcessor processor = highlightPhase.getProcessor(fetchContext(context, search));
            FetchSubPhase.HitContext hitContext = new FetchSubPhase.HitContext(new SearchHit(0, "id", null, null), ir.leaves().get(0), 0);
            processor.process(hitContext);
            highlights.putAll(hitContext.hit().getHighlightFields());
        });
        return highlights;
    }
    /**
     * Given a set of highlights, assert that any particular field has the expected fragments
     */
    protected static void assertHighlights(Map<String, HighlightField> highlights, String field, String... fragments) {
        assertNotNull("No highlights reported for field [" + field + "]", highlights.get(field));
        Set<String> actualFragments = Arrays.stream(highlights.get(field).getFragments()).map(Text::toString).collect(Collectors.toSet());
        Set<String> expectedFragments = Set.of(fragments);
        assertEquals(expectedFragments, actualFragments);
    }
    private static FetchContext fetchContext(SearchExecutionContext context, SearchSourceBuilder search) throws IOException {
        FetchContext fetchContext = mock(FetchContext.class);
        when(fetchContext.highlight()).thenReturn(search.highlighter().build(context));
        when(fetchContext.parsedQuery()).thenReturn(new ParsedQuery(search.query().toQuery(context)));
        when(fetchContext.getSearchExecutionContext()).thenReturn(context);
        return fetchContext;
    }
}