### Elasticsearch Version

8.4

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

any

### Problem Description

unsigned_long field type doesn't work with function_score decay functions, and produces an error:

```
"type" : "parsing_exception",
"reason" : "field [unsigned_long_test] is of type [org.elasticsearch.xpack.unsignedlong.UnsignedLongFieldMapper$UnsignedLongFieldType@10281e68], but only numeric types are supported."
```



### Steps to Reproduce


**1. Create index**
```
PUT numeric-test-mapping
{
  "mappings": {
    "properties": {
      "double_test": {
        "type": "double"
      },
      "unsigned_long_test": {
        "type": "unsigned_long"
      },
      "long_test": {
        "type": "long"
      }
    }
  }
}
```

**2. Create documents with numeric values for the 3 different fields**
```
POST numeric-test-mapping/_doc/
{
  "double_test": 10, 
  "unsigned_long_test": 10,
  "long_test": 10
}
POST numeric-test-mapping/_doc/
{
  "double_test": 11, 
  "unsigned_long_test": 11,
  "long_test": 11
}

POST numeric-test-mapping/_doc/
{
  "double_test": 12, 
  "unsigned_long_test": 12,
  "long_test": 12
}
```

**3. Run search on index created**
```
GET numeric-test-mapping/_search 
{
  "from": 0,
  "size": 10,
  "query": {
    "function_score": {
    "functions": [
        {
            "gauss":{
                "unsigned_long_test":{
                  "scale": 1,
                  "origin": 0
                }
            }
        }]
    }
  }
}
```

### Logs (if relevant)

_No response_
server/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionBuilder.java
if (origin == null || scaleString == null) {
            throw new ElasticsearchParseException(
                "[{}] and [{}] must be set for geo fields.",
                DecayFunctionBuilder.ORIGIN,
                DecayFunctionBuilder.SCALE
            );
        }
        double scale = DistanceUnit.DEFAULT.parse(scaleString, DistanceUnit.DEFAULT);
        double offset = DistanceUnit.DEFAULT.parse(offsetString, DistanceUnit.DEFAULT);
        IndexGeoPointFieldData indexFieldData = context.getForField(fieldType, MappedFieldType.FielddataOperation.SEARCH);
        return new GeoFieldDataScoreFunction(origin, scale, decay, offset, getDecayFunction(), indexFieldData, mode);
    }
    private AbstractDistanceScoreFunction parseDateVariable(
        XContentParser parser,
        SearchExecutionContext context,
        MappedFieldType dateFieldType,
        MultiValueMode mode
    ) throws IOException {
        XContentParser.Token token;
        String parameterName = null;
        String scaleString = null;
        String originString = null;
        String offsetString = "0d";
        double decay = 0.5;
        while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
            if (token == XContentParser.Token.FIELD_NAME) {
                parameterName = parser.currentName();
            } else if (DecayFunctionBuilder.SCALE.equals(parameterName)) {
                scaleString = parser.text();
            } else if (DecayFunctionBuilder.ORIGIN.equals(parameterName)) {