### Description

Currently, `text_expansion` queries are limited to using rank_features field types.

As we [brought back sparse_vector](https://github.com/elastic/elasticsearch/issues/98104) field type, we want text_expansion queries to be able to work with `sparse_vector` fields as well.

`rank_features` field type should keep being usable in `text_expansion` queries. We don't want to deprecate until the UI and clients that set this up are ready to migrate to `sparse_vector`.
x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/TextExpansionQueryIT.java
+ "AAAAAAAAAAAAAACEBQAAc2ltcGxlbW9kZWwvY29uc3RhbnRzLnBrbFBLAQIAAAAACAgAAAAAAADRnmdVAgAA"
        + "AAIAAAATAAAAAAAAAAAAAAAAANQFAABzaW1wbGVtb2RlbC92ZXJzaW9uUEsGBiwAAAAAAAAAHgMtAAAAAAAA"
        + "AAAABQAAAAAAAAAFAAAAAAAAAGoBAAAAAAAAUgYAAAAAAABQSwYHAAAAALwHAAAAAAAAAQAAAFBLBQYAAAAABQAFAGoBAABSBgAAAAA=";
    static final long RAW_MODEL_SIZE; 
    static {
        RAW_MODEL_SIZE = Base64.getDecoder().decode(BASE_64_ENCODED_MODEL).length;
    }
    @SuppressWarnings("unchecked")
    public void testTextExpansionQuery() throws IOException {
        String modelId = "text-expansion-test";
        String indexName = modelId + "-index";
        createTextExpansionModel(modelId);
        putModelDefinition(modelId, BASE_64_ENCODED_MODEL, RAW_MODEL_SIZE);
        putVocabulary(
            List.of("these", "are", "my", "words", "the", "washing", "machine", "is", "leaking", "octopus", "comforter", "smells"),
            modelId
        );
        startDeployment(modelId);
        
        
        
        List<String> inputs = List.of(
            "my words comforter",
            "the machine is leaking",
            "these are my words",
            "the octopus comforter smells",
            "the octopus comforter is leaking",
            "washing machine smells"
        );
        List<Map<String, Float>> tokenWeights = new ArrayList<>();