### Description

Users may see the below log message under various circumstances,

> https://github.com/elastic/elasticsearch/blob/v8.3.3/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java#L899-L906
> Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [FIELD_NAME] in order to load field data by uninverting the inverted index. Note that this can use significant memory.

as people seem to have mentioned this message in [Elasticsearch](https://github.com/elastic/elasticsearch/issues?q=is%3Aissue+%22Text+fields+are+not+optimised+for+operations%22+), [Kibana](https://github.com/elastic/kibana/issues?q=is%3Aissue+%22Text+fields+are+not+optimised+for+operations%22+), and [Beats](https://github.com/elastic/beats/issues?q=is%3Aissue+%22Text+fields+are+not+optimised+for+operations%22+) GH issues as well as at [forums](https://discuss.elastic.co/search?q=%22Text%20fields%20are%20not%20optimised%20for%20operations%22).

I don't intend to suggest revise of this well-known message but want to propose an insertion of contextual information - i.e. field and index name to clarify where to start troubleshooting at a glance.

**Proposal**

```diff
diff --git a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java
index 045be484f09..74df90ffc0f 100644
--- a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java
+++ b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java
@@ -909,7 +909,8 @@ public class TextFieldMapper extends FieldMapper {
             } else if (operation == FielddataOperation.SEARCH) {
                 if (fielddata == false) {
                     throw new IllegalArgumentException(
-                        "Text fields are not optimised for operations that require per-document "
+                        "Field data is disabled on [" + name() + "] in [" + fieldDataContext.fullyQualifiedIndexName() + "]. "
+                            + "Text fields are not optimised for operations that require per-document "
                             + "field data like aggregations and sorting, so these operations are disabled by default. Please use a "
                             + "keyword field instead. Alternatively, set fielddata=true on ["
                             + name()
```

If this proposal sounds reasonable, please let me know, and I will open PRs accordingly. Thanks.
server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java
assertThat(q2, is(new PhraseQuery("field._index_phrase", "three words", "words here")));
        Query q3 = new MatchPhraseQueryBuilder("field", "two words").slop(1).toQuery(searchExecutionContext);
        assertThat(q3, is(new PhraseQuery(1, "field", "two", "words")));
        Query q4 = new MatchPhraseQueryBuilder("field", "singleton").toQuery(searchExecutionContext);
        assertThat(q4, is(new TermQuery(new Term("field", "singleton"))));
        Query q5 = new MatchPhraseQueryBuilder("field", "sparkle a stopword").toQuery(searchExecutionContext);
        assertThat(q5, is(new PhraseQuery.Builder().add(new Term("field", "sparkle")).add(new Term("field", "stopword"), 2).build()));
        MatchQueryParser matchQueryParser = new MatchQueryParser(searchExecutionContext);
        matchQueryParser.setAnalyzer(new MockSynonymAnalyzer());
        Query q6 = matchQueryParser.parse(MatchQueryParser.Type.PHRASE, "synfield", "motor dogs");
        assertThat(
            q6,
            is(
                new MultiPhraseQuery.Builder().add(
                    new Term[] { new Term("synfield._index_phrase", "motor dogs"), new Term("synfield._index_phrase", "motor dog") }
                ).build()
            )
        );
        
        CannedTokenStream cts = new CannedTokenStream(new Token("foo", 1, 0, 2, 2), new Token("bar", 0, 0, 2), new Token("baz", 1, 0, 2));
        Analyzer synonymAnalyzer = new Analyzer() {
            @Override
            protected TokenStreamComponents createComponents(String fieldName) {
                return new TokenStreamComponents(reader -> {}, cts);
            }
        };
        matchQueryParser.setAnalyzer(synonymAnalyzer);
        Query q7 = matchQueryParser.parse(MatchQueryParser.Type.BOOLEAN, "synfield", "foo");
        assertThat(
            q7,