### Elasticsearch Version

8.10+

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

Any

### Problem Description

Combining query rules with numeric and fuzzy text matches can lead to errors when fuzzy matches should be matched on.

### Steps to Reproduce

Example script to reproduce: 
```
POST /test/_doc/1
{
  "title": "the old man and the sea"
}

POST /test/_doc/2
{
  "title": "a tale of two cities"
}

POST /test/_doc/3
{
  "title": "the great gatsby"
}

PUT /_query_rules/test-ruleset
{
  "rules": [
    {
      "rule_id": "1",
      "type": "pinned",
      "criteria": [
        {
          "type": "fuzzy",
          "metadata": "foo",
          "values": ["foo"]
        }
      ],
      "actions": {
        "ids": [
          "1"
        ]
      }
    },
    {
      "rule_id": "2",
      "type": "pinned",
      "criteria": [
        {
          "type": "fuzzy",
          "metadata": "foo",
          "values": ["bar", "baz"]
        }
      ],
      "actions": {
        "ids": [
          "2"
        ]
      }
    },
      {
      "rule_id": "3",
      "type": "pinned",
      "criteria": [
        {
          "type": "lte",
          "metadata": "foo",
          "values": [10000]
        }
      ],
      "actions": {
        "ids": [
          "3"
        ]
      }
    }
  ]
}

POST /test/_search
{
  "query": {
    "rule_query": {
      "organic": {
        "multi_match": {
          "query": "fooo" // included a typo
        }
      },
      "match_criteria": {
        "foo": "fooo"
      },
      "ruleset_id": "test-ruleset"
    }
  }
}
```

The rule query returns the following error: 
```
{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Input [fooo] is not valid for CriteriaType [lte]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Input [fooo] is not valid for CriteriaType [lte]"
  },
  "status": 400
}
```

### Logs (if relevant)

_No response_
x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/rules/QueryRule.java
if (criteriaType == ALWAYS || (criteriaMetadata != null && criteriaMetadata.equals(match))) {
                    boolean singleCriterionMatches = criterion.isMatch(matchValue, criteriaType);
                    isRuleMatch = (isRuleMatch == null) ? singleCriterionMatches : isRuleMatch && singleCriterionMatches;
                }
            }
        }
        if (isRuleMatch != null && isRuleMatch) {
            if (actions.containsKey(IDS_FIELD.getPreferredName())) {
                matchingPinnedIds.addAll((List<String>) actions.get(IDS_FIELD.getPreferredName()));
            } else if (actions.containsKey(DOCS_FIELD.getPreferredName())) {
                List<Map<String, String>> docsToPin = (List<Map<String, String>>) actions.get(DOCS_FIELD.getPreferredName());
                List<PinnedQueryBuilder.Item> items = docsToPin.stream()
                    .map(
                        map -> new PinnedQueryBuilder.Item(
                            map.get(INDEX_FIELD.getPreferredName()),
                            map.get(PinnedQueryBuilder.Item.ID_FIELD.getPreferredName())
                        )
                    )
                    .toList();
                matchingPinnedDocs.addAll(items);
            }
        }
        List<String> pinnedIds = appliedRules.pinnedIds();
        List<PinnedQueryBuilder.Item> pinnedDocs = appliedRules.pinnedDocs();
        pinnedIds.addAll(matchingPinnedIds);
        pinnedDocs.addAll(matchingPinnedDocs);
        return new AppliedQueryRules(pinnedIds, pinnedDocs);
    }
}