### 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 (distance.advanceExact(docId) == false) {
                        return Explanation.noMatch("No value for the distance");
                    }
                    double value = distance.doubleValue();
                    return Explanation.match(
                        (float) score(docId, subQueryScore.getValue().floatValue()),
                        "Function for field " + getFieldName() + ":",
                        func.explainFunction(getDistanceString(ctx, docId), value, scale)
                    );
                }
            };
        }
        protected abstract String getDistanceString(LeafReaderContext ctx, int docId) throws IOException;
        protected abstract String getFieldName();
        @Override
        protected boolean doEquals(ScoreFunction other) {
            AbstractDistanceScoreFunction distanceScoreFunction = (AbstractDistanceScoreFunction) other;
            return Objects.equals(this.scale, distanceScoreFunction.scale)
                && Objects.equals(this.offset, distanceScoreFunction.offset)
                && Objects.equals(this.mode, distanceScoreFunction.mode)
                && Objects.equals(this.func, distanceScoreFunction.func)
                && Objects.equals(this.getFieldName(), distanceScoreFunction.getFieldName());
        }
        @Override
        protected int doHashCode() {
            return Objects.hash(scale, offset, mode, func, getFieldName());
        }
    }
}