diff --git a/.gitignore b/.gitignore
index 2a3d0d0beb843d159ea38f86e013462f5b8d2cb9..48503b06cdec29c826fbfca6e3f302346309bdad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 /vendor/
 /phpunit.xml
 /composer.lock
-coverage.xml
\ No newline at end of file
+coverage.xml
+.phpunit.cache
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 65d6b9db99765baee3c77aa5a2f608b234bdc4eb..c8934ae1c8c05dbff79dbc0bd95dee15839a51bf 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,16 +1,10 @@
 sudo: false
 language: php
 php:
-  - 7.1
-  - 7.2
-  - 7.3
-  - 7.4snapshot
-matrix:
-  allow_failures:
-      - php: 7.4snapshot
+  - 8.1
 env:
   global:
-    - ES_VERSION=7.4.0 ES_DOWNLOAD_URL=https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz
+    - ES_VERSION=8.9.0 ES_DOWNLOAD_URL=https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz
 install:
   - wget ${ES_DOWNLOAD_URL}
   - tar -xzf elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..13345fc3cab8dde4b0d737469215c9383a4021ef
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,11 @@
+#!/usr/bin/make
+
+es::
+	docker run \
+          --name elasticsearch \
+          -p 9200:9200 \
+          -e discovery.type=single-node \
+          -e ES_JAVA_OPTS="-Xms1g -Xmx1g"\
+          -e xpack.security.enabled=false \
+          -it \
+          docker.elastic.co/elasticsearch/elasticsearch:8.9.0
\ No newline at end of file
diff --git a/README.md b/README.md
index aa8e0c654d2ff7cd3758a0aa6514da90de123ffa..ff034c3896c3588ffaab41452f71566061805890 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,7 @@
 # ElasticsearchDSL
 
-Introducing Elasticsearch DSL library to provide objective query builder for [Elasticsearch bundle](https://github.com/ongr-io/ElasticsearchBundle) and [elasticsearch-php](https://github.com/elastic/elasticsearch-php) client. You can easily build any Elasticsearch query and transform it to an array.
+Introducing Elasticsearch DSL library to provide objective query builder for [elasticsearch-php](https://github.com/elastic/elasticsearch-php) client. You can easily build any Elasticsearch query and transform it to an array.
 
-If you need any help, [stack overflow](http://stackoverflow.com/questions/tagged/ongr)
-is the preferred and recommended way to ask ONGR support questions.
- 
 [![Build Status](https://travis-ci.org/ongr-io/ElasticsearchDSL.svg?branch=master)](https://travis-ci.org/ongr-io/ElasticsearchDSL)
 [![codecov](https://codecov.io/gh/ongr-io/ElasticsearchDSL/branch/master/graph/badge.svg)](https://codecov.io/gh/ongr-io/ElasticsearchDSL)
 [![Latest Stable Version](https://poser.pugx.org/ongr/elasticsearch-dsl/v/stable)](https://packagist.org/packages/ongr/elasticsearch-dsl)
@@ -18,14 +15,15 @@ If you like this library, help me to develop it by buying a cup of coffee
 
 ## Version matrix
 
-| Elasticsearch version | ElasticsearchDSL version    |
-| --------------------- | --------------------------- |
-| >= 7.0                | >= 7.0                      |
-| >= 6.0, < 7.0         | >= 6.0                      |
-| >= 5.0, < 6.0         | >= 5.0                      |
-| >= 2.0, < 5.0         | >= 2.0 (not supported)      |
-| >= 1.0, < 2.0         | 1.x (not supported)         |
-| <= 0.90.x             | not supported               |
+| Elasticsearch version | ElasticsearchDSL version |
+|-----------------------|--------------------------|
+| >= 8.0                | >= 8.0                   |
+| >= 7.0                | >= 7.0                   |
+| >= 6.0, < 7.0         | >= 6.0                   |
+| >= 5.0, < 6.0         | >= 5.0                   |
+| >= 2.0, < 5.0         | >= 2.0 (not supported)   |
+| >= 1.0, < 2.0         | 1.x (not supported)      |
+| <= 0.90.x             | not supported            |
 
 ## Documentation
 
@@ -38,20 +36,13 @@ If you like this library, help me to develop it by buying a cup of coffee
 Install library with [composer](https://getcomposer.org):
 
 ```bash
-$ composer require ongr/elasticsearch-dsl
+$ composer require bistrosk/elasticsearch-dsl
 ```
 
 > [elasticsearch-php](https://github.com/elastic/elasticsearch-php) client is defined in the composer requirements, no need to install it.
 
 ### Search
 
-Elasticsearch DSL was extracted from [Elasticsearch Bundle](https://github.com/ongr-io/ElasticsearchBundle) to provide standalone query dsl for [elasticsearch-php](https://github.com/elastic/elasticsearch-php). Examples how to use it together with [Elasticsearch Bundle](https://github.com/ongr-io/ElasticsearchBundle) can be found in the [Elasticsearch Bundle docs](https://github.com/ongr-io/ElasticsearchBundle/blob/master/Resources/doc/search.md).
-
-If you dont want to use Symfony or Elasticsearch bundle, no worries, you can use it in any project together with [elasticsearch-php](https://github.com/elastic/elasticsearch-php). Here's the example:
-
-If you are using Symfony there is also the [ElasticsearchBundle](https://github.com/ongr-io/ElasticsearchBundle)
-which provides full integration with Elasticsearch DSL.
-
 The library is standalone and is not coupled with any framework. You can use it in any PHP project, the only
 requirement is composer.  Here's the example:
 
diff --git a/composer.json b/composer.json
index 1cc93d8addeb3a515e3473996ec710f1e48306fa..f96476ae665e7bac35469e92860f42ccc0653cb1 100644
--- a/composer.json
+++ b/composer.json
@@ -1,5 +1,5 @@
 {
-    "name": "ongr/elasticsearch-dsl",
+    "name": "bistrosk/elasticsearch-dsl",
     "description": "Elasticsearch DSL library",
     "type": "library",
     "homepage": "http://ongr.io",
@@ -11,13 +11,13 @@
         }
     ],
     "require": {
-        "php": "^7.0",
-        "symfony/serializer": "^3.0|^4.0",
+        "php": ">=8.1",
+        "symfony/serializer": "^6.0",
         "paragonie/random_compat": "*"
     },
     "require-dev": {
-        "elasticsearch/elasticsearch": "^7.0",
-        "phpunit/phpunit": "~6.0",
+        "elasticsearch/elasticsearch": "^8.0",
+        "phpunit/phpunit": "~10.0",
         "squizlabs/php_codesniffer": "^3.0"
     },
     "suggest": {
@@ -34,9 +34,15 @@
         }
     },
     "minimum-stability": "dev",
+    "prefer-stable": true,
     "extra": {
         "branch-alias": {
-            "dev-master": "7.0-dev"
+            "dev-master": "8.0-dev"
+        }
+    },
+    "config": {
+        "allow-plugins": {
+            "php-http/discovery": true
         }
     }
 }
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 17185e94aee7b2109fcaff7836000e353084ca1c..b3b52c086f4d09560b426f4034d02cc5ef6b4fb1 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,38 +1,31 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<phpunit
-        backupGlobals="false"
-        backupStaticAttributes="false"
-        colors="true"
-        convertErrorsToExceptions="true"
-        convertNoticesToExceptions="true"
-        convertWarningsToExceptions="true"
-        processIsolation="false"
-        stopOnFailure="false"
-        syntaxCheck="false"
-        bootstrap="vendor/autoload.php">
-
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" backupGlobals="false" colors="true"
+         processIsolation="false" stopOnFailure="false" bootstrap="vendor/autoload.php"
+         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.2/phpunit.xsd" cacheDirectory=".phpunit.cache">
+    <coverage>
+        <report>
+            <text outputFile="php://stdout" showOnlySummary="true"/>
+        </report>
+    </coverage>
     <testsuites>
         <testsuite name="Unit">
             <directory>./tests/Unit/</directory>
         </testsuite>
-        <testsuite name="Functional">
-            <directory>./tests/Functional/</directory>
-        </testsuite>
-        <testsuite name="All">
-            <directory>./tests/</directory>
-        </testsuite>
+        <!--        <testsuite name="Functional">-->
+        <!--            <directory>./tests/Functional/</directory>-->
+        <!--        </testsuite>-->
+        <!--        <testsuite name="All">-->
+        <!--            <directory>./tests/</directory>-->
+        <!--        </testsuite>-->
     </testsuites>
-
-    <filter>
-        <whitelist>
+    <logging/>
+    <source>
+        <include>
             <directory>./</directory>
-            <exclude>
-                <directory>./tests</directory>
-                <directory>./vendor</directory>
-            </exclude>
-        </whitelist>
-    </filter>
-    <logging>
-        <log type="coverage-text" target="php://stdout" showOnlySummary="true"/>
-    </logging>
+        </include>
+        <exclude>
+            <directory>./tests</directory>
+            <directory>./vendor</directory>
+        </exclude>
+    </source>
 </phpunit>
diff --git a/src/Aggregation/AbstractAggregation.php b/src/Aggregation/AbstractAggregation.php
index c2fbe984e13f981a402e83f9a08ef4406c6ffe7e..a2dd13195f7db0ffb949658001704b53c6f59ca0 100644
--- a/src/Aggregation/AbstractAggregation.php
+++ b/src/Aggregation/AbstractAggregation.php
@@ -29,29 +29,26 @@ abstract class AbstractAggregation implements NamedBuilderInterface
      */
     private $field;
 
-    /**
-     * @var BuilderBag
-     */
-    private $aggregations;
+    private ?BuilderBag $aggregations = null;
 
     /**
      * Abstract supportsNesting method.
      *
      * @return bool
      */
-    abstract protected function supportsNesting();
+    abstract protected function supportsNesting(): bool;
 
     /**
      * @return array|\stdClass
      */
-    abstract protected function getArray();
+    abstract public function getArray(): array;
 
     /**
      * Inner aggregations container init.
      *
      * @param string $name
      */
-    public function __construct($name)
+    public function __construct(string $name)
     {
         $this->setName($name);
     }
@@ -79,13 +76,12 @@ abstract class AbstractAggregation implements NamedBuilderInterface
     /**
      * Adds a sub-aggregation.
      *
-     * @param AbstractAggregation $abstractAggregation
      *
      * @return $this
      */
     public function addAggregation(AbstractAggregation $abstractAggregation)
     {
-        if (!$this->aggregations) {
+        if (!$this->aggregations instanceof BuilderBag) {
             $this->aggregations = $this->createBuilderBag();
         }
 
@@ -101,7 +97,7 @@ abstract class AbstractAggregation implements NamedBuilderInterface
      */
     public function getAggregations()
     {
-        if ($this->aggregations) {
+        if ($this->aggregations instanceof BuilderBag) {
             return $this->aggregations->all();
         } else {
             return [];
@@ -126,11 +122,11 @@ abstract class AbstractAggregation implements NamedBuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $array = $this->getArray();
         $result = [
-            $this->getType() => is_array($array) ? $this->processArray($array) : $array,
+            $this->getType() => $this->processArray($array),
         ];
 
         if ($this->supportsNesting()) {
diff --git a/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php b/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php
index 632f0b59f778b641fd0ed66bcff4cc83a4e91f1a..9bbcdc8d614c664e45c4dc988b520a543db0cbbc 100644
--- a/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php
+++ b/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php
@@ -22,14 +22,14 @@ use ONGR\ElasticsearchDSL\BuilderInterface;
  */
 class AdjacencyMatrixAggregation extends AbstractAggregation
 {
-    const FILTERS = 'filters';
+    final public const FILTERS = 'filters';
 
     use BucketingTrait;
 
     /**
      * @var BuilderInterface[]
      */
-    private $filters = [
+    private array $filters = [
         self::FILTERS => []
     ];
 
@@ -39,7 +39,7 @@ class AdjacencyMatrixAggregation extends AbstractAggregation
      * @param string             $name
      * @param BuilderInterface[] $filters
      */
-    public function __construct($name, $filters = [])
+    public function __construct(string $name, array $filters = [])
     {
         parent::__construct($name);
 
@@ -49,14 +49,9 @@ class AdjacencyMatrixAggregation extends AbstractAggregation
     }
 
     /**
-     * @param string           $name
-     * @param BuilderInterface $filter
-     *
      * @throws \LogicException
-     *
-     * @return self
      */
-    public function addFilter($name, BuilderInterface $filter)
+    public function addFilter(string $name, BuilderInterface $filter): static
     {
         $this->filters[self::FILTERS][$name] = $filter->toArray();
 
@@ -66,7 +61,7 @@ class AdjacencyMatrixAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         return $this->filters;
     }
@@ -74,7 +69,7 @@ class AdjacencyMatrixAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'adjacency_matrix';
     }
diff --git a/src/Aggregation/Bucketing/AutoDateHistogramAggregation.php b/src/Aggregation/Bucketing/AutoDateHistogramAggregation.php
index 6a204465b15c8fd71d3d19f5c1121547491f8561..7e97b0de4677afbc9134b1e83c680bd536a0588e 100644
--- a/src/Aggregation/Bucketing/AutoDateHistogramAggregation.php
+++ b/src/Aggregation/Bucketing/AutoDateHistogramAggregation.php
@@ -32,7 +32,7 @@ class AutoDateHistogramAggregation extends AbstractAggregation
      * @param int    $buckets
      * @param string $format
      */
-    public function __construct($name, $field, $buckets = null, $format = null)
+    public function __construct(string $name, $field, $buckets = null, $format = null)
     {
         parent::__construct($name);
 
@@ -50,21 +50,19 @@ class AutoDateHistogramAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        $data = array_filter(
+        return array_filter(
             [
                 'field' => $this->getField(),
             ]
         );
-
-        return $data;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'auto_date_histogram';
     }
diff --git a/src/Aggregation/Bucketing/ChildrenAggregation.php b/src/Aggregation/Bucketing/ChildrenAggregation.php
index f36802aa3b2ca72adaeef219b1ee9bdbd5befdcd..f81a192f1cedb41f2e59f4bebf190de30544a0b6 100644
--- a/src/Aggregation/Bucketing/ChildrenAggregation.php
+++ b/src/Aggregation/Bucketing/ChildrenAggregation.php
@@ -23,48 +23,31 @@ class ChildrenAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    /**
-     * @var string
-     */
-    private $children;
-
-    /**
-     * Return children.
-     *
-     * @return string
-     */
-    public function getChildren()
-    {
-        return $this->children;
-    }
+    private ?string $children;
 
-    /**
-     * @param string $name
-     * @param string $children
-     */
-    public function __construct($name, $children = null)
+    public function __construct(string $name, ?string $children = null)
     {
         parent::__construct($name);
 
         $this->setChildren($children);
     }
 
-    /**
-     * @param string $children
-     *
-     * @return $this
-     */
-    public function setChildren($children)
+    public function setChildren(?string $children): static
     {
         $this->children = $children;
 
         return $this;
     }
 
+    public function getChildren(): ?string
+    {
+        return $this->children;
+    }
+
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'children';
     }
@@ -72,10 +55,10 @@ class ChildrenAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         if (count($this->getAggregations()) == 0) {
-            throw new \LogicException("Children aggregation `{$this->getName()}` has no aggregations added");
+            throw new \LogicException(sprintf('Children aggregation `%s` has no aggregations added', $this->getName()));
         }
 
         return ['type' => $this->getChildren()];
diff --git a/src/Aggregation/Bucketing/CompositeAggregation.php b/src/Aggregation/Bucketing/CompositeAggregation.php
index 8f1f8d8a633a7023f7e8102a1f372b46cc4abbe7..01d58b0983da3400ecfedf860e64624a4c115bec 100644
--- a/src/Aggregation/Bucketing/CompositeAggregation.php
+++ b/src/Aggregation/Bucketing/CompositeAggregation.php
@@ -27,25 +27,15 @@ class CompositeAggregation extends AbstractAggregation
     /**
      * @var BuilderInterface[]
      */
-    private $sources = [];
+    private array $sources = [];
 
-    /**
-     * @var int
-     */
-    private $size;
-
-    /**
-     * @var array
-     */
-    private $after;
+    private ?int $size = null;
+    private ?array $after = null;
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string             $name
-     * @param AbstractAggregation[] $sources
      */
-    public function __construct($name, $sources = [])
+    public function __construct(string $name, array $sources = [])
     {
         parent::__construct($name);
 
@@ -55,13 +45,9 @@ class CompositeAggregation extends AbstractAggregation
     }
 
     /**
-     * @param AbstractAggregation $agg
-     *
      * @throws \LogicException
-     *
-     * @return self
      */
-    public function addSource(AbstractAggregation $agg)
+    public function addSource(AbstractAggregation $agg): static
     {
         $array = $agg->getArray();
 
@@ -77,7 +63,7 @@ class CompositeAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $array = [
             'sources' => $this->sources,
@@ -97,55 +83,31 @@ class CompositeAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'composite';
     }
 
-    /**
-     * Sets size
-     *
-     * @param int $size Size
-     *
-     * @return $this
-     */
-    public function setSize($size)
+    public function setSize(int $size): static
     {
         $this->size = $size;
 
         return $this;
     }
 
-    /**
-     * Returns size
-     *
-     * @return int
-     */
-    public function getSize()
+    public function getSize(): ?int
     {
         return $this->size;
     }
 
-    /**
-     * Sets after
-     *
-     * @param array $after After
-     *
-     * @return $this
-     */
-    public function setAfter(array $after)
+    public function setAfter(array $after): static
     {
         $this->after = $after;
 
         return $this;
     }
 
-    /**
-     * Returns after
-     *
-     * @return array
-     */
-    public function getAfter()
+    public function getAfter(): ?array
     {
         return $this->after;
     }
diff --git a/src/Aggregation/Bucketing/DateHistogramAggregation.php b/src/Aggregation/Bucketing/DateHistogramAggregation.php
index 352b816733243c2cd5bdae78afcd0d1cf145db1e..abea7fc847727026cb309337154c5f4080c9039a 100644
--- a/src/Aggregation/Bucketing/DateHistogramAggregation.php
+++ b/src/Aggregation/Bucketing/DateHistogramAggregation.php
@@ -23,24 +23,13 @@ class DateHistogramAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    /**
-     * @var string
-     */
-    protected $interval;
-
-    /**
-     * @var string
-     */
-    protected $format;
+    protected ?string $interval;
+    protected ?string $format;
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string $name
-     * @param string $field
-     * @param string $interval
      */
-    public function __construct($name, $field = null, $interval = null, $format = null)
+    public function __construct(string $name, ?string $field = null, ?string $interval = null, ?string $format = null)
     {
         parent::__construct($name);
 
@@ -49,32 +38,19 @@ class DateHistogramAggregation extends AbstractAggregation
         $this->setFormat($format);
     }
 
-    /**
-     * @return int
-     */
-    public function getInterval()
+    public function getInterval(): ?string
     {
         return $this->interval;
     }
 
-    /**
-     * @param string $interval
-     *
-     * @return $this
-     */
-    public function setInterval($interval)
+    public function setInterval(?string $interval): static
     {
         $this->interval = $interval;
 
         return $this;
     }
 
-    /**
-     * @param string $format
-     *
-     * @return $this
-     */
-    public function setFormat($format)
+    public function setFormat(?string $format): static
     {
         $this->format = $format;
 
@@ -84,7 +60,7 @@ class DateHistogramAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'date_histogram';
     }
@@ -92,7 +68,7 @@ class DateHistogramAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         if (!$this->getField() || !$this->getInterval()) {
             throw new \LogicException('Date histogram aggregation must have field and interval set.');
diff --git a/src/Aggregation/Bucketing/DateRangeAggregation.php b/src/Aggregation/Bucketing/DateRangeAggregation.php
index 3ca14e29f9b6a1586d16bc219e0771334a015aab..9197a9c7c9c2850fa2261067f9bb9820f1be7495 100644
--- a/src/Aggregation/Bucketing/DateRangeAggregation.php
+++ b/src/Aggregation/Bucketing/DateRangeAggregation.php
@@ -23,29 +23,11 @@ class DateRangeAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    /**
-     * @var string
-     */
-    private $format;
-
-    /**
-     * @var array
-     */
-    private $ranges = [];
+    private ?string $format;
+    private array $ranges = [];
+    private bool $keyed = false;
 
-    /**
-     * @var bool
-     */
-    private $keyed = false;
-
-    /**
-     * @param string $name
-     * @param string $field
-     * @param string $format
-     * @param array  $ranges
-     * @param bool   $keyed
-     */
-    public function __construct($name, $field = null, $format = null, array $ranges = [], $keyed = false)
+    public function __construct(string $name, ?string $field = null, ?string $format = null, array $ranges = [], bool $keyed = false)
     {
         parent::__construct($name);
 
@@ -53,9 +35,9 @@ class DateRangeAggregation extends AbstractAggregation
         $this->setFormat($format);
         $this->setKeyed($keyed);
         foreach ($ranges as $range) {
-            $from = isset($range['from']) ? $range['from'] : null;
-            $to = isset($range['to']) ? $range['to'] : null;
-            $key = isset($range['key']) ? $range['key'] : null;
+            $from = $range['from'] ?? null;
+            $to = $range['to'] ?? null;
+            $key = $range['key'] ?? null;
             $this->addRange($from, $to, $key);
         }
     }
@@ -63,29 +45,21 @@ class DateRangeAggregation extends AbstractAggregation
     /**
      * Sets if result buckets should be keyed.
      *
-     * @param bool $keyed
-     *
      * @return DateRangeAggregation
      */
-    public function setKeyed($keyed)
+    public function setKeyed(bool $keyed): static
     {
         $this->keyed = $keyed;
 
         return $this;
     }
 
-    /**
-     * @return string
-     */
-    public function getFormat()
+    public function getFormat(): ?string
     {
         return $this->format;
     }
 
-    /**
-     * @param string $format
-     */
-    public function setFormat($format)
+    public function setFormat(?string $format): void
     {
         $this->format = $format;
     }
@@ -101,7 +75,7 @@ class DateRangeAggregation extends AbstractAggregation
      *
      * @throws \LogicException
      */
-    public function addRange($from = null, $to = null, $key = null)
+    public function addRange(mixed $from = null, mixed $to = null, mixed $key = null): static
     {
         $range = array_filter(
             [
@@ -109,9 +83,7 @@ class DateRangeAggregation extends AbstractAggregation
                 'to' => $to,
                 'key' => $key,
             ],
-            function ($v) {
-                return !is_null($v);
-            }
+            static fn($v): bool => !is_null($v)
         );
 
         if (empty($range)) {
@@ -126,25 +98,24 @@ class DateRangeAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         if ($this->getField() && $this->getFormat() && !empty($this->ranges)) {
-            $data = [
+            return [
                 'format' => $this->getFormat(),
                 'field' => $this->getField(),
                 'ranges' => $this->ranges,
                 'keyed' => $this->keyed,
             ];
-
-            return $data;
         }
+
         throw new \LogicException('Date range aggregation must have field, format set and range added.');
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'date_range';
     }
diff --git a/src/Aggregation/Bucketing/DiversifiedSamplerAggregation.php b/src/Aggregation/Bucketing/DiversifiedSamplerAggregation.php
index b16ae9de280027ccdf93373259b7a636830407dc..b00793c4114b7d003c89e09408f9316fda9b57a8 100644
--- a/src/Aggregation/Bucketing/DiversifiedSamplerAggregation.php
+++ b/src/Aggregation/Bucketing/DiversifiedSamplerAggregation.php
@@ -36,7 +36,7 @@ class DiversifiedSamplerAggregation extends AbstractAggregation
      * @param string $field Elasticsearch field name
      * @param int $shardSize Shard size, by default it's 100
      */
-    public function __construct($name, $field = null, $shardSize = null)
+    public function __construct(string $name, $field = null, $shardSize = null)
     {
         parent::__construct($name);
 
@@ -53,11 +53,9 @@ class DiversifiedSamplerAggregation extends AbstractAggregation
     }
 
     /**
-     * @param mixed $shardSize
-     *
      * @return $this
      */
-    public function setShardSize($shardSize)
+    public function setShardSize(mixed $shardSize)
     {
         $this->shardSize = $shardSize;
 
@@ -67,7 +65,7 @@ class DiversifiedSamplerAggregation extends AbstractAggregation
     /**
      * @inheritdoc
      */
-    public function getType()
+    public function getType(): string
     {
         return 'diversified_sampler';
     }
@@ -75,15 +73,13 @@ class DiversifiedSamplerAggregation extends AbstractAggregation
     /**
      * @inheritdoc
      */
-    protected function getArray()
+    public function getArray(): array
     {
-        $out = array_filter(
+        return array_filter(
             [
                 'field' => $this->getField(),
                 'shard_size' => $this->getShardSize(),
             ]
         );
-
-        return $out;
     }
 }
diff --git a/src/Aggregation/Bucketing/FilterAggregation.php b/src/Aggregation/Bucketing/FilterAggregation.php
index c7d1fa9d035696390d396d940651469760fbb4e0..dff3d33b9bc545ece1296e08d07bb959686e494b 100644
--- a/src/Aggregation/Bucketing/FilterAggregation.php
+++ b/src/Aggregation/Bucketing/FilterAggregation.php
@@ -24,32 +24,24 @@ class FilterAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    /**
-     * @var BuilderInterface
-     */
-    protected $filter;
+    protected ?BuilderInterface $filter = null;
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string           $name
-     * @param BuilderInterface $filter
      */
-    public function __construct($name, BuilderInterface $filter = null)
+    public function __construct(string $name, ?BuilderInterface $filter = null)
     {
         parent::__construct($name);
 
-        if ($filter !== null) {
+        if ($filter instanceof BuilderInterface) {
             $this->setFilter($filter);
         }
     }
 
     /**
-     * @param BuilderInterface $filter
-     *
      * @return $this
      */
-    public function setFilter(BuilderInterface $filter)
+    public function setFilter(BuilderInterface $filter): static
     {
         $this->filter = $filter;
 
@@ -58,10 +50,8 @@ class FilterAggregation extends AbstractAggregation
 
     /**
      * Returns a filter.
-     *
-     * @return BuilderInterface
      */
-    public function getFilter()
+    public function getFilter(): ?BuilderInterface
     {
         return $this->filter;
     }
@@ -69,7 +59,7 @@ class FilterAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function setField($field)
+    public function setField($field): void
     {
         throw new \LogicException("Filter aggregation, doesn't support `field` parameter");
     }
@@ -77,10 +67,10 @@ class FilterAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         if (!$this->filter) {
-            throw new \LogicException("Filter aggregation `{$this->getName()}` has no filter added");
+            throw new \LogicException(sprintf('Filter aggregation `%s` has no filter added', $this->getName()));
         }
 
         return $this->getFilter()->toArray();
@@ -89,7 +79,7 @@ class FilterAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'filter';
     }
diff --git a/src/Aggregation/Bucketing/FiltersAggregation.php b/src/Aggregation/Bucketing/FiltersAggregation.php
index 9bd52c6aafb13f1badd108057903821107505ee1..ead56bbabe90a533f21aa3c3d2f2b6e5b34b3803 100644
--- a/src/Aggregation/Bucketing/FiltersAggregation.php
+++ b/src/Aggregation/Bucketing/FiltersAggregation.php
@@ -27,12 +27,9 @@ class FiltersAggregation extends AbstractAggregation
     /**
      * @var BuilderInterface[]
      */
-    private $filters = [];
+    private ?array $filters = [];
 
-    /**
-     * @var bool
-     */
-    private $anonymous = false;
+    private bool $anonymous = false;
 
     /**
      * Inner aggregations container init.
@@ -41,7 +38,7 @@ class FiltersAggregation extends AbstractAggregation
      * @param BuilderInterface[] $filters
      * @param bool               $anonymous
      */
-    public function __construct($name, $filters = [], $anonymous = false)
+    public function __construct(string $name, array $filters = [], bool $anonymous = false)
     {
         parent::__construct($name);
 
@@ -55,12 +52,7 @@ class FiltersAggregation extends AbstractAggregation
         }
     }
 
-    /**
-     * @param bool $anonymous
-     *
-     * @return $this
-     */
-    public function setAnonymous($anonymous)
+    public function setAnonymous(bool $anonymous): static
     {
         $this->anonymous = $anonymous;
 
@@ -68,14 +60,9 @@ class FiltersAggregation extends AbstractAggregation
     }
 
     /**
-     * @param BuilderInterface $filter
-     * @param string           $name
-     *
      * @throws \LogicException
-     *
-     * @return FiltersAggregation
      */
-    public function addFilter(BuilderInterface $filter, $name = '')
+    public function addFilter(BuilderInterface $filter, string $name = ''): static
     {
         if ($this->anonymous === false && empty($name)) {
             throw new \LogicException('In not anonymous filters filter name must be set.');
@@ -91,7 +78,7 @@ class FiltersAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         return $this->filters;
     }
@@ -99,7 +86,7 @@ class FiltersAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'filters';
     }
diff --git a/src/Aggregation/Bucketing/GeoDistanceAggregation.php b/src/Aggregation/Bucketing/GeoDistanceAggregation.php
index 81db370da50a9492aa5805abd18b3b5d0038cbea..f9857d8dc9a98ade0e3861fe44b2b841e5f1b75e 100644
--- a/src/Aggregation/Bucketing/GeoDistanceAggregation.php
+++ b/src/Aggregation/Bucketing/GeoDistanceAggregation.php
@@ -23,25 +23,10 @@ class GeoDistanceAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    /**
-     * @var mixed
-     */
-    private $origin;
-
-    /**
-     * @var string
-     */
-    private $distanceType;
-
-    /**
-     * @var string
-     */
-    private $unit;
-
-    /**
-     * @var array
-     */
-    private $ranges = [];
+    private mixed $origin;
+    private ?string $distanceType;
+    private ?string $unit;
+    private array $ranges = [];
 
     /**
      * Inner aggregations container init.
@@ -53,65 +38,47 @@ class GeoDistanceAggregation extends AbstractAggregation
      * @param string $unit
      * @param string $distanceType
      */
-    public function __construct($name, $field = null, $origin = null, $ranges = [], $unit = null, $distanceType = null)
+    public function __construct(string $name, ?string $field = null, mixed $origin = null, array $ranges = [], ?string $unit = null, ?string $distanceType = null)
     {
         parent::__construct($name);
 
         $this->setField($field);
         $this->setOrigin($origin);
         foreach ($ranges as $range) {
-            $from = isset($range['from']) ? $range['from'] : null;
-            $to = isset($range['to']) ? $range['to'] : null;
+            $from = $range['from'] ?? null;
+            $to = $range['to'] ?? null;
             $this->addRange($from, $to);
         }
+
         $this->setUnit($unit);
         $this->setDistanceType($distanceType);
     }
 
-    /**
-     * @return string
-     */
-    public function getOrigin()
+    public function getOrigin(): ?string
     {
         return $this->origin;
     }
 
-    /**
-     * @param mixed $origin
-     *
-     * @return $this
-     */
-    public function setOrigin($origin)
+    public function setOrigin(mixed $origin): static
     {
         $this->origin = $origin;
 
         return $this;
     }
 
-    /**
-     * @return string
-     */
-    public function getDistanceType()
+    public function getDistanceType(): ?string
     {
         return $this->distanceType;
     }
 
-    /**
-     * @param string $distanceType
-     *
-     * @return $this
-     */
-    public function setDistanceType($distanceType)
+    public function setDistanceType(?string $distanceType): static
     {
         $this->distanceType = $distanceType;
 
         return $this;
     }
 
-    /**
-     * @return string
-     */
-    public function getUnit()
+    public function getUnit(): ?string
     {
         return $this->unit;
     }
@@ -121,7 +88,7 @@ class GeoDistanceAggregation extends AbstractAggregation
      *
      * @return $this
      */
-    public function setUnit($unit)
+    public function setUnit(?string $unit): static
     {
         $this->unit = $unit;
 
@@ -131,23 +98,16 @@ class GeoDistanceAggregation extends AbstractAggregation
     /**
      * Add range to aggregation.
      *
-     * @param int|float|null $from
-     * @param int|float|null $to
-     *
      * @throws \LogicException
-     *
-     * @return GeoDistanceAggregation
      */
-    public function addRange($from = null, $to = null)
+    public function addRange(mixed $from = null, mixed $to = null): static
     {
         $range = array_filter(
             [
                 'from' => $from,
                 'to' => $to,
             ],
-            function ($v) {
-                return !is_null($v);
-            }
+            static fn($v): bool => !is_null($v)
         );
 
         if (empty($range)) {
@@ -162,7 +122,7 @@ class GeoDistanceAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $data = [];
 
@@ -194,7 +154,7 @@ class GeoDistanceAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'geo_distance';
     }
diff --git a/src/Aggregation/Bucketing/GeoHashGridAggregation.php b/src/Aggregation/Bucketing/GeoHashGridAggregation.php
index 613026a7585da013bc4612666cf296b51f2e35dd..4199342409ff88090c3a5fbb7ad1e22899309dc0 100644
--- a/src/Aggregation/Bucketing/GeoHashGridAggregation.php
+++ b/src/Aggregation/Bucketing/GeoHashGridAggregation.php
@@ -47,7 +47,7 @@ class GeoHashGridAggregation extends AbstractAggregation
      * @param int    $size
      * @param int    $shardSize
      */
-    public function __construct($name, $field = null, $precision = null, $size = null, $shardSize = null)
+    public function __construct(string $name, $field = null, $precision = null, $size = null, $shardSize = null)
     {
         parent::__construct($name);
 
@@ -120,7 +120,7 @@ class GeoHashGridAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $data = [];
 
@@ -148,7 +148,7 @@ class GeoHashGridAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'geohash_grid';
     }
diff --git a/src/Aggregation/Bucketing/GlobalAggregation.php b/src/Aggregation/Bucketing/GlobalAggregation.php
index badd85cdb25ef2113ffef50adbdd512bd1fd5c2a..4e4fac3fd1d12d394dc09f835df6051cad476e0b 100644
--- a/src/Aggregation/Bucketing/GlobalAggregation.php
+++ b/src/Aggregation/Bucketing/GlobalAggregation.php
@@ -26,7 +26,7 @@ class GlobalAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function setField($field)
+    public function setField($field): void
     {
         throw new \LogicException("Global aggregation, doesn't support `field` parameter");
     }
@@ -34,7 +34,7 @@ class GlobalAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'global';
     }
@@ -42,8 +42,8 @@ class GlobalAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        return new \stdClass();
+        return [];
     }
 }
diff --git a/src/Aggregation/Bucketing/HistogramAggregation.php b/src/Aggregation/Bucketing/HistogramAggregation.php
index f23875855a6dc9054fbf5d2fb7cd0569feb545ab..eb842377b2170dc65206b3fa4a62e631671cba05 100644
--- a/src/Aggregation/Bucketing/HistogramAggregation.php
+++ b/src/Aggregation/Bucketing/HistogramAggregation.php
@@ -23,8 +23,8 @@ class HistogramAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    const DIRECTION_ASC = 'asc';
-    const DIRECTION_DESC = 'desc';
+    final public const DIRECTION_ASC = 'asc';
+    final public const DIRECTION_DESC = 'desc';
 
     /**
      * @var int
@@ -198,13 +198,10 @@ class HistogramAggregation extends AbstractAggregation
      */
     public function setExtendedBounds($min = null, $max = null)
     {
-        $bounds = array_filter(
-            [
-                'min' => $min,
-                'max' => $max,
-            ],
-            'strlen'
-        );
+        $bounds = [
+            'min' => $min ?? '',
+            'max' => $max ?? '',
+        ];
         $this->extendedBounds = $bounds;
 
         return $this;
@@ -213,7 +210,7 @@ class HistogramAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'histogram';
     }
@@ -221,7 +218,7 @@ class HistogramAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $out = array_filter(
             [
@@ -232,9 +229,7 @@ class HistogramAggregation extends AbstractAggregation
                 'keyed' => $this->isKeyed(),
                 'order' => $this->getOrder(),
             ],
-            function ($val) {
-                return ($val || is_numeric($val));
-            }
+            static fn($val): bool => $val || is_numeric($val)
         );
         $this->checkRequiredParameters($out, ['field', 'interval']);
 
diff --git a/src/Aggregation/Bucketing/Ipv4RangeAggregation.php b/src/Aggregation/Bucketing/Ipv4RangeAggregation.php
index 0579aaf88f8f7b0076ef93e9a1d115a2066d6bf2..7538896ebabc3f7347cc75f32f6e2d7ec1ffe66a 100644
--- a/src/Aggregation/Bucketing/Ipv4RangeAggregation.php
+++ b/src/Aggregation/Bucketing/Ipv4RangeAggregation.php
@@ -23,27 +23,20 @@ class Ipv4RangeAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    /**
-     * @var array
-     */
-    private $ranges = [];
+    private array $ranges = [];
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string $name
-     * @param string $field
-     * @param array  $ranges
      */
-    public function __construct($name, $field = null, $ranges = [])
+    public function __construct(string $name, ?string $field = null, array $ranges = [])
     {
         parent::__construct($name);
 
         $this->setField($field);
         foreach ($ranges as $range) {
             if (is_array($range)) {
-                $from = isset($range['from']) ? $range['from'] : null;
-                $to = isset($range['to']) ? $range['to'] : null;
+                $from = $range['from'] ?? null;
+                $to = $range['to'] ?? null;
                 $this->addRange($from, $to);
             } else {
                 $this->addMask($range);
@@ -53,22 +46,15 @@ class Ipv4RangeAggregation extends AbstractAggregation
 
     /**
      * Add range to aggregation.
-     *
-     * @param string|null $from
-     * @param string|null $to
-     *
-     * @return Ipv4RangeAggregation
      */
-    public function addRange($from = null, $to = null)
+    public function addRange(mixed $from = null, mixed $to = null): static
     {
         $range = array_filter(
             [
                 'from' => $from,
                 'to' => $to,
             ],
-            function ($v) {
-                return !is_null($v);
-            }
+            static fn($v): bool => !is_null($v)
         );
 
         $this->ranges[] = $range;
@@ -78,12 +64,8 @@ class Ipv4RangeAggregation extends AbstractAggregation
 
     /**
      * Add ip mask to aggregation.
-     *
-     * @param string $mask
-     *
-     * @return Ipv4RangeAggregation
      */
-    public function addMask($mask)
+    public function addMask(string $mask): static
     {
         $this->ranges[] = ['mask' => $mask];
 
@@ -93,7 +75,7 @@ class Ipv4RangeAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'ip_range';
     }
@@ -101,7 +83,7 @@ class Ipv4RangeAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         if ($this->getField() && !empty($this->ranges)) {
             return [
@@ -109,6 +91,7 @@ class Ipv4RangeAggregation extends AbstractAggregation
                 'ranges' => array_values($this->ranges),
             ];
         }
+
         throw new \LogicException('Ip range aggregation must have field set and range added.');
     }
 }
diff --git a/src/Aggregation/Bucketing/MissingAggregation.php b/src/Aggregation/Bucketing/MissingAggregation.php
index 2cffa14b44ccf62d1416b4a82ce148b3e1f2a2b7..c3eb5cc3293fbf3401deef9f1c99077e2caef0e7 100644
--- a/src/Aggregation/Bucketing/MissingAggregation.php
+++ b/src/Aggregation/Bucketing/MissingAggregation.php
@@ -25,11 +25,8 @@ class MissingAggregation extends AbstractAggregation
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string $name
-     * @param string $field
      */
-    public function __construct($name, $field = null)
+    public function __construct(string $name, mixed $field = null)
     {
         parent::__construct($name);
 
@@ -39,18 +36,19 @@ class MissingAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         if ($this->getField()) {
             return ['field' => $this->getField()];
         }
+
         throw new \LogicException('Missing aggregation must have a field set.');
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'missing';
     }
diff --git a/src/Aggregation/Bucketing/NestedAggregation.php b/src/Aggregation/Bucketing/NestedAggregation.php
index 39e3d9e2de5387c2e41a3d3a69f41924c83bb3d4..e54ea12dd45cf2de4ef77316388ca161a5b3cb5f 100644
--- a/src/Aggregation/Bucketing/NestedAggregation.php
+++ b/src/Aggregation/Bucketing/NestedAggregation.php
@@ -34,7 +34,7 @@ class NestedAggregation extends AbstractAggregation
      * @param string $name
      * @param string $path
      */
-    public function __construct($name, $path = null)
+    public function __construct(string $name, $path = null)
     {
         parent::__construct($name);
 
@@ -66,7 +66,7 @@ class NestedAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'nested';
     }
@@ -74,7 +74,7 @@ class NestedAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         return ['path' => $this->getPath()];
     }
diff --git a/src/Aggregation/Bucketing/RangeAggregation.php b/src/Aggregation/Bucketing/RangeAggregation.php
index e86faedfc17ebf44e8afe63f43713b87eeafbf05..12aaf419eede405bbc9bcc0fe97f09d824373975 100644
--- a/src/Aggregation/Bucketing/RangeAggregation.php
+++ b/src/Aggregation/Bucketing/RangeAggregation.php
@@ -23,46 +23,30 @@ class RangeAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    /**
-     * @var array
-     */
-    private $ranges = [];
-
-    /**
-     * @var bool
-     */
-    private $keyed = false;
+    private array $ranges = [];
+    private bool $keyed = false;
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string $name
-     * @param string $field
-     * @param array  $ranges
-     * @param bool   $keyed
      */
-    public function __construct($name, $field = null, $ranges = [], $keyed = false)
+    public function __construct(string $name, ?string $field = null, array $ranges = [], bool $keyed = false)
     {
         parent::__construct($name);
 
         $this->setField($field);
         $this->setKeyed($keyed);
         foreach ($ranges as $range) {
-            $from = isset($range['from']) ? $range['from'] : null;
-            $to = isset($range['to']) ? $range['to'] : null;
-            $key = isset($range['key']) ? $range['key'] : null;
+            $from = $range['from'] ?? null;
+            $to = $range['to'] ?? null;
+            $key = $range['key'] ?? null;
             $this->addRange($from, $to, $key);
         }
     }
 
     /**
      * Sets if result buckets should be keyed.
-     *
-     * @param bool $keyed
-     *
-     * @return $this
      */
-    public function setKeyed($keyed)
+    public function setKeyed(bool $keyed): static
     {
         $this->keyed = $keyed;
 
@@ -71,23 +55,15 @@ class RangeAggregation extends AbstractAggregation
 
     /**
      * Add range to aggregation.
-     *
-     * @param int|float|null $from
-     * @param int|float|null $to
-     * @param string         $key
-     *
-     * @return RangeAggregation
      */
-    public function addRange($from = null, $to = null, $key = '')
+    public function addRange(mixed $from = null, mixed $to = null, string $key = ''): static
     {
         $range = array_filter(
             [
                 'from' => $from,
                 'to' => $to,
             ],
-            function ($v) {
-                return !is_null($v);
-            }
+            static fn($v): bool => !is_null($v)
         );
 
         if (!empty($key)) {
@@ -101,13 +77,8 @@ class RangeAggregation extends AbstractAggregation
 
     /**
      * Remove range from aggregation. Returns true on success.
-     *
-     * @param int|float|null $from
-     * @param int|float|null $to
-     *
-     * @return bool
      */
-    public function removeRange($from, $to)
+    public function removeRange(mixed $from, mixed $to): bool
     {
         foreach ($this->ranges as $key => $range) {
             if (array_diff_assoc(array_filter(['from' => $from, 'to' => $to]), $range) === []) {
@@ -122,12 +93,8 @@ class RangeAggregation extends AbstractAggregation
 
     /**
      * Removes range by key.
-     *
-     * @param string $key Range key.
-     *
-     * @return bool
      */
-    public function removeRangeByKey($key)
+    public function removeRangeByKey(string $key): bool
     {
         if ($this->keyed) {
             foreach ($this->ranges as $rangeKey => $range) {
@@ -145,7 +112,7 @@ class RangeAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $data = [
             'keyed' => $this->keyed,
@@ -162,7 +129,7 @@ class RangeAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'range';
     }
diff --git a/src/Aggregation/Bucketing/ReverseNestedAggregation.php b/src/Aggregation/Bucketing/ReverseNestedAggregation.php
index 6cda4b8c1b64bc136d0cf965ab8ca5a3068ce170..c14b0e8ee44e5e846a591d99724b32d1bb426390 100644
--- a/src/Aggregation/Bucketing/ReverseNestedAggregation.php
+++ b/src/Aggregation/Bucketing/ReverseNestedAggregation.php
@@ -23,18 +23,12 @@ class ReverseNestedAggregation extends AbstractAggregation
 {
     use BucketingTrait;
 
-    /**
-     * @var string
-     */
-    private $path;
+    private ?string $path;
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string $name
-     * @param string $path
      */
-    public function __construct($name, $path = null)
+    public function __construct(string $name, ?string $path = null)
     {
         parent::__construct($name);
 
@@ -46,7 +40,7 @@ class ReverseNestedAggregation extends AbstractAggregation
      *
      * @return string
      */
-    public function getPath()
+    public function getPath(): ?string
     {
         return $this->path;
     }
@@ -56,7 +50,7 @@ class ReverseNestedAggregation extends AbstractAggregation
      *
      * @return $this
      */
-    public function setPath($path)
+    public function setPath(?string $path): static
     {
         $this->path = $path;
 
@@ -66,7 +60,7 @@ class ReverseNestedAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'reverse_nested';
     }
@@ -74,9 +68,9 @@ class ReverseNestedAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        $output = new \stdClass();
+        $output = [];
         if ($this->getPath()) {
             $output = ['path' => $this->getPath()];
         }
diff --git a/src/Aggregation/Bucketing/SamplerAggregation.php b/src/Aggregation/Bucketing/SamplerAggregation.php
index aa90b46097edb849f3a775ae450b281e741a536c..3bdc031990b938a03daf616520914d177295dca6 100644
--- a/src/Aggregation/Bucketing/SamplerAggregation.php
+++ b/src/Aggregation/Bucketing/SamplerAggregation.php
@@ -36,7 +36,7 @@ class SamplerAggregation extends AbstractAggregation
      * @param string $field
      * @param int    $shardSize
      */
-    public function __construct($name, $field = null, $shardSize = null)
+    public function __construct(string $name, $field = null, $shardSize = null)
     {
         parent::__construct($name);
 
@@ -67,7 +67,7 @@ class SamplerAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'sampler';
     }
@@ -75,15 +75,13 @@ class SamplerAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        $out = array_filter(
+        return array_filter(
             [
                 'field' => $this->getField(),
                 'shard_size' => $this->getShardSize(),
             ]
         );
-
-        return $out;
     }
 }
diff --git a/src/Aggregation/Bucketing/SignificantTermsAggregation.php b/src/Aggregation/Bucketing/SignificantTermsAggregation.php
index d3844decf68dac3eb68a86b55dfebe007948f8b9..6f112e5d51066550897ad3680c4ec18370b6db86 100644
--- a/src/Aggregation/Bucketing/SignificantTermsAggregation.php
+++ b/src/Aggregation/Bucketing/SignificantTermsAggregation.php
@@ -21,7 +21,7 @@ class SignificantTermsAggregation extends TermsAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'significant_terms';
     }
diff --git a/src/Aggregation/Bucketing/SignificantTextAggregation.php b/src/Aggregation/Bucketing/SignificantTextAggregation.php
index 4b6bd5a36cebb583a6e363675fcb0f08fc42d3e9..5e21de3e83933dc25c008ed85c96e1f24bc44f4c 100644
--- a/src/Aggregation/Bucketing/SignificantTextAggregation.php
+++ b/src/Aggregation/Bucketing/SignificantTextAggregation.php
@@ -21,7 +21,7 @@ class SignificantTextAggregation extends TermsAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'significant_text';
     }
diff --git a/src/Aggregation/Bucketing/TermsAggregation.php b/src/Aggregation/Bucketing/TermsAggregation.php
index b1fe6c543394174da048b247719f5f2d364211c9..7ada67203b5244a0933d8326641af20d6b924f57 100644
--- a/src/Aggregation/Bucketing/TermsAggregation.php
+++ b/src/Aggregation/Bucketing/TermsAggregation.php
@@ -32,7 +32,7 @@ class TermsAggregation extends AbstractAggregation
      * @param string $field
      * @param string $script
      */
-    public function __construct($name, $field = null, $script = null)
+    public function __construct(string $name, $field = null, $script = null)
     {
         parent::__construct($name);
 
@@ -43,7 +43,7 @@ class TermsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'terms';
     }
@@ -51,15 +51,13 @@ class TermsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        $data = array_filter(
+        return array_filter(
             [
                 'field' => $this->getField(),
                 'script' => $this->getScript(),
             ]
         );
-
-        return $data;
     }
 }
diff --git a/src/Aggregation/Matrix/MatrixStatsAggregation.php b/src/Aggregation/Matrix/MatrixStatsAggregation.php
index 619aae90b083c48688677a9ad86f12e113d2eafb..f9cf983ab342d42871bd3aa1d556e419f5f1ec0f 100644
--- a/src/Aggregation/Matrix/MatrixStatsAggregation.php
+++ b/src/Aggregation/Matrix/MatrixStatsAggregation.php
@@ -17,9 +17,9 @@ use ONGR\ElasticsearchDSL\Aggregation\Type\MetricTrait;
 /**
  * Class representing Max Aggregation.
  *
- * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-max-aggregation.html
+ * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-matrix-stats-aggregation.html
  */
-class MaxAggregation extends AbstractAggregation
+class MatrixStatsAggregation extends AbstractAggregation
 {
     use MetricTrait;
 
@@ -28,11 +28,6 @@ class MaxAggregation extends AbstractAggregation
      */
     private $mode;
 
-    /**
-     * @var array Defines how documents that are missing a value should be treated.
-     */
-    private $missing;
-
     /**
      * Inner aggregations container init.
      *
@@ -41,13 +36,12 @@ class MaxAggregation extends AbstractAggregation
      * @param array $missing
      * @param string $mode
      */
-    public function __construct($name, $field, $missing = null, $mode = null)
+    public function __construct(string $name, $field, private $missing = null, $mode = null)
     {
         parent::__construct($name);
 
         $this->setField($field);
         $this->setMode($mode);
-        $this->missing = $missing;
     }
 
     /**
@@ -93,12 +87,12 @@ class MaxAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'matrix_stats';
     }
 
-    protected function getArray()
+    public function getArray(): array
     {
         $out = [];
         if ($this->getField()) {
diff --git a/src/Aggregation/Metric/AvgAggregation.php b/src/Aggregation/Metric/AvgAggregation.php
index 412c6764d575e8128e46bc5b9eb7dfbc692a9204..8931b7715d3d69d4047d01cdefffe957222f497d 100644
--- a/src/Aggregation/Metric/AvgAggregation.php
+++ b/src/Aggregation/Metric/AvgAggregation.php
@@ -21,7 +21,7 @@ class AvgAggregation extends StatsAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'avg';
     }
diff --git a/src/Aggregation/Metric/CardinalityAggregation.php b/src/Aggregation/Metric/CardinalityAggregation.php
index bcaaaf659c628ed887de881a00f6800146315038..51486d5e47c1e4117525a6d1f791c480a7104d74 100644
--- a/src/Aggregation/Metric/CardinalityAggregation.php
+++ b/src/Aggregation/Metric/CardinalityAggregation.php
@@ -38,7 +38,7 @@ class CardinalityAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $out = array_filter(
             [
@@ -47,9 +47,7 @@ class CardinalityAggregation extends AbstractAggregation
                 'precision_threshold' => $this->getPrecisionThreshold(),
                 'rehash' => $this->isRehash(),
             ],
-            function ($val) {
-                return ($val || is_bool($val));
-            }
+            static fn($val): bool => $val || is_bool($val)
         );
 
         $this->checkRequiredFields($out);
@@ -100,7 +98,7 @@ class CardinalityAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'cardinality';
     }
@@ -108,11 +106,10 @@ class CardinalityAggregation extends AbstractAggregation
     /**
      * Checks if required fields are set.
      *
-     * @param array $fields
      *
      * @throws \LogicException
      */
-    private function checkRequiredFields($fields)
+    private function checkRequiredFields(array $fields)
     {
         if (!array_key_exists('field', $fields) && !array_key_exists('script', $fields)) {
             throw new \LogicException('Cardinality aggregation must have field or script set.');
diff --git a/src/Aggregation/Metric/ExtendedStatsAggregation.php b/src/Aggregation/Metric/ExtendedStatsAggregation.php
index 660dc0d00821b1a49019aa3b1c2e6efcb1b2da8f..5fdcb9c14a957ff4983c6d2324539a94f0e0861c 100644
--- a/src/Aggregation/Metric/ExtendedStatsAggregation.php
+++ b/src/Aggregation/Metric/ExtendedStatsAggregation.php
@@ -33,7 +33,7 @@ class ExtendedStatsAggregation extends AbstractAggregation
      * @param int    $sigma
      * @param string $script
      */
-    public function __construct($name, $field = null, $sigma = null, $script = null)
+    public function __construct(string $name, $field = null, $sigma = null, $script = null)
     {
         parent::__construct($name);
 
@@ -70,7 +70,7 @@ class ExtendedStatsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'extended_stats';
     }
@@ -78,19 +78,15 @@ class ExtendedStatsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        $out = array_filter(
+        return array_filter(
             [
                 'field' => $this->getField(),
                 'script' => $this->getScript(),
                 'sigma' => $this->getSigma(),
             ],
-            function ($val) {
-                return ($val || is_numeric($val));
-            }
+            static fn($val): bool => $val || is_numeric($val)
         );
-
-        return $out;
     }
 }
diff --git a/src/Aggregation/Metric/GeoBoundsAggregation.php b/src/Aggregation/Metric/GeoBoundsAggregation.php
index 3f01a1dd541b1c5eeecce7e80291e9207da7c688..13c35039abd4a424ef87258fa2645ed9d55ccc2b 100644
--- a/src/Aggregation/Metric/GeoBoundsAggregation.php
+++ b/src/Aggregation/Metric/GeoBoundsAggregation.php
@@ -23,19 +23,12 @@ class GeoBoundsAggregation extends AbstractAggregation
 {
     use MetricTrait;
 
-    /**
-     * @var bool
-     */
-    private $wrapLongitude = true;
+    private bool $wrapLongitude = true;
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string $name
-     * @param string $field
-     * @param bool   $wrapLongitude
      */
-    public function __construct($name, $field = null, $wrapLongitude = true)
+    public function __construct(string $name, ?string $field = null, bool $wrapLongitude = true)
     {
         parent::__construct($name);
 
@@ -43,20 +36,15 @@ class GeoBoundsAggregation extends AbstractAggregation
         $this->setWrapLongitude($wrapLongitude);
     }
 
-    /**
-     * @return bool
-     */
-    public function isWrapLongitude()
+    public function isWrapLongitude(): bool
     {
         return $this->wrapLongitude;
     }
 
     /**
-     * @param bool $wrapLongitude
-     *
      * @return $this
      */
-    public function setWrapLongitude($wrapLongitude)
+    public function setWrapLongitude(bool $wrapLongitude): static
     {
         $this->wrapLongitude = $wrapLongitude;
 
@@ -66,7 +54,7 @@ class GeoBoundsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $data = [];
         if ($this->getField()) {
@@ -83,7 +71,7 @@ class GeoBoundsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'geo_bounds';
     }
diff --git a/src/Aggregation/Metric/GeoCentroidAggregation.php b/src/Aggregation/Metric/GeoCentroidAggregation.php
index 807c81cbb75d0f9088c242f5fca001d31355fd68..3b0529a585f3977f9d36ece092e692af83792c1a 100644
--- a/src/Aggregation/Metric/GeoCentroidAggregation.php
+++ b/src/Aggregation/Metric/GeoCentroidAggregation.php
@@ -25,11 +25,8 @@ class GeoCentroidAggregation extends AbstractAggregation
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string $name
-     * @param string $field
      */
-    public function __construct($name, $field = null)
+    public function __construct(string $name, ?string $field = null)
     {
         parent::__construct($name);
 
@@ -39,7 +36,7 @@ class GeoCentroidAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $data = [];
         if ($this->getField()) {
@@ -54,7 +51,7 @@ class GeoCentroidAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'geo_centroid';
     }
diff --git a/src/Aggregation/Metric/MaxAggregation.php b/src/Aggregation/Metric/MaxAggregation.php
index 7879e1d388e17576c6a9ff2eb15c42e8f1145361..b2a204446cc2c90e7dcb205ce7fa9958fdb66aec 100644
--- a/src/Aggregation/Metric/MaxAggregation.php
+++ b/src/Aggregation/Metric/MaxAggregation.php
@@ -21,7 +21,7 @@ class MaxAggregation extends StatsAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'max';
     }
diff --git a/src/Aggregation/Metric/MinAggregation.php b/src/Aggregation/Metric/MinAggregation.php
index a92f9432a9891f9c9ec1016972a111fab007a334..14240e93be0b11a7700572cb302dbfc4d330ad77 100644
--- a/src/Aggregation/Metric/MinAggregation.php
+++ b/src/Aggregation/Metric/MinAggregation.php
@@ -21,7 +21,7 @@ class MinAggregation extends StatsAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'min';
     }
diff --git a/src/Aggregation/Metric/PercentileRanksAggregation.php b/src/Aggregation/Metric/PercentileRanksAggregation.php
index d0fb2c0a82904429c3495e4396d55cdb7ff53c57..2f7969f48fffb3e657a25fac15bafe00e662d828 100644
--- a/src/Aggregation/Metric/PercentileRanksAggregation.php
+++ b/src/Aggregation/Metric/PercentileRanksAggregation.php
@@ -44,7 +44,7 @@ class PercentileRanksAggregation extends AbstractAggregation
      * @param string $script
      * @param int    $compression
      */
-    public function __construct($name, $field = null, $values = null, $script = null, $compression = null)
+    public function __construct(string $name, $field = null, $values = null, $script = null, $compression = null)
     {
         parent::__construct($name);
 
@@ -97,7 +97,7 @@ class PercentileRanksAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'percentile_ranks';
     }
@@ -105,7 +105,7 @@ class PercentileRanksAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $out = array_filter(
             [
@@ -114,9 +114,7 @@ class PercentileRanksAggregation extends AbstractAggregation
                 'values' => $this->getValues(),
                 'compression' => $this->getCompression(),
             ],
-            function ($val) {
-                return ($val || is_numeric($val));
-            }
+            static fn($val): bool => $val || is_numeric($val)
         );
 
         $this->isRequiredParametersSet($out);
@@ -125,18 +123,18 @@ class PercentileRanksAggregation extends AbstractAggregation
     }
 
     /**
-     * @param array $a
      *
      * @return bool
      * @throws \LogicException
      */
-    private function isRequiredParametersSet($a)
+    private function isRequiredParametersSet(array $a)
     {
         if (array_key_exists('field', $a) && array_key_exists('values', $a)
             || (array_key_exists('script', $a) && array_key_exists('values', $a))
         ) {
             return true;
         }
+
         throw new \LogicException('Percentile ranks aggregation must have field and values or script and values set.');
     }
 }
diff --git a/src/Aggregation/Metric/PercentilesAggregation.php b/src/Aggregation/Metric/PercentilesAggregation.php
index 627bb56824fa6425413d4902c97a96a23bde0de9..385ef4bfe6ceaafd37dec5d9df55aacf8ebb2488 100644
--- a/src/Aggregation/Metric/PercentilesAggregation.php
+++ b/src/Aggregation/Metric/PercentilesAggregation.php
@@ -44,7 +44,7 @@ class PercentilesAggregation extends AbstractAggregation
      * @param string $script
      * @param int    $compression
      */
-    public function __construct($name, $field = null, $percents = null, $script = null, $compression = null)
+    public function __construct(string $name, $field = null, $percents = null, $script = null, $compression = null)
     {
         parent::__construct($name);
 
@@ -97,7 +97,7 @@ class PercentilesAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'percentiles';
     }
@@ -105,7 +105,7 @@ class PercentilesAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $out = array_filter(
             [
@@ -114,9 +114,7 @@ class PercentilesAggregation extends AbstractAggregation
                 'field' => $this->getField(),
                 'script' => $this->getScript(),
             ],
-            function ($val) {
-                return ($val || is_numeric($val));
-            }
+            static fn($val): bool => $val || is_numeric($val)
         );
 
         $this->isRequiredParametersSet($out);
@@ -125,11 +123,9 @@ class PercentilesAggregation extends AbstractAggregation
     }
 
     /**
-     * @param array $a
-     *
      * @throws \LogicException
      */
-    private function isRequiredParametersSet($a)
+    private function isRequiredParametersSet(array $a)
     {
         if (!array_key_exists('field', $a) && !array_key_exists('script', $a)) {
             throw new \LogicException('Percentiles aggregation must have field or script set.');
diff --git a/src/Aggregation/Metric/ScriptedMetricAggregation.php b/src/Aggregation/Metric/ScriptedMetricAggregation.php
index a88412f76baa3246242298ada4a991f397107f29..903c6e9efdc1f6312cad3417b7ae733d3b6acd7c 100644
--- a/src/Aggregation/Metric/ScriptedMetricAggregation.php
+++ b/src/Aggregation/Metric/ScriptedMetricAggregation.php
@@ -43,6 +43,7 @@ class ScriptedMetricAggregation extends AbstractAggregation
      * @var mixed
      */
     private $reduceScript;
+
     /**
      * ScriptedMetricAggregation constructor.
      * @param string $name
@@ -58,7 +59,7 @@ class ScriptedMetricAggregation extends AbstractAggregation
         $combineScript = null,
         $reduceScript = null
     ) {
-    
+
         parent::__construct($name);
 
         $this->setInitScript($initScript);
@@ -70,7 +71,7 @@ class ScriptedMetricAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'scripted_metric';
     }
@@ -84,11 +85,9 @@ class ScriptedMetricAggregation extends AbstractAggregation
     }
 
     /**
-     * @param mixed $initScript
-     *
      * @return $this
      */
-    public function setInitScript($initScript)
+    public function setInitScript(mixed $initScript)
     {
         $this->initScript = $initScript;
 
@@ -104,11 +103,9 @@ class ScriptedMetricAggregation extends AbstractAggregation
     }
 
     /**
-     * @param mixed $mapScript
-     *
      * @return $this
      */
-    public function setMapScript($mapScript)
+    public function setMapScript(mixed $mapScript)
     {
         $this->mapScript = $mapScript;
 
@@ -124,11 +121,9 @@ class ScriptedMetricAggregation extends AbstractAggregation
     }
 
     /**
-     * @param mixed $combineScript
-     *
      * @return $this
      */
-    public function setCombineScript($combineScript)
+    public function setCombineScript(mixed $combineScript)
     {
         $this->combineScript = $combineScript;
 
@@ -144,11 +139,9 @@ class ScriptedMetricAggregation extends AbstractAggregation
     }
 
     /**
-     * @param mixed $reduceScript
-     *
      * @return $this
      */
-    public function setReduceScript($reduceScript)
+    public function setReduceScript(mixed $reduceScript)
     {
         $this->reduceScript = $reduceScript;
 
@@ -158,9 +151,9 @@ class ScriptedMetricAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        $out = array_filter(
+        return array_filter(
             [
                 'init_script' => $this->getInitScript(),
                 'map_script' => $this->getMapScript(),
@@ -168,7 +161,5 @@ class ScriptedMetricAggregation extends AbstractAggregation
                 'reduce_script' => $this->getReduceScript(),
             ]
         );
-
-        return $out;
     }
 }
diff --git a/src/Aggregation/Metric/StatsAggregation.php b/src/Aggregation/Metric/StatsAggregation.php
index c9fd2ebc2302b4d0ad5442ce8d80ff28a7378dd4..111c64813b2dce7be398c5248c2760494b7facb8 100644
--- a/src/Aggregation/Metric/StatsAggregation.php
+++ b/src/Aggregation/Metric/StatsAggregation.php
@@ -27,12 +27,8 @@ class StatsAggregation extends AbstractAggregation
 
     /**
      * Inner aggregations container init.
-     *
-     * @param string $name
-     * @param string $field
-     * @param string $script
      */
-    public function __construct($name, $field = null, $script = null)
+    public function __construct(string $name, ?string $field = null, mixed $script = null)
     {
         parent::__construct($name);
 
@@ -43,7 +39,7 @@ class StatsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'stats';
     }
@@ -51,7 +47,7 @@ class StatsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $out = [];
         if ($this->getField()) {
diff --git a/src/Aggregation/Metric/SumAggregation.php b/src/Aggregation/Metric/SumAggregation.php
index ba2ddbc53e7f6d57d5fe35911ecde7c42f303e14..6da8a8b94ae6404b46b2d27e6cb420f875771c5f 100644
--- a/src/Aggregation/Metric/SumAggregation.php
+++ b/src/Aggregation/Metric/SumAggregation.php
@@ -21,7 +21,7 @@ class SumAggregation extends StatsAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'sum';
     }
diff --git a/src/Aggregation/Metric/TopHitsAggregation.php b/src/Aggregation/Metric/TopHitsAggregation.php
index 01225666e795624bd785f1a969bac46a0dcf0751..d81ee3d9d4f70cc88a3b5978fbe6be88e5fb3c31 100644
--- a/src/Aggregation/Metric/TopHitsAggregation.php
+++ b/src/Aggregation/Metric/TopHitsAggregation.php
@@ -25,52 +25,44 @@ class TopHitsAggregation extends AbstractAggregation
     use MetricTrait;
 
     /**
-     * @var int Number of top matching hits to return per bucket.
+     * Number of top matching hits to return per bucket.
      */
-    private $size;
+    private ?int $size;
 
     /**
-     * @var int The offset from the first result you want to fetch.
+     * The offset from the first result you want to fetch.
      */
-    private $from;
+    private ?int $from;
 
     /**
      * @var BuilderInterface[] How the top matching hits should be sorted.
      */
-    private $sorts = [];
+    private array $sorts = [];
 
     /**
      * Constructor for top hits.
      *
-     * @param string                $name Aggregation name.
-     * @param null|int              $size Number of top matching hits to return per bucket.
-     * @param null|int              $from The offset from the first result you want to fetch.
+     * @param string $name Aggregation name.
+     * @param null|int $size Number of top matching hits to return per bucket.
+     * @param null|int $from The offset from the first result you want to fetch.
      * @param null|BuilderInterface $sort How the top matching hits should be sorted.
      */
-    public function __construct($name, $size = null, $from = null, $sort = null)
+    public function __construct(string $name, ?int $size = null, ?int $from = null, ?BuilderInterface $sort = null)
     {
         parent::__construct($name);
         $this->setFrom($from);
         $this->setSize($size);
-        $this->addSort($sort);
+        if ($sort instanceof BuilderInterface) {
+            $this->addSort($sort);
+        }
     }
 
-    /**
-     * Return from.
-     *
-     * @return int
-     */
-    public function getFrom()
+    public function getFrom(): ?int
     {
         return $this->from;
     }
 
-    /**
-     * @param int $from
-     *
-     * @return $this
-     */
-    public function setFrom($from)
+    public function setFrom($from): static
     {
         $this->from = $from;
 
@@ -80,7 +72,7 @@ class TopHitsAggregation extends AbstractAggregation
     /**
      * @return BuilderInterface[]
      */
-    public function getSorts()
+    public function getSorts(): array
     {
         return $this->sorts;
     }
@@ -90,41 +82,26 @@ class TopHitsAggregation extends AbstractAggregation
      *
      * @return $this
      */
-    public function setSorts(array $sorts)
+    public function setSorts(array $sorts): static
     {
         $this->sorts = $sorts;
 
         return $this;
     }
 
-    /**
-     * Add sort.
-     *
-     * @param BuilderInterface $sort
-     */
-    public function addSort($sort)
+    public function addSort(BuilderInterface $sort): void
     {
         $this->sorts[] = $sort;
     }
 
-    /**
-     * @param int $size
-     *
-     * @return $this
-     */
-    public function setSize($size)
+    public function setSize(int $size): static
     {
         $this->size = $size;
 
         return $this;
     }
 
-    /**
-     * Return size.
-     *
-     * @return int
-     */
-    public function getSize()
+    public function getSize(): ?int
     {
         return $this->size;
     }
@@ -132,7 +109,7 @@ class TopHitsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'top_hits';
     }
@@ -140,16 +117,14 @@ class TopHitsAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        $sortsOutput = [];
+        $sortsOutput = null;
         $addedSorts = array_filter($this->getSorts());
         if ($addedSorts) {
             foreach ($addedSorts as $sort) {
                 $sortsOutput[] = $sort->toArray();
             }
-        } else {
-            $sortsOutput = null;
         }
 
         $output = array_filter(
@@ -158,40 +133,9 @@ class TopHitsAggregation extends AbstractAggregation
                 'size' => $this->getSize(),
                 'from' => $this->getFrom(),
             ],
-            function ($val) {
-                return (($val || is_array($val) || ($val || is_numeric($val))));
-            }
+            static fn($val): bool => $val || is_array($val) || ($val || is_numeric($val))
         );
 
-        return empty($output) ? new \stdClass() : $output;
-    }
-
-    /**
-     * @deprecated sorts now is a container, use `getSorts()`instead.
-     * Return sort.
-     *
-     * @return BuilderInterface
-     */
-    public function getSort()
-    {
-        if (isset($this->sorts[0])) {
-            return $this->sorts[0];
-        }
-
-        return null;
-    }
-
-    /**
-     * @deprecated sorts now is a container, use `addSort()`instead.
-     *
-     * @param BuilderInterface $sort
-     *
-     * @return $this
-     */
-    public function setSort(BuilderInterface $sort)
-    {
-        $this->sort = $sort;
-
-        return $this;
+        return empty($output) ? [] : $output;
     }
 }
diff --git a/src/Aggregation/Metric/ValueCountAggregation.php b/src/Aggregation/Metric/ValueCountAggregation.php
index 617a966eff1b0d33dca2243de2df19ebec4917ab..06635412b5fa8b4f67224223c691e33d992f8ff8 100644
--- a/src/Aggregation/Metric/ValueCountAggregation.php
+++ b/src/Aggregation/Metric/ValueCountAggregation.php
@@ -21,7 +21,7 @@ class ValueCountAggregation extends StatsAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'value_count';
     }
diff --git a/src/Aggregation/Pipeline/AbstractPipelineAggregation.php b/src/Aggregation/Pipeline/AbstractPipelineAggregation.php
index 4259c057bda4d30191efef5f7aa8f7587649830a..b797d0f1e5ad990e50e64ebe6911adcaff7dff5a 100644
--- a/src/Aggregation/Pipeline/AbstractPipelineAggregation.php
+++ b/src/Aggregation/Pipeline/AbstractPipelineAggregation.php
@@ -18,7 +18,7 @@ abstract class AbstractPipelineAggregation extends AbstractAggregation
      * @param string $name
      * @param $bucketsPath
      */
-    public function __construct($name, $bucketsPath = null)
+    public function __construct(string $name, $bucketsPath = null)
     {
         parent::__construct($name);
         $this->setBucketsPath($bucketsPath);
@@ -47,7 +47,7 @@ abstract class AbstractPipelineAggregation extends AbstractAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         return ['buckets_path' => $this->getBucketsPath()];
     }
diff --git a/src/Aggregation/Pipeline/AvgBucketAggregation.php b/src/Aggregation/Pipeline/AvgBucketAggregation.php
index 69e0f93fefe66e9ba32b80be7249e3b40329e5ad..242b1dcf94d121bcc1379b968025a95126b9cd42 100644
--- a/src/Aggregation/Pipeline/AvgBucketAggregation.php
+++ b/src/Aggregation/Pipeline/AvgBucketAggregation.php
@@ -21,7 +21,7 @@ class AvgBucketAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'avg_bucket';
     }
diff --git a/src/Aggregation/Pipeline/BucketScriptAggregation.php b/src/Aggregation/Pipeline/BucketScriptAggregation.php
index f0f4c615a6482189ce6e7737a9f64086be896a28..a39d77554a85cdc03cd188087885e5e395335792 100644
--- a/src/Aggregation/Pipeline/BucketScriptAggregation.php
+++ b/src/Aggregation/Pipeline/BucketScriptAggregation.php
@@ -18,17 +18,9 @@ namespace ONGR\ElasticsearchDSL\Aggregation\Pipeline;
  */
 class BucketScriptAggregation extends AbstractPipelineAggregation
 {
-    /**
-     * @var string
-     */
-    private $script;
+    private mixed $script;
 
-    /**
-     * @param string $name
-     * @param array  $bucketsPath
-     * @param string $script
-     */
-    public function __construct($name, $bucketsPath, $script = null)
+    public function __construct(string $name, $bucketsPath, mixed $script = null)
     {
         parent::__construct($name, $bucketsPath);
         $this->setScript($script);
@@ -37,17 +29,12 @@ class BucketScriptAggregation extends AbstractPipelineAggregation
     /**
      * @return string
      */
-    public function getScript()
+    public function getScript(): mixed
     {
         return $this->script;
     }
 
-    /**
-     * @param string $script
-     *
-     * @return $this
-     */
-    public function setScript($script)
+    public function setScript(mixed $script): static
     {
         $this->script = $script;
 
@@ -57,7 +44,7 @@ class BucketScriptAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'bucket_script';
     }
@@ -65,7 +52,7 @@ class BucketScriptAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         if (!$this->getScript()) {
             throw new \LogicException(
@@ -76,11 +63,9 @@ class BucketScriptAggregation extends AbstractPipelineAggregation
             );
         }
 
-        $out = [
+        return [
             'buckets_path' => $this->getBucketsPath(),
             'script' => $this->getScript(),
         ];
-
-        return $out;
     }
 }
diff --git a/src/Aggregation/Pipeline/BucketSelectorAggregation.php b/src/Aggregation/Pipeline/BucketSelectorAggregation.php
index cd8c41b328c4d5ce685031cb24d1ec27217da2c9..2c8de4e2928fa2a8a79d3cdfba794f797eea9921 100644
--- a/src/Aggregation/Pipeline/BucketSelectorAggregation.php
+++ b/src/Aggregation/Pipeline/BucketSelectorAggregation.php
@@ -21,7 +21,7 @@ class BucketSelectorAggregation extends BucketScriptAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'bucket_selector';
     }
diff --git a/src/Aggregation/Pipeline/BucketSortAggregation.php b/src/Aggregation/Pipeline/BucketSortAggregation.php
index 06dd5dc51b9f23e308956d7916d32a03f3c6d8e9..3c09af15dca59cca13785d163f6510acd594a51f 100644
--- a/src/Aggregation/Pipeline/BucketSortAggregation.php
+++ b/src/Aggregation/Pipeline/BucketSortAggregation.php
@@ -21,24 +21,18 @@ use ONGR\ElasticsearchDSL\Sort\FieldSort;
  */
 class BucketSortAggregation extends AbstractPipelineAggregation
 {
-    /**
-     * @var array
-     */
-    private $sort = [];
+    private array $sort = [];
 
     /**
      * @param string $name
      * @param string  $bucketsPath
      */
-    public function __construct($name, $bucketsPath = null)
+    public function __construct(string $name, $bucketsPath = null)
     {
         parent::__construct($name, $bucketsPath);
     }
 
-    /**
-     * @return array
-     */
-    public function getSort()
+    public function getSort(): array
     {
         return $this->sort;
     }
@@ -46,7 +40,7 @@ class BucketSortAggregation extends AbstractPipelineAggregation
     /**
      * @return self
      */
-    public function addSort(FieldSort $sort)
+    public function addSort(FieldSort $sort): void
     {
         $this->sort[] = $sort->toArray();
     }
@@ -56,7 +50,7 @@ class BucketSortAggregation extends AbstractPipelineAggregation
      *
      * @return $this
      */
-    public function setSort($sort)
+    public function setSort(array $sort)
     {
         $this->sort = $sort;
 
@@ -66,7 +60,7 @@ class BucketSortAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'bucket_sort';
     }
@@ -74,15 +68,13 @@ class BucketSortAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
-        $out = array_filter(
+        return array_filter(
             [
             'buckets_path' => $this->getBucketsPath(),
             'sort' => $this->getSort(),
             ]
         );
-
-        return $out;
     }
 }
diff --git a/src/Aggregation/Pipeline/CumulativeSumAggregation.php b/src/Aggregation/Pipeline/CumulativeSumAggregation.php
index dff8a9cb7d0d3fc33d9a14236fa8a8f0b1a8fe92..0e059dd743b35522b71b6da2743759d3b88d6b20 100644
--- a/src/Aggregation/Pipeline/CumulativeSumAggregation.php
+++ b/src/Aggregation/Pipeline/CumulativeSumAggregation.php
@@ -21,7 +21,7 @@ class CumulativeSumAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'cumulative_sum';
     }
diff --git a/src/Aggregation/Pipeline/DerivativeAggregation.php b/src/Aggregation/Pipeline/DerivativeAggregation.php
index ad030b01e8e698dd5efbc7e4867b7c4fab1c4659..e37fdb06ec3a664ce7591fcf269111d8e49f1eee 100644
--- a/src/Aggregation/Pipeline/DerivativeAggregation.php
+++ b/src/Aggregation/Pipeline/DerivativeAggregation.php
@@ -21,7 +21,7 @@ class DerivativeAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'derivative';
     }
diff --git a/src/Aggregation/Pipeline/ExtendedStatsBucketAggregation.php b/src/Aggregation/Pipeline/ExtendedStatsBucketAggregation.php
index aa8697a7b9617b5bb81aa9b5154c92ee5a6717ce..f3c00d5294198d33f63de1d540ccad0342e28f94 100644
--- a/src/Aggregation/Pipeline/ExtendedStatsBucketAggregation.php
+++ b/src/Aggregation/Pipeline/ExtendedStatsBucketAggregation.php
@@ -21,7 +21,7 @@ class ExtendedStatsBucketAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'extended_stats_bucket';
     }
diff --git a/src/Aggregation/Pipeline/MaxBucketAggregation.php b/src/Aggregation/Pipeline/MaxBucketAggregation.php
index ea51d682fbf368003098655f48a60ce4bbfba7e1..202b89bf33c5f785c0cc6aa392ec5af2142b512e 100644
--- a/src/Aggregation/Pipeline/MaxBucketAggregation.php
+++ b/src/Aggregation/Pipeline/MaxBucketAggregation.php
@@ -21,7 +21,7 @@ class MaxBucketAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'max_bucket';
     }
diff --git a/src/Aggregation/Pipeline/MinBucketAggregation.php b/src/Aggregation/Pipeline/MinBucketAggregation.php
index 8c4d64f8663132a85580cfb60b41a099db6886e0..8ed21408efddd1a60e6329a5a7bfd25a31e0f708 100644
--- a/src/Aggregation/Pipeline/MinBucketAggregation.php
+++ b/src/Aggregation/Pipeline/MinBucketAggregation.php
@@ -21,7 +21,7 @@ class MinBucketAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'min_bucket';
     }
diff --git a/src/Aggregation/Pipeline/MovingAverageAggregation.php b/src/Aggregation/Pipeline/MovingAverageAggregation.php
index e93fdc5d903d6cfa52b8eb4d1ef98f9c76161e31..e3ddf7805133340d6ac164fc7bc062df9e21eaf6 100644
--- a/src/Aggregation/Pipeline/MovingAverageAggregation.php
+++ b/src/Aggregation/Pipeline/MovingAverageAggregation.php
@@ -21,7 +21,7 @@ class MovingAverageAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'moving_avg';
     }
diff --git a/src/Aggregation/Pipeline/MovingFunctionAggregation.php b/src/Aggregation/Pipeline/MovingFunctionAggregation.php
index 70d587e80d77b3b20839619d97457ca97fe3baf6..1f5ae9990bf64bbdbd48929de4169758c7984e54 100644
--- a/src/Aggregation/Pipeline/MovingFunctionAggregation.php
+++ b/src/Aggregation/Pipeline/MovingFunctionAggregation.php
@@ -21,7 +21,7 @@ class MovingFunctionAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'moving_fn';
     }
diff --git a/src/Aggregation/Pipeline/PercentilesBucketAggregation.php b/src/Aggregation/Pipeline/PercentilesBucketAggregation.php
index 6c0c9a3c46749801d971dc7960b808bea92636cc..83d7c434a14ff52d6c644a5bb7c882574664ca06 100644
--- a/src/Aggregation/Pipeline/PercentilesBucketAggregation.php
+++ b/src/Aggregation/Pipeline/PercentilesBucketAggregation.php
@@ -18,30 +18,25 @@ namespace ONGR\ElasticsearchDSL\Aggregation\Pipeline;
  */
 class PercentilesBucketAggregation extends AbstractPipelineAggregation
 {
-    /**
-     * @var array
-     */
-    private $percents;
+    private ?array $percents = null;
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'percentiles_bucket';
     }
 
     /**
-     * @return array
+     * @return mixed[]|null
      */
-    public function getPercents()
+    public function getPercents(): ?array
     {
         return $this->percents;
     }
 
     /**
-     * @param array $percents
-     *
      * @return $this
      */
     public function setPercents(array $percents)
@@ -54,7 +49,7 @@ class PercentilesBucketAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getArray()
+    public function getArray(): array
     {
         $data = ['buckets_path' => $this->getBucketsPath()];
 
diff --git a/src/Aggregation/Pipeline/SerialDifferencingAggregation.php b/src/Aggregation/Pipeline/SerialDifferencingAggregation.php
index 715c0706ef67e97417eaa40667426bad5597d2ea..6c99c2605eee1d25b2c6d98ed4990b2486990a2f 100644
--- a/src/Aggregation/Pipeline/SerialDifferencingAggregation.php
+++ b/src/Aggregation/Pipeline/SerialDifferencingAggregation.php
@@ -21,7 +21,7 @@ class SerialDifferencingAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'serial_diff';
     }
diff --git a/src/Aggregation/Pipeline/StatsBucketAggregation.php b/src/Aggregation/Pipeline/StatsBucketAggregation.php
index 43d6b62052d55e43ac8f4335acd2157ff6ae42c8..0ae261328968bafad0a81c0d5169c785d61632cc 100644
--- a/src/Aggregation/Pipeline/StatsBucketAggregation.php
+++ b/src/Aggregation/Pipeline/StatsBucketAggregation.php
@@ -21,7 +21,7 @@ class StatsBucketAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'stats_bucket';
     }
diff --git a/src/Aggregation/Pipeline/SumBucketAggregation.php b/src/Aggregation/Pipeline/SumBucketAggregation.php
index b03859aebaf9781d167691ec327b7175e6c8b146..82789e21978df23619e5246ba580bb68693aa829 100644
--- a/src/Aggregation/Pipeline/SumBucketAggregation.php
+++ b/src/Aggregation/Pipeline/SumBucketAggregation.php
@@ -21,7 +21,7 @@ class SumBucketAggregation extends AbstractPipelineAggregation
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'sum_bucket';
     }
diff --git a/src/Aggregation/Type/BucketingTrait.php b/src/Aggregation/Type/BucketingTrait.php
index 6497ecb2432420d0cfc72391691e048101ccb2f0..ab64d439837791bca780b962b06d7207485dbcb8 100644
--- a/src/Aggregation/Type/BucketingTrait.php
+++ b/src/Aggregation/Type/BucketingTrait.php
@@ -18,10 +18,8 @@ trait BucketingTrait
 {
     /**
      * Bucketing aggregations supports nesting.
-     *
-     * @return bool
      */
-    protected function supportsNesting()
+    protected function supportsNesting(): bool
     {
         return true;
     }
diff --git a/src/Aggregation/Type/MetricTrait.php b/src/Aggregation/Type/MetricTrait.php
index bdfbd2d12e317e8ab924c57b0766e0340fb2a77a..8bd5b5e6c86eae08bf4d0f77fd5113b7e37b03c5 100644
--- a/src/Aggregation/Type/MetricTrait.php
+++ b/src/Aggregation/Type/MetricTrait.php
@@ -18,10 +18,8 @@ trait MetricTrait
 {
     /**
      * Metric aggregations does not support nesting.
-     *
-     * @return bool
      */
-    protected function supportsNesting()
+    protected function supportsNesting(): bool
     {
         return false;
     }
diff --git a/src/BuilderBag.php b/src/BuilderBag.php
index 997667fc110c2f794876a2e20e09602c93b6b33c..cdb6ea1a296ee1c9a8e8e02455726d3d6ad9ed4a 100644
--- a/src/BuilderBag.php
+++ b/src/BuilderBag.php
@@ -19,7 +19,7 @@ class BuilderBag
     /**
      * @var BuilderInterface[]
      */
-    private $bag = [];
+    private array $bag = [];
 
     /**
      * @param BuilderInterface[] $builders
@@ -34,17 +34,11 @@ class BuilderBag
     /**
      * Adds a builder.
      *
-     * @param BuilderInterface $builder
-     *
      * @return string
      */
     public function add(BuilderInterface $builder)
     {
-        if (method_exists($builder, 'getName')) {
-            $name = $builder->getName();
-        } else {
-            $name = bin2hex(random_bytes(30));
-        }
+        $name = method_exists($builder, 'getName') ? $builder->getName() : bin2hex(random_bytes(30));
 
         $this->bag[$name] = $builder;
 
@@ -68,7 +62,7 @@ class BuilderBag
      *
      * @param string $name Builder name.
      */
-    public function remove($name)
+    public function remove($name): void
     {
         unset($this->bag[$name]);
     }
@@ -76,7 +70,7 @@ class BuilderBag
     /**
      * Clears contained builders.
      */
-    public function clear()
+    public function clear(): void
     {
         $this->bag = [];
     }
@@ -100,21 +94,19 @@ class BuilderBag
      *
      * @return BuilderInterface[]
      */
-    public function all($type = null)
+    public function all($type = null): array
     {
         return array_filter(
             $this->bag,
             /** @var BuilderInterface $builder */
-            function (BuilderInterface $builder) use ($type) {
-                return $type === null || $builder->getType() == $type;
-            }
+            static fn(BuilderInterface $builder): bool => $type === null || $builder->getType() == $type
         );
     }
 
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = [];
         foreach ($this->all() as $builder) {
diff --git a/src/BuilderInterface.php b/src/BuilderInterface.php
index de07683d2307c9ff217f7b3722f0c5e58fa45bf9..f57e0a0eab31415c8baa8137d7e3b756bb923942 100644
--- a/src/BuilderInterface.php
+++ b/src/BuilderInterface.php
@@ -21,12 +21,12 @@ interface BuilderInterface
      *
      * @return array
      */
-    public function toArray();
+    public function toArray(): array;
 
     /**
      * Returns element type.
      *
      * @return string
      */
-    public function getType();
+    public function getType(): string;
 }
diff --git a/src/Highlight/Highlight.php b/src/Highlight/Highlight.php
index 171e6a1623da8ef182b8b1ed0da31a8b492b9882..8bc04c62eea06043410dac95f9499d490e246cb1 100644
--- a/src/Highlight/Highlight.php
+++ b/src/Highlight/Highlight.php
@@ -24,20 +24,11 @@ class Highlight implements BuilderInterface
     /**
      * @var array Holds fields for highlight.
      */
-    private $fields = [];
+    private array $fields = [];
 
-    /**
-     * @var array
-     */
-    private $tags;
+    private ?array $tags = null;
 
-    /**
-     * @param string $name   Field name to highlight.
-     * @param array  $params
-     *
-     * @return $this
-     */
-    public function addField($name, array $params = [])
+    public function addField(string $name, array $params = []): static
     {
         $this->fields[$name] = $params;
 
@@ -46,13 +37,9 @@ class Highlight implements BuilderInterface
 
     /**
      * Sets html tag and its class used in highlighting.
-     *
-     * @param array $preTags
-     * @param array $postTags
-     *
      * @return $this
      */
-    public function setTags(array $preTags, array $postTags)
+    public function setTags(array $preTags, array $postTags): static
     {
         $this->tags['pre_tags'] = $preTags;
         $this->tags['post_tags'] = $postTags;
@@ -63,7 +50,7 @@ class Highlight implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'highlight';
     }
@@ -71,7 +58,7 @@ class Highlight implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = [];
 
@@ -82,7 +69,7 @@ class Highlight implements BuilderInterface
         $output = $this->processArray($output);
 
         foreach ($this->fields as $field => $params) {
-            $output['fields'][$field] = count($params) ? $params : new \stdClass();
+            $output['fields'][$field] = count($params) ? $params : [];
         }
 
         return $output;
diff --git a/src/InnerHit/NestedInnerHit.php b/src/InnerHit/NestedInnerHit.php
index e52ca710c1f90b21b5b35c7bc3ff3e0c992f7537..649ebad6a8cd847dc647e81cf3270702e6dc0214 100644
--- a/src/InnerHit/NestedInnerHit.php
+++ b/src/InnerHit/NestedInnerHit.php
@@ -26,66 +26,40 @@ class NestedInnerHit implements NamedBuilderInterface
     use ParametersTrait;
     use NameAwareTrait;
 
-    /**
-     * @var string
-     */
-    private $path;
+    private string $path;
 
-    /**
-     * @var Search
-     */
-    private $search;
+    private ?Search $search = null;
 
     /**
      * Inner hits container init.
-     *
-     * @param string $name
-     * @param string $path
-     * @param Search $search
      */
-    public function __construct($name, $path, Search $search = null)
+    public function __construct(string $name, string $path, Search $search = null)
     {
         $this->setName($name);
         $this->setPath($path);
-        if ($search) {
+        if ($search instanceof Search) {
             $this->setSearch($search);
         }
     }
 
-    /**
-     * @return string
-     */
-    public function getPath()
+    public function getPath(): string
     {
         return $this->path;
     }
 
-    /**
-     * @param string $path
-     *
-     * @return $this
-     */
-    public function setPath($path)
+    public function setPath(string $path): static
     {
         $this->path = $path;
 
         return $this;
     }
 
-    /**
-     * @return Search
-     */
-    public function getSearch()
+    public function getSearch(): ?Search
     {
         return $this->search;
     }
 
-    /**
-     * @param Search $search
-     *
-     * @return $this
-     */
-    public function setSearch(Search $search)
+    public function setSearch(Search $search): static
     {
         $this->search = $search;
 
@@ -95,7 +69,7 @@ class NestedInnerHit implements NamedBuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'nested';
     }
@@ -103,36 +77,26 @@ class NestedInnerHit implements NamedBuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
-        $out = $this->getSearch() ? $this->getSearch()->toArray() : new \stdClass();
+        $out = $this->getSearch() ? $this->getSearch()->toArray() : [];
 
-        $out = [
+        return [
             $this->getPathType() => [
-                $this->getPath() => $out ,
+                $this->getPath() => $out,
             ],
         ];
-
-        return $out;
     }
 
     /**
      * Returns 'path' for nested and 'type' for parent inner hits
-     *
-     * @return null|string
      */
-    private function getPathType()
+    private function getPathType(): ?string
     {
-        switch ($this->getType()) {
-            case 'nested':
-                $type = 'path';
-                break;
-            case 'parent':
-                $type = 'type';
-                break;
-            default:
-                $type = null;
-        }
-        return $type;
+        return match ($this->getType()) {
+            'nested' => 'path',
+            'parent' => 'type',
+            default => null,
+        };
     }
 }
diff --git a/src/InnerHit/ParentInnerHit.php b/src/InnerHit/ParentInnerHit.php
index 3f30c7d5b28edb1aefa645489afe0eece4d9cc87..83a7e6168e88ce542e9a8d7b4f36747d6a422dfc 100644
--- a/src/InnerHit/ParentInnerHit.php
+++ b/src/InnerHit/ParentInnerHit.php
@@ -7,7 +7,7 @@ class ParentInnerHit extends NestedInnerHit
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'parent';
     }
diff --git a/src/NameAwareTrait.php b/src/NameAwareTrait.php
index ccd620e2b050d0f3b7d83a600b6f8637cc9a94e8..9e85a55bd6f52ffa30f2ec60994e1e2bf07031ca 100644
--- a/src/NameAwareTrait.php
+++ b/src/NameAwareTrait.php
@@ -13,25 +13,14 @@ namespace ONGR\ElasticsearchDSL;
 
 trait NameAwareTrait
 {
-    /**
-     * @var string
-     */
-    private $name;
+    private string $name = '';
 
-    /**
-     * @return mixed
-     */
-    public function getName()
+    public function getName(): string
     {
         return $this->name;
     }
 
-    /**
-     * @param string $name
-     *
-     * @return $this
-     */
-    public function setName($name)
+    public function setName(string $name): static
     {
         $this->name = $name;
 
diff --git a/src/NamedBuilderInterface.php b/src/NamedBuilderInterface.php
index b9df4322e61f98b1a72fd4add71e651cb821c581..ee791f80026a7d7295d76d40e740f8b535f12fd7 100644
--- a/src/NamedBuilderInterface.php
+++ b/src/NamedBuilderInterface.php
@@ -21,5 +21,5 @@ interface NamedBuilderInterface extends BuilderInterface
      *
      * @return string
      */
-    public function getName();
+    public function getName(): string;
 }
diff --git a/src/ParametersTrait.php b/src/ParametersTrait.php
index 013b4b6d1f6708d6257602896ab7511683fb97ef..08b72a4dcc362fcfd8734a4f88067b68d372cbd4 100644
--- a/src/ParametersTrait.php
+++ b/src/ParametersTrait.php
@@ -16,29 +16,20 @@ namespace ONGR\ElasticsearchDSL;
  */
 trait ParametersTrait
 {
-    /**
-     * @var array
-     */
-    private $parameters = [];
+    private array $parameters = [];
 
     /**
      * Checks if parameter exists.
-     *
-     * @param string $name
-     *
-     * @return bool
      */
-    public function hasParameter($name)
+    public function hasParameter(string $name): bool
     {
         return isset($this->parameters[$name]);
     }
 
     /**
      * Removes parameter.
-     *
-     * @param string $name
      */
-    public function removeParameter($name)
+    public function removeParameter(string $name): void
     {
         if ($this->hasParameter($name)) {
             unset($this->parameters[$name]);
@@ -47,41 +38,26 @@ trait ParametersTrait
 
     /**
      * Returns one parameter by it's name.
-     *
-     * @param string $name
-     *
-     * @return array|string|int|float|bool|\stdClass
      */
-    public function getParameter($name)
+    public function getParameter(string $name): mixed
     {
-        return $this->parameters[$name];
+        return $this->parameters[$name] ?? null;
     }
 
     /**
      * Returns an array of all parameters.
-     *
-     * @return array
      */
-    public function getParameters()
+    public function getParameters(): array
     {
         return $this->parameters;
     }
 
-    /**
-     * @param string                 $name
-     * @param array|string|int|float|bool|\stdClass $value
-     */
-    public function addParameter($name, $value)
+    public function addParameter(string $name, mixed $value): void
     {
         $this->parameters[$name] = $value;
     }
 
-    /**
-     * @param array $parameters
-     *
-     * @return $this
-     */
-    public function setParameters(array $parameters)
+    public function setParameters(array $parameters): static
     {
         $this->parameters = $parameters;
 
@@ -90,12 +66,8 @@ trait ParametersTrait
 
     /**
      * Returns given array merged with parameters.
-     *
-     * @param array $array
-     *
-     * @return array
      */
-    protected function processArray(array $array = [])
+    protected function processArray(array $array = []): array
     {
         return array_merge($array, $this->parameters);
     }
diff --git a/src/Query/Compound/BoolQuery.php b/src/Query/Compound/BoolQuery.php
index ecdebe6c7c980a314d097e40e171e2bb1373f11a..3bb46a41becfd6a0a8c302710ac502ba11270324 100644
--- a/src/Query/Compound/BoolQuery.php
+++ b/src/Query/Compound/BoolQuery.php
@@ -23,27 +23,22 @@ class BoolQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    const MUST = 'must';
-    const MUST_NOT = 'must_not';
-    const SHOULD = 'should';
-    const FILTER = 'filter';
+    final public const MUST = 'must';
+    final public const MUST_NOT = 'must_not';
+    final public const SHOULD = 'should';
+    final public const FILTER = 'filter';
 
-    /**
-     * @var array
-     */
-    private $container = [];
+    private array $container = [];
 
     /**
      * Constructor to prepare container.
-     *
-     * @param array $container
      */
     public function __construct(array $container = [])
     {
         foreach ($container as $type => $queries) {
             $queries = is_array($queries) ? $queries : [$queries];
 
-            array_walk($queries, function ($query) use ($type) {
+            array_walk($queries, function ($query) use ($type): void {
                 $this->add($query, $type);
             });
         }
@@ -68,11 +63,7 @@ class BoolQuery implements BuilderInterface
             return $queries;
         }
 
-        if (isset($this->container[$boolType])) {
-            return $this->container[$boolType];
-        }
-
-        return [];
+        return $this->container[$boolType] ?? [];
     }
 
     /**
@@ -104,7 +95,7 @@ class BoolQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         if (count($this->container) === 1 && isset($this->container[self::MUST])
                 && count($this->container[self::MUST]) === 1) {
@@ -125,7 +116,7 @@ class BoolQuery implements BuilderInterface
         $output = $this->processArray($output);
 
         if (empty($output)) {
-            $output = new \stdClass();
+            $output = [];
         }
 
         return [$this->getType() => $output];
@@ -134,7 +125,7 @@ class BoolQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'bool';
     }
diff --git a/src/Query/Compound/BoostingQuery.php b/src/Query/Compound/BoostingQuery.php
index 87d3523b3ac233d33084f7e6b4646338eb058c09..0df5fd298ad3e824407b1b69f83ddf7fb7fe5d8f 100644
--- a/src/Query/Compound/BoostingQuery.php
+++ b/src/Query/Compound/BoostingQuery.php
@@ -21,36 +21,16 @@ use ONGR\ElasticsearchDSL\BuilderInterface;
 class BoostingQuery implements BuilderInterface
 {
     /**
-     * @var BuilderInterface
-     */
-    private $positive;
-
-    /**
-     * @var BuilderInterface
-     */
-    private $negative;
-
-    /**
-     * @var int|float
-     */
-    private $negativeBoost;
-
-    /**
-     * @param BuilderInterface $positive
-     * @param BuilderInterface $negative
      * @param int|float        $negativeBoost
      */
-    public function __construct(BuilderInterface $positive, BuilderInterface $negative, $negativeBoost)
+    public function __construct(private readonly BuilderInterface $positive, private readonly BuilderInterface $negative, private $negativeBoost)
     {
-        $this->positive = $positive;
-        $this->negative = $negative;
-        $this->negativeBoost = $negativeBoost;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'boosting';
     }
@@ -58,7 +38,7 @@ class BoostingQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'positive' => $this->positive->toArray(),
diff --git a/src/Query/Compound/ConstantScoreQuery.php b/src/Query/Compound/ConstantScoreQuery.php
index ee3373a5f48fed939b28e87d7b537572dae18f0d..c1a19dae31b21d0f9a026e3ed8ee5d265b57841e 100644
--- a/src/Query/Compound/ConstantScoreQuery.php
+++ b/src/Query/Compound/ConstantScoreQuery.php
@@ -23,25 +23,15 @@ class ConstantScoreQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var BuilderInterface
-     */
-    private $query;
-
-    /**
-     * @param BuilderInterface $query
-     * @param array            $parameters
-     */
-    public function __construct(BuilderInterface $query, array $parameters = [])
+    public function __construct(private readonly BuilderInterface $query, array $parameters = [])
     {
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'constant_score';
     }
@@ -49,7 +39,7 @@ class ConstantScoreQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'filter' => $this->query->toArray(),
diff --git a/src/Query/Compound/DisMaxQuery.php b/src/Query/Compound/DisMaxQuery.php
index adb77c36f5a1a46cdacd6b3d55d1fb501a966f79..4bde4c45f8bd33ccfc1cf82f6b5dda6403e4661c 100644
--- a/src/Query/Compound/DisMaxQuery.php
+++ b/src/Query/Compound/DisMaxQuery.php
@@ -26,12 +26,10 @@ class DisMaxQuery implements BuilderInterface
     /**
      * @var BuilderInterface[]
      */
-    private $queries = [];
+    private array $queries = [];
 
     /**
      * Initializes Dis Max query.
-     *
-     * @param array $parameters
      */
     public function __construct(array $parameters = [])
     {
@@ -41,7 +39,6 @@ class DisMaxQuery implements BuilderInterface
     /**
      * Add query.
      *
-     * @param BuilderInterface $query
      *
      * @return DisMaxQuery
      */
@@ -55,7 +52,7 @@ class DisMaxQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'dis_max';
     }
@@ -63,12 +60,13 @@ class DisMaxQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [];
         foreach ($this->queries as $type) {
             $query[] = $type->toArray();
         }
+
         $output = $this->processArray(['queries' => $query]);
 
         return [$this->getType() => $output];
diff --git a/src/Query/Compound/FunctionScoreQuery.php b/src/Query/Compound/FunctionScoreQuery.php
index e7d96c1b503541797b90ecfcd5ec79dd907160f1..323beb68d3653bea1f1b07b61b69d9d10ea4ec44 100644
--- a/src/Query/Compound/FunctionScoreQuery.php
+++ b/src/Query/Compound/FunctionScoreQuery.php
@@ -24,22 +24,12 @@ class FunctionScoreQuery implements BuilderInterface
     use ParametersTrait;
 
     /**
-     * @var BuilderInterface
+     * @var mixed[][]|null
      */
-    private $query;
+    private ?array $functions = null;
 
-    /**
-     * @var array[]
-     */
-    private $functions;
-
-    /**
-     * @param BuilderInterface $query
-     * @param array            $parameters
-     */
-    public function __construct(BuilderInterface $query, array $parameters = [])
+    public function __construct(private readonly BuilderInterface $query, array $parameters = [])
     {
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
@@ -48,7 +38,7 @@ class FunctionScoreQuery implements BuilderInterface
      *
      * @return BuilderInterface object
      */
-    public function getQuery()
+    public function getQuery(): BuilderInterface
     {
         return $this->query;
     }
@@ -56,11 +46,9 @@ class FunctionScoreQuery implements BuilderInterface
     /**
      * Creates field_value_factor function.
      *
-     * @param string           $field
-     * @param float            $factor
-     * @param string           $modifier
-     * @param BuilderInterface $query
-     * @param mixed            $missing
+     * @param string $field
+     * @param float $factor
+     * @param string $modifier
      * @return $this
      */
     public function addFieldValueFactorFunction(
@@ -68,15 +56,17 @@ class FunctionScoreQuery implements BuilderInterface
         $factor,
         $modifier = 'none',
         BuilderInterface $query = null,
-        $missing = null
+        mixed $missing = null
     ) {
         $function = [
-            'field_value_factor' => array_filter([
-                'field' => $field,
-                'factor' => $factor,
-                'modifier' => $modifier,
-                'missing' => $missing
-            ]),
+            'field_value_factor' => array_filter(
+                [
+                    'field' => $field,
+                    'factor' => $factor,
+                    'modifier' => $modifier,
+                    'missing' => $missing,
+                ]
+            ),
         ];
 
         $this->applyFilter($function, $query);
@@ -88,13 +78,10 @@ class FunctionScoreQuery implements BuilderInterface
 
     /**
      * Modifier to apply filter to the function score function.
-     *
-     * @param array            $function
-     * @param BuilderInterface $query
      */
-    private function applyFilter(array &$function, BuilderInterface $query = null)
+    private function applyFilter(array &$function, BuilderInterface $query = null): void
     {
-        if ($query) {
+        if ($query instanceof BuilderInterface) {
             $function['filter'] = $query->toArray();
         }
     }
@@ -102,12 +89,9 @@ class FunctionScoreQuery implements BuilderInterface
     /**
      * Add decay function to function score. Weight and query are optional.
      *
-     * @param string           $type
-     * @param string           $field
-     * @param array            $function
-     * @param array            $options
-     * @param BuilderInterface $query
-     * @param int              $weight
+     * @param string $type
+     * @param string $field
+     * @param int $weight
      *
      * @return $this
      */
@@ -139,8 +123,7 @@ class FunctionScoreQuery implements BuilderInterface
     /**
      * Adds function to function score without decay function. Influence search score only for specific query.
      *
-     * @param float            $weight
-     * @param BuilderInterface $query
+     * @param float $weight
      *
      * @return $this
      */
@@ -160,15 +143,13 @@ class FunctionScoreQuery implements BuilderInterface
     /**
      * Adds random score function. Seed is optional.
      *
-     * @param mixed            $seed
-     * @param BuilderInterface $query
      *
      * @return $this
      */
-    public function addRandomFunction($seed = null, BuilderInterface $query = null)
+    public function addRandomFunction(mixed $seed = null, BuilderInterface $query = null)
     {
         $function = [
-            'random_score' => $seed ? [ 'seed' => $seed ] : new \stdClass(),
+            'random_score' => $seed ? ['seed' => $seed] : [],
         ];
 
         $this->applyFilter($function, $query);
@@ -181,10 +162,7 @@ class FunctionScoreQuery implements BuilderInterface
     /**
      * Adds script score function.
      *
-     * @param string           $inline
-     * @param array            $params
-     * @param array            $options
-     * @param BuilderInterface $query
+     * @param string $inline
      *
      * @return $this
      */
@@ -202,11 +180,11 @@ class FunctionScoreQuery implements BuilderInterface
                             [
                                 'lang' => 'painless',
                                 'inline' => $inline,
-                                'params' => $params
+                                'params' => $params,
                             ],
                             $options
                         )
-                    )
+                    ),
             ],
         ];
 
@@ -219,7 +197,6 @@ class FunctionScoreQuery implements BuilderInterface
     /**
      * Adds custom simple function. You can add to the array whatever you want.
      *
-     * @param array $function
      *
      * @return $this
      */
@@ -233,7 +210,7 @@ class FunctionScoreQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'query' => $this->query->toArray(),
@@ -248,7 +225,7 @@ class FunctionScoreQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'function_score';
     }
diff --git a/src/Query/FullText/CommonTermsQuery.php b/src/Query/FullText/CommonTermsQuery.php
index 2e31b13bf01ddaea99147560bc877459f0dd8539..66c19c97ad2096a440d60096b35db4fe94df8e78 100644
--- a/src/Query/FullText/CommonTermsQuery.php
+++ b/src/Query/FullText/CommonTermsQuery.php
@@ -23,32 +23,19 @@ class CommonTermsQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var string
-     */
-    private $query;
-
     /**
      * @param string $field
      * @param string $query
-     * @param array  $parameters
      */
-    public function __construct($field, $query, array $parameters = [])
+    public function __construct(private $field, private $query, array $parameters = [])
     {
-        $this->field = $field;
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'common';
     }
@@ -56,7 +43,7 @@ class CommonTermsQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'query' => $this->query,
diff --git a/src/Query/FullText/MatchPhrasePrefixQuery.php b/src/Query/FullText/MatchPhrasePrefixQuery.php
index 58f8a83a9e1c600cd6126a6c10641d43f3932bb0..42e78784d588d541376720362f30a3ca936f6985 100644
--- a/src/Query/FullText/MatchPhrasePrefixQuery.php
+++ b/src/Query/FullText/MatchPhrasePrefixQuery.php
@@ -22,7 +22,7 @@ class MatchPhrasePrefixQuery extends MatchQuery
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'match_phrase_prefix';
     }
diff --git a/src/Query/FullText/MatchPhraseQuery.php b/src/Query/FullText/MatchPhraseQuery.php
index 2560088f31d99b76299d761ec9ccb6e4843a1147..c2f0baf12ad215b7c47ffd7b35176a124d88e9c4 100644
--- a/src/Query/FullText/MatchPhraseQuery.php
+++ b/src/Query/FullText/MatchPhraseQuery.php
@@ -22,7 +22,7 @@ class MatchPhraseQuery extends MatchQuery
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'match_phrase';
     }
diff --git a/src/Query/FullText/MatchQuery.php b/src/Query/FullText/MatchQuery.php
index 6ce6801c95c2747be4e4521515aa777a401e93f1..7f5398ac4d4aac8bd325b0bc63c8dc39b00e928a 100644
--- a/src/Query/FullText/MatchQuery.php
+++ b/src/Query/FullText/MatchQuery.php
@@ -23,32 +23,19 @@ class MatchQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var string
-     */
-    private $query;
-
     /**
      * @param string $field
      * @param string $query
-     * @param array  $parameters
      */
-    public function __construct($field, $query, array $parameters = [])
+    public function __construct(private $field, private $query, array $parameters = [])
     {
-        $this->field = $field;
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'match';
     }
@@ -56,7 +43,7 @@ class MatchQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'query' => $this->query,
diff --git a/src/Query/FullText/MultiMatchQuery.php b/src/Query/FullText/MultiMatchQuery.php
index 1450916e40e55641b8917c3133647b8929631aa8..89ee785f2abce8d1e7a3e6334fa7d43b95634ac1 100644
--- a/src/Query/FullText/MultiMatchQuery.php
+++ b/src/Query/FullText/MultiMatchQuery.php
@@ -29,32 +29,15 @@ class MultiMatchQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var array
-     */
-    private $fields = [];
-
-    /**
-     * @var string
-     */
-    private $query;
-
-    /**
-     * @param array  $fields
-     * @param string $query
-     * @param array  $parameters
-     */
-    public function __construct(array $fields, $query, array $parameters = [])
+    public function __construct(private readonly array $fields, private ?string $query, array $parameters = [])
     {
-        $this->fields = $fields;
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'multi_match';
     }
@@ -62,7 +45,7 @@ class MultiMatchQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'query' => $this->query,
diff --git a/src/Query/FullText/QueryStringQuery.php b/src/Query/FullText/QueryStringQuery.php
index 29eda3fafa17efced0b833bb1fc5151707f31338..9b90f021e3e4fe1c8a14b34f3b1c3c7c50579df0 100644
--- a/src/Query/FullText/QueryStringQuery.php
+++ b/src/Query/FullText/QueryStringQuery.php
@@ -23,25 +23,18 @@ class QueryStringQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string The actual query to be parsed.
-     */
-    private $query;
-
     /**
      * @param string $query
-     * @param array  $parameters
      */
-    public function __construct($query, array $parameters = [])
+    public function __construct(private $query, array $parameters = [])
     {
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'query_string';
     }
@@ -49,7 +42,7 @@ class QueryStringQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'query' => $this->query,
diff --git a/src/Query/FullText/SimpleQueryStringQuery.php b/src/Query/FullText/SimpleQueryStringQuery.php
index 976ffceb1cca64a05fdcd6aa6d7f6c355092fef6..efee2cd81fe3883aaf270f2da80daae3d77ca6b1 100644
--- a/src/Query/FullText/SimpleQueryStringQuery.php
+++ b/src/Query/FullText/SimpleQueryStringQuery.php
@@ -23,25 +23,18 @@ class SimpleQueryStringQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string The actual query to be parsed.
-     */
-    private $query;
-
     /**
      * @param string $query
-     * @param array  $parameters
      */
-    public function __construct($query, array $parameters = [])
+    public function __construct(private $query, array $parameters = [])
     {
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'simple_query_string';
     }
@@ -49,7 +42,7 @@ class SimpleQueryStringQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'query' => $this->query,
diff --git a/src/Query/Geo/GeoBoundingBoxQuery.php b/src/Query/Geo/GeoBoundingBoxQuery.php
index 98bb050d690f0a07929bc96bd517f603c25dab07..e2db2fce90d4c8d0bb6d59b4af2010bedc7e74e7 100644
--- a/src/Query/Geo/GeoBoundingBoxQuery.php
+++ b/src/Query/Geo/GeoBoundingBoxQuery.php
@@ -23,32 +23,19 @@ class GeoBoundingBoxQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var array
-     */
-    private $values;
-
-    /**
-     * @var string
-     */
-    private $field;
-
     /**
      * @param string $field
      * @param array  $values
-     * @param array  $parameters
      */
-    public function __construct($field, $values, array $parameters = [])
+    public function __construct(private $field, private $values, array $parameters = [])
     {
-        $this->field = $field;
-        $this->values = $values;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'geo_bounding_box';
     }
@@ -56,7 +43,7 @@ class GeoBoundingBoxQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         return [
             $this->getType() => $this->processArray([$this->field => $this->points()])
diff --git a/src/Query/Geo/GeoDistanceQuery.php b/src/Query/Geo/GeoDistanceQuery.php
index 03cf202181eecea6540391ecd186784484042e32..df60072f52fd23d89c6d521924b63f612ab620af 100644
--- a/src/Query/Geo/GeoDistanceQuery.php
+++ b/src/Query/Geo/GeoDistanceQuery.php
@@ -23,40 +23,19 @@ class GeoDistanceQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var string
-     */
-    private $distance;
-
-    /**
-     * @var mixed
-     */
-    private $location;
-
     /**
      * @param string $field
      * @param string $distance
-     * @param mixed  $location
-     * @param array  $parameters
      */
-    public function __construct($field, $distance, $location, array $parameters = [])
+    public function __construct(private $field, private $distance, private readonly mixed $location, array $parameters = [])
     {
-        $this->field = $field;
-        $this->distance = $distance;
-        $this->location = $location;
-
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'geo_distance';
     }
@@ -64,7 +43,7 @@ class GeoDistanceQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'distance' => $this->distance,
diff --git a/src/Query/Geo/GeoPolygonQuery.php b/src/Query/Geo/GeoPolygonQuery.php
index 51a9c4eab47fe3c9dd77b6f33657fd6cda8d0e89..656154dd29792241127fdd0a6d8b8334dcee0a8a 100644
--- a/src/Query/Geo/GeoPolygonQuery.php
+++ b/src/Query/Geo/GeoPolygonQuery.php
@@ -23,32 +23,18 @@ class GeoPolygonQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var array
-     */
-    private $points;
-
     /**
      * @param string $field
-     * @param array  $points
-     * @param array  $parameters
      */
-    public function __construct($field, array $points = [], array $parameters = [])
+    public function __construct(private $field, private readonly array $points = [], array $parameters = [])
     {
-        $this->field = $field;
-        $this->points = $points;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'geo_polygon';
     }
@@ -56,7 +42,7 @@ class GeoPolygonQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [$this->field => ['points' => $this->points]];
         $output = $this->processArray($query);
diff --git a/src/Query/Geo/GeoShapeQuery.php b/src/Query/Geo/GeoShapeQuery.php
index a2a5893a1cd853f9869be2a46592c9eefeb13bb0..029b2339514cffccdcff95edbd9dc015414ca498 100644
--- a/src/Query/Geo/GeoShapeQuery.php
+++ b/src/Query/Geo/GeoShapeQuery.php
@@ -23,19 +23,16 @@ class GeoShapeQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    const INTERSECTS = 'intersects';
-    const DISJOINT = 'disjoint';
-    const WITHIN = 'within';
-    const CONTAINS = 'contains';
+    final public const INTERSECTS = 'intersects';
 
-    /**
-     * @var array
-     */
-    private $fields = [];
+    final public const DISJOINT = 'disjoint';
+
+    final public const WITHIN = 'within';
+
+    final public const CONTAINS = 'contains';
+
+    private array $fields = [];
 
-    /**
-     * @param array $parameters
-     */
     public function __construct(array $parameters = [])
     {
         $this->setParameters($parameters);
@@ -44,7 +41,7 @@ class GeoShapeQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'geo_shape';
     }
@@ -58,7 +55,7 @@ class GeoShapeQuery implements BuilderInterface
      * @param string $relation    Spatial relation.
      * @param array  $parameters  Additional parameters.
      */
-    public function addShape($field, $type, array $coordinates, $relation = self::INTERSECTS, array $parameters = [])
+    public function addShape($field, $type, array $coordinates, $relation = self::INTERSECTS, array $parameters = []): void
     {
         // TODO: remove this in the next major version
         if (is_array($relation)) {
@@ -100,7 +97,7 @@ class GeoShapeQuery implements BuilderInterface
         $path,
         $relation = self::INTERSECTS,
         array $parameters = []
-    ) {
+    ): void {
         // TODO: remove this in the next major version
         if (is_array($relation)) {
             $parameters = $relation;
@@ -127,7 +124,7 @@ class GeoShapeQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = $this->processArray($this->fields);
 
diff --git a/src/Query/Joining/HasChildQuery.php b/src/Query/Joining/HasChildQuery.php
index 4682f8c5f4913276c1859510d3d2e206e13ca851..809d59ae75707759318f2fc61dc69ffa90c58b54 100644
--- a/src/Query/Joining/HasChildQuery.php
+++ b/src/Query/Joining/HasChildQuery.php
@@ -23,32 +23,18 @@ class HasChildQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $type;
-
-    /**
-     * @var BuilderInterface
-     */
-    private $query;
-
     /**
      * @param string           $type
-     * @param BuilderInterface $query
-     * @param array            $parameters
      */
-    public function __construct($type, BuilderInterface $query, array $parameters = [])
+    public function __construct(private $type, private readonly BuilderInterface $query, array $parameters = [])
     {
-        $this->type = $type;
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'has_child';
     }
@@ -56,7 +42,7 @@ class HasChildQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'type' => $this->type,
diff --git a/src/Query/Joining/HasParentQuery.php b/src/Query/Joining/HasParentQuery.php
index a575639b5048990432f10c3da2b4fd0a7bc97e86..37fe5e1433bb6cae27a90b14700564659b3eac5b 100644
--- a/src/Query/Joining/HasParentQuery.php
+++ b/src/Query/Joining/HasParentQuery.php
@@ -23,32 +23,18 @@ class HasParentQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $parentType;
-
-    /**
-     * @var BuilderInterface
-     */
-    private $query;
-
     /**
      * @param string           $parentType
-     * @param BuilderInterface $query
-     * @param array            $parameters
      */
-    public function __construct($parentType, BuilderInterface $query, array $parameters = [])
+    public function __construct(private $parentType, private readonly BuilderInterface $query, array $parameters = [])
     {
-        $this->parentType = $parentType;
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'has_parent';
     }
@@ -56,7 +42,7 @@ class HasParentQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'parent_type' => $this->parentType,
diff --git a/src/Query/Joining/NestedQuery.php b/src/Query/Joining/NestedQuery.php
index e43ff18be4414ed6aa829cf096512492bbd69efd..c77958ca0c4ce01f7d7968f6ca0d14170ff3f765 100644
--- a/src/Query/Joining/NestedQuery.php
+++ b/src/Query/Joining/NestedQuery.php
@@ -23,32 +23,18 @@ class NestedQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $path;
-
-    /**
-     * @var BuilderInterface
-     */
-    private $query;
-
     /**
      * @param string           $path
-     * @param BuilderInterface $query
-     * @param array            $parameters
      */
-    public function __construct($path, BuilderInterface $query, array $parameters = [])
+    public function __construct(private $path, private readonly BuilderInterface $query, array $parameters = [])
     {
-        $this->path = $path;
-        $this->query = $query;
         $this->parameters = $parameters;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'nested';
     }
@@ -56,7 +42,7 @@ class NestedQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         return [
             $this->getType() => $this->processArray(
@@ -70,10 +56,8 @@ class NestedQuery implements BuilderInterface
 
     /**
      * Returns nested query object.
-     *
-     * @return BuilderInterface
      */
-    public function getQuery()
+    public function getQuery(): BuilderInterface
     {
         return $this->query;
     }
diff --git a/src/Query/Joining/ParentIdQuery.php b/src/Query/Joining/ParentIdQuery.php
index f6edd9b289c9d2d9def867af86e1ed98ba6f71a4..8c2be24bb450c9af9f86a7a675f38b274e1aac0d 100644
--- a/src/Query/Joining/ParentIdQuery.php
+++ b/src/Query/Joining/ParentIdQuery.php
@@ -12,32 +12,18 @@ class ParentIdQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $childType;
-
-    /**
-     * @var string
-     */
-    private $parentId;
-
     /**
      * @param string $parentId
-     * @param string $childType
-     * @param array  $parameters
      */
-    public function __construct($parentId, string $childType, array $parameters = [])
+    public function __construct(private $parentId, private readonly string $childType, array $parameters = [])
     {
-        $this->childType = $childType;
-        $this->parentId = $parentId;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'parent_id';
     }
@@ -45,7 +31,7 @@ class ParentIdQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'id' => $this->parentId,
diff --git a/src/Query/MatchAllQuery.php b/src/Query/MatchAllQuery.php
index 2529ac60f606786bddc1222ebc883cec3eca20ec..0a727aba1aa804005677ea7367355287d37b1bab 100644
--- a/src/Query/MatchAllQuery.php
+++ b/src/Query/MatchAllQuery.php
@@ -34,7 +34,7 @@ class MatchAllQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'match_all';
     }
@@ -42,9 +42,9 @@ class MatchAllQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $params = $this->getParameters();
-        return [$this->getType() => !empty($params) ? $params : new \stdClass()];
+        return [$this->getType() => !empty($params) ? $params : []];
     }
 }
diff --git a/src/Query/Span/FieldMaskingSpanQuery.php b/src/Query/Span/FieldMaskingSpanQuery.php
index f2cc45783f6949308782cf8693a2fe1e7a35b9eb..9cd641fc0c39e2275d3bc2e894335801a72907d9 100644
--- a/src/Query/Span/FieldMaskingSpanQuery.php
+++ b/src/Query/Span/FieldMaskingSpanQuery.php
@@ -34,7 +34,6 @@ class FieldMaskingSpanQuery implements SpanQueryInterface
 
     /**
      * @param string             $field
-     * @param SpanQueryInterface $query
      */
     public function __construct($field, SpanQueryInterface $query)
     {
@@ -51,11 +50,9 @@ class FieldMaskingSpanQuery implements SpanQueryInterface
     }
 
     /**
-     * @param mixed $query
-     *
      * @return $this
      */
-    public function setQuery($query)
+    public function setQuery(mixed $query)
     {
         $this->query = $query;
 
@@ -85,7 +82,7 @@ class FieldMaskingSpanQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = [
             'query' => $this->getQuery()->toArray(),
@@ -100,7 +97,7 @@ class FieldMaskingSpanQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'field_masking_span';
     }
diff --git a/src/Query/Span/SpanContainingQuery.php b/src/Query/Span/SpanContainingQuery.php
index aed6e67b04db791d5ac18a761ef3afb63d690168..ed23bd0efe2b60f5e311aa5ad466f4ba76f06b53 100644
--- a/src/Query/Span/SpanContainingQuery.php
+++ b/src/Query/Span/SpanContainingQuery.php
@@ -25,34 +25,25 @@ class SpanContainingQuery implements SpanQueryInterface
     /**
      * @param SpanQueryInterface
      */
-    private $little;
+    private SpanQueryInterface $little;
 
     /**
      * @param SpanQueryInterface
      */
-    private $big;
+    private SpanQueryInterface $big;
 
-    /**
-     * @param SpanQueryInterface $little
-     * @param SpanQueryInterface $big
-     */
     public function __construct(SpanQueryInterface $little, SpanQueryInterface $big)
     {
         $this->setLittle($little);
         $this->setBig($big);
     }
 
-    /**
-     * @return SpanQueryInterface
-     */
-    public function getLittle()
+    public function getLittle(): SpanQueryInterface
     {
         return $this->little;
     }
 
     /**
-     * @param SpanQueryInterface $little
-     *
      * @return $this
      */
     public function setLittle(SpanQueryInterface $little)
@@ -62,17 +53,12 @@ class SpanContainingQuery implements SpanQueryInterface
         return $this;
     }
 
-    /**
-     * @return SpanQueryInterface
-     */
-    public function getBig()
+    public function getBig(): SpanQueryInterface
     {
         return $this->big;
     }
 
     /**
-     * @param SpanQueryInterface $big
-     *
      * @return $this
      */
     public function setBig(SpanQueryInterface $big)
@@ -85,7 +71,7 @@ class SpanContainingQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'span_containing';
     }
@@ -93,7 +79,7 @@ class SpanContainingQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = [
             'little' => $this->getLittle()->toArray(),
diff --git a/src/Query/Span/SpanFirstQuery.php b/src/Query/Span/SpanFirstQuery.php
index 46f16ef90daeb646872d9043463113ac69f018bb..61e33df268e9ff23f643da4b6729c1d087fdd9d2 100644
--- a/src/Query/Span/SpanFirstQuery.php
+++ b/src/Query/Span/SpanFirstQuery.php
@@ -23,33 +23,19 @@ class SpanFirstQuery implements SpanQueryInterface
     use ParametersTrait;
 
     /**
-     * @var SpanQueryInterface
-     */
-    private $query;
-
-    /**
-     * @var int
-     */
-    private $end;
-
-    /**
-     * @param SpanQueryInterface $query
      * @param int                $end
-     * @param array              $parameters
      *
      * @throws \LogicException
      */
-    public function __construct(SpanQueryInterface $query, $end, array $parameters = [])
+    public function __construct(private readonly SpanQueryInterface $query, private $end, array $parameters = [])
     {
-        $this->query = $query;
-        $this->end = $end;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'span_first';
     }
@@ -57,7 +43,7 @@ class SpanFirstQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [];
         $query['match'] = $this->query->toArray();
diff --git a/src/Query/Span/SpanMultiTermQuery.php b/src/Query/Span/SpanMultiTermQuery.php
index 9042c59897c48e33c35308be9dd97ddd29c36967..ac021692daddcf66c1a8dfba10fe6818113757a9 100644
--- a/src/Query/Span/SpanMultiTermQuery.php
+++ b/src/Query/Span/SpanMultiTermQuery.php
@@ -23,27 +23,18 @@ class SpanMultiTermQuery implements SpanQueryInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var BuilderInterface
-     */
-    private $query;
-
     /**
      * Accepts one of fuzzy, prefix, term range, wildcard, regexp query.
-     *
-     * @param BuilderInterface $query
-     * @param array            $parameters
      */
-    public function __construct(BuilderInterface $query, array $parameters = [])
+    public function __construct(private readonly BuilderInterface $query, array $parameters = [])
     {
-        $this->query = $query;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'span_multi';
     }
@@ -53,7 +44,7 @@ class SpanMultiTermQuery implements SpanQueryInterface
      *
      * @throws \InvalidArgumentException
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [];
         $query['match'] = $this->query->toArray();
diff --git a/src/Query/Span/SpanNearQuery.php b/src/Query/Span/SpanNearQuery.php
index 086f414b00e16fc7628b44154c981780f765e8b1..b0392ac6d3023af1e654bef7b475ccd49807d9f6 100644
--- a/src/Query/Span/SpanNearQuery.php
+++ b/src/Query/Span/SpanNearQuery.php
@@ -46,7 +46,7 @@ class SpanNearQuery extends SpanOrQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'span_near';
     }
@@ -54,12 +54,13 @@ class SpanNearQuery extends SpanOrQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [];
         foreach ($this->getQueries() as $type) {
             $query['clauses'][] = $type->toArray();
         }
+
         $query['slop'] = $this->getSlop();
         $output = $this->processArray($query);
 
diff --git a/src/Query/Span/SpanNotQuery.php b/src/Query/Span/SpanNotQuery.php
index 1492d1a1d8c26b5813451ec618fd0b5a8357a2a3..2929b6ae096bc732882d65d3961502ea0a4d13c5 100644
--- a/src/Query/Span/SpanNotQuery.php
+++ b/src/Query/Span/SpanNotQuery.php
@@ -22,32 +22,15 @@ class SpanNotQuery implements SpanQueryInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var SpanQueryInterface
-     */
-    private $include;
-
-    /**
-     * @var SpanQueryInterface
-     */
-    private $exclude;
-
-    /**
-     * @param SpanQueryInterface $include
-     * @param SpanQueryInterface $exclude
-     * @param array              $parameters
-     */
-    public function __construct(SpanQueryInterface $include, SpanQueryInterface $exclude, array $parameters = [])
+    public function __construct(private readonly SpanQueryInterface $include, private readonly SpanQueryInterface $exclude, array $parameters = [])
     {
-        $this->include = $include;
-        $this->exclude = $exclude;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'span_not';
     }
@@ -55,7 +38,7 @@ class SpanNotQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'include' => $this->include->toArray(),
diff --git a/src/Query/Span/SpanOrQuery.php b/src/Query/Span/SpanOrQuery.php
index 9f3ec54ddee340f27f7f372f221d5a466d413bac..3ff25aaf1a22ab266c71705fe14eab53eaede885 100644
--- a/src/Query/Span/SpanOrQuery.php
+++ b/src/Query/Span/SpanOrQuery.php
@@ -25,11 +25,8 @@ class SpanOrQuery implements SpanQueryInterface
     /**
      * @var SpanQueryInterface[]
      */
-    private $queries = [];
+    private array $queries = [];
 
-    /**
-     * @param array $parameters
-     */
     public function __construct(array $parameters = [])
     {
         $this->setParameters($parameters);
@@ -38,7 +35,6 @@ class SpanOrQuery implements SpanQueryInterface
     /**
      * Add span query.
      *
-     * @param SpanQueryInterface $query
      *
      * @return $this
      */
@@ -60,7 +56,7 @@ class SpanOrQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'span_or';
     }
@@ -68,12 +64,13 @@ class SpanOrQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [];
         foreach ($this->queries as $type) {
             $query['clauses'][] = $type->toArray();
         }
+
         $output = $this->processArray($query);
 
         return [$this->getType() => $output];
diff --git a/src/Query/Span/SpanTermQuery.php b/src/Query/Span/SpanTermQuery.php
index acfbf5106e546050780034d2d5d5c402aca36ee5..dbe63a0dd42cc3eb266431c34aa8d3da40f6f0aa 100644
--- a/src/Query/Span/SpanTermQuery.php
+++ b/src/Query/Span/SpanTermQuery.php
@@ -23,7 +23,7 @@ class SpanTermQuery extends TermQuery implements SpanQueryInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'span_term';
     }
diff --git a/src/Query/Span/SpanWithinQuery.php b/src/Query/Span/SpanWithinQuery.php
index c7d8ade1efbdd33acca99510ed3d007427962947..2df2bb41800284717ce0a9916b862c26632a1aee 100644
--- a/src/Query/Span/SpanWithinQuery.php
+++ b/src/Query/Span/SpanWithinQuery.php
@@ -21,7 +21,7 @@ class SpanWithinQuery extends SpanContainingQuery
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'span_within';
     }
diff --git a/src/Query/Specialized/MoreLikeThisQuery.php b/src/Query/Specialized/MoreLikeThisQuery.php
index af721ada458a1c0becc83bde34ab22451241760d..90d5d1907749d7f9daae5299b0604eaebafb05f7 100644
--- a/src/Query/Specialized/MoreLikeThisQuery.php
+++ b/src/Query/Specialized/MoreLikeThisQuery.php
@@ -23,25 +23,18 @@ class MoreLikeThisQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string The text to find documents like it, required if ids or docs are not specified.
-     */
-    private $like;
-
     /**
      * @param string $like
-     * @param array  $parameters
      */
-    public function __construct($like, array $parameters = [])
+    public function __construct(private $like, array $parameters = [])
     {
-        $this->like = $like;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'more_like_this';
     }
@@ -49,11 +42,11 @@ class MoreLikeThisQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [];
 
-        if (($this->hasParameter('ids') === false) || ($this->hasParameter('docs') === false)) {
+        if ((!$this->hasParameter('ids')) || (!$this->hasParameter('docs'))) {
             $query['like'] = $this->like;
         }
 
diff --git a/src/Query/Specialized/ScriptQuery.php b/src/Query/Specialized/ScriptQuery.php
index 07ef289ec5ec0a9ed14f0e35e45974416b5500f9..ce166d331d4f4a89fa548ad58c10b3bdb92d5062 100644
--- a/src/Query/Specialized/ScriptQuery.php
+++ b/src/Query/Specialized/ScriptQuery.php
@@ -23,25 +23,19 @@ class ScriptQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $script;
-
     /**
      * @param string $script     Script
      * @param array  $parameters Optional parameters
      */
-    public function __construct($script, array $parameters = [])
+    public function __construct(private $script, array $parameters = [])
     {
-        $this->script = $script;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'script';
     }
@@ -49,7 +43,7 @@ class ScriptQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = ['inline' => $this->script];
         $output = $this->processArray($query);
diff --git a/src/Query/Specialized/TemplateQuery.php b/src/Query/Specialized/TemplateQuery.php
index ab541d37c917128e71b1c897ae45ee669d9d3368..de5c96e6175968500e709d58fe8606ddd21b6c2a 100644
--- a/src/Query/Specialized/TemplateQuery.php
+++ b/src/Query/Specialized/TemplateQuery.php
@@ -113,7 +113,7 @@ class TemplateQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'template';
     }
@@ -121,7 +121,7 @@ class TemplateQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = array_filter(
             [
diff --git a/src/Query/TermLevel/ExistsQuery.php b/src/Query/TermLevel/ExistsQuery.php
index f72e6e5241a57600087a1ba7223f52eec5a6743a..49a5d3230d428398fe8693dd8861b2a2621e521d 100644
--- a/src/Query/TermLevel/ExistsQuery.php
+++ b/src/Query/TermLevel/ExistsQuery.php
@@ -20,25 +20,17 @@ use ONGR\ElasticsearchDSL\BuilderInterface;
  */
 class ExistsQuery implements BuilderInterface
 {
-    /**
-     * @var string
-     */
-    private $field;
-
     /**
      * Constructor.
-     *
-     * @param string $field Field value
      */
-    public function __construct($field)
+    public function __construct(private string $field)
     {
-        $this->field = $field;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'exists';
     }
@@ -46,7 +38,7 @@ class ExistsQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         return [
             $this->getType() => [
diff --git a/src/Query/TermLevel/FuzzyQuery.php b/src/Query/TermLevel/FuzzyQuery.php
index e7e7535b550aed591b22ad5f28829cd58aaba9b4..418c919155b6447efb8e2c18ab3b7f4dee3eb455 100644
--- a/src/Query/TermLevel/FuzzyQuery.php
+++ b/src/Query/TermLevel/FuzzyQuery.php
@@ -23,32 +23,19 @@ class FuzzyQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var string
-     */
-    private $value;
-
     /**
      * @param string $field
      * @param string $value
-     * @param array  $parameters
      */
-    public function __construct($field, $value, array $parameters = [])
+    public function __construct(private $field, private $value, array $parameters = [])
     {
-        $this->field = $field;
-        $this->value = $value;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'fuzzy';
     }
@@ -56,7 +43,7 @@ class FuzzyQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'value' => $this->value,
diff --git a/src/Query/TermLevel/IdsQuery.php b/src/Query/TermLevel/IdsQuery.php
index 29edd33d8af83e58e08b9845adb5f9d43f469853..749066bef6001ab60a5c1a06fbca0f464fdf0cde 100644
--- a/src/Query/TermLevel/IdsQuery.php
+++ b/src/Query/TermLevel/IdsQuery.php
@@ -23,25 +23,15 @@ class IdsQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var array
-     */
-    private $values;
-
-    /**
-     * @param array $values
-     * @param array $parameters
-     */
-    public function __construct(array $values, array $parameters = [])
+    public function __construct(private readonly array $values, array $parameters = [])
     {
-        $this->values = $values;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'ids';
     }
@@ -49,7 +39,7 @@ class IdsQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'values' => $this->values,
diff --git a/src/Query/TermLevel/PrefixQuery.php b/src/Query/TermLevel/PrefixQuery.php
index c453121c490febf3d142be35bfdab579f5d47818..5b0a20bf7939b4f823d5cde4b8bb73610eab7549 100644
--- a/src/Query/TermLevel/PrefixQuery.php
+++ b/src/Query/TermLevel/PrefixQuery.php
@@ -23,32 +23,20 @@ class PrefixQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    protected $field;
-
-    /**
-     * @var string
-     */
-    protected $value;
-
     /**
      * @param string $field      Field name.
      * @param string $value      Value.
      * @param array  $parameters Optional parameters.
      */
-    public function __construct($field, $value, array $parameters = [])
+    public function __construct(protected $field, protected $value, array $parameters = [])
     {
-        $this->field = $field;
-        $this->value = $value;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'prefix';
     }
@@ -56,7 +44,7 @@ class PrefixQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'value' => $this->value,
diff --git a/src/Query/TermLevel/RangeQuery.php b/src/Query/TermLevel/RangeQuery.php
index 9a33142dbaec74f344133276803808b6880dff3c..338224bc696b7fd871e8eada2c0371047c4dcc79 100644
--- a/src/Query/TermLevel/RangeQuery.php
+++ b/src/Query/TermLevel/RangeQuery.php
@@ -26,21 +26,18 @@ class RangeQuery implements BuilderInterface
     /**
      * Range control names.
      */
-    const LT = 'lt';
-    const GT = 'gt';
-    const LTE = 'lte';
-    const GTE = 'gte';
+    final public const LT = 'lt';
 
-    /**
-     * @var string Field name.
-     */
-    private $field;
+    final public const GT = 'gt';
+
+    final public const LTE = 'lte';
+
+    final public const GTE = 'gte';
 
     /**
      * @param string $field
-     * @param array  $parameters
      */
-    public function __construct($field, array $parameters = [])
+    public function __construct(private $field, array $parameters = [])
     {
         $this->setParameters($parameters);
 
@@ -51,14 +48,12 @@ class RangeQuery implements BuilderInterface
         if ($this->hasParameter(self::LTE) && $this->hasParameter(self::LT)) {
             unset($this->parameters[self::LT]);
         }
-
-        $this->field = $field;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'range';
     }
@@ -66,7 +61,7 @@ class RangeQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = [
             $this->field => $this->getParameters(),
diff --git a/src/Query/TermLevel/RegexpQuery.php b/src/Query/TermLevel/RegexpQuery.php
index 4fcee0f78a05ae151547116607f6a27c9e1ece5c..5ffde9e5fe5f54cd189666c44b92c1edd1dfb90b 100644
--- a/src/Query/TermLevel/RegexpQuery.php
+++ b/src/Query/TermLevel/RegexpQuery.php
@@ -23,32 +23,19 @@ class RegexpQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string Field to be queried.
-     */
-    private $field;
-
-    /**
-     * @var string The actual regexp value to be used.
-     */
-    private $regexpValue;
-
     /**
      * @param string $field
      * @param string $regexpValue
-     * @param array  $parameters
      */
-    public function __construct($field, $regexpValue, array $parameters = [])
+    public function __construct(private $field, private $regexpValue, array $parameters = [])
     {
-        $this->field = $field;
-        $this->regexpValue = $regexpValue;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'regexp';
     }
@@ -56,7 +43,7 @@ class RegexpQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'value' => $this->regexpValue,
diff --git a/src/Query/TermLevel/TermQuery.php b/src/Query/TermLevel/TermQuery.php
index 7cbbd78ed1ab0098c366ea9ec8cd60bb891af344..73afffac95b2ed1361cbc391ef410d675fc460ff 100644
--- a/src/Query/TermLevel/TermQuery.php
+++ b/src/Query/TermLevel/TermQuery.php
@@ -23,32 +23,15 @@ class TermQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var string
-     */
-    private $value;
-
-    /**
-     * @param string                $field
-     * @param string|int|float|bool $value
-     * @param array                 $parameters
-     */
-    public function __construct($field, $value, array $parameters = [])
+    public function __construct(private string $field, private mixed $value, array $parameters = [])
     {
-        $this->field = $field;
-        $this->value = $value;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'term';
     }
@@ -56,7 +39,7 @@ class TermQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = $this->processArray();
 
diff --git a/src/Query/TermLevel/TermsQuery.php b/src/Query/TermLevel/TermsQuery.php
index 383322346a7aa0903c6fe6272c74b517de282bac..22697010addaf3ee1cb0b8a9c506d342d7fb9b2a 100644
--- a/src/Query/TermLevel/TermsQuery.php
+++ b/src/Query/TermLevel/TermsQuery.php
@@ -23,16 +23,6 @@ class TermsQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var array
-     */
-    private $terms;
-
     /**
      * Constructor.
      *
@@ -40,17 +30,15 @@ class TermsQuery implements BuilderInterface
      * @param array  $terms      An array of terms
      * @param array  $parameters Optional parameters
      */
-    public function __construct($field, $terms, array $parameters = [])
+    public function __construct(private $field, private $terms, array $parameters = [])
     {
-        $this->field = $field;
-        $this->terms = $terms;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'terms';
     }
@@ -58,7 +46,7 @@ class TermsQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             $this->field => $this->terms,
diff --git a/src/Query/TermLevel/TermsSetQuery.php b/src/Query/TermLevel/TermsSetQuery.php
index 6f9ec80d7fd03717f88690c35d688777436ae15b..d15595ceb339a0d2a606c00474fcaa884e4caf2d 100644
--- a/src/Query/TermLevel/TermsSetQuery.php
+++ b/src/Query/TermLevel/TermsSetQuery.php
@@ -23,18 +23,9 @@ class TermsSetQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    const MINIMUM_SHOULD_MATCH_TYPE_FIELD = 'minimum_should_match_field';
-    const MINIMUM_SHOULD_MATCH_TYPE_SCRIPT = 'minimum_should_match_script';
+    final public const MINIMUM_SHOULD_MATCH_TYPE_FIELD = 'minimum_should_match_field';
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var array
-     */
-    private $terms;
+    final public const MINIMUM_SHOULD_MATCH_TYPE_SCRIPT = 'minimum_should_match_script';
 
     /**
      * Constructor.
@@ -43,10 +34,8 @@ class TermsSetQuery implements BuilderInterface
      * @param array  $terms      An array of terms
      * @param array  $parameters Parameters
      */
-    public function __construct($field, $terms, array $parameters)
+    public function __construct(private $field, private $terms, array $parameters)
     {
-        $this->field = $field;
-        $this->terms = $terms;
         $this->validateParameters($parameters);
         $this->setParameters($parameters);
     }
@@ -54,7 +43,7 @@ class TermsSetQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'terms_set';
     }
@@ -62,7 +51,7 @@ class TermsSetQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'terms' => $this->terms,
diff --git a/src/Query/TermLevel/TypeQuery.php b/src/Query/TermLevel/TypeQuery.php
index a5ae21c87768b5996b1b9a66317e7f0ce96c3baf..533be8f282fcad808caf806629dd94c37adabf38 100644
--- a/src/Query/TermLevel/TypeQuery.php
+++ b/src/Query/TermLevel/TypeQuery.php
@@ -20,25 +20,19 @@ use ONGR\ElasticsearchDSL\BuilderInterface;
  */
 class TypeQuery implements BuilderInterface
 {
-    /**
-     * @var string
-     */
-    private $type;
-
     /**
      * Constructor.
      *
      * @param string $type Type name
      */
-    public function __construct($type)
+    public function __construct(private $type)
     {
-        $this->type = $type;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'type';
     }
@@ -46,7 +40,7 @@ class TypeQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         return [
             $this->getType() => [
diff --git a/src/Query/TermLevel/WildcardQuery.php b/src/Query/TermLevel/WildcardQuery.php
index 8453c9b271ae6ff45f59309a0b9ad0245bed3ed1..901dfb0822b3ed455e77c8decceca34c9a127130 100644
--- a/src/Query/TermLevel/WildcardQuery.php
+++ b/src/Query/TermLevel/WildcardQuery.php
@@ -23,32 +23,19 @@ class WildcardQuery implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var string
-     */
-    private $value;
-
     /**
      * @param string $field
      * @param string $value
-     * @param array  $parameters
      */
-    public function __construct($field, $value, array $parameters = [])
+    public function __construct(private $field, private $value, array $parameters = [])
     {
-        $this->field = $field;
-        $this->value = $value;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'wildcard';
     }
@@ -56,7 +43,7 @@ class WildcardQuery implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $query = [
             'value' => $this->value,
diff --git a/src/ScriptAwareTrait.php b/src/ScriptAwareTrait.php
index 6eb2148efd750ae7338cdb9929cc2361584e66cb..c389f5db13f73bde3a3673ec9da7cfed1707046e 100644
--- a/src/ScriptAwareTrait.php
+++ b/src/ScriptAwareTrait.php
@@ -16,25 +16,14 @@ namespace ONGR\ElasticsearchDSL;
  */
 trait ScriptAwareTrait
 {
-    /**
-     * @var string
-     */
-    private $script;
+    private mixed $script = null;
 
-    /**
-     * @return string
-     */
-    public function getScript()
+    public function getScript(): mixed
     {
         return $this->script;
     }
 
-    /**
-     * @param string $script
-     *
-     * @return $this
-     */
-    public function setScript($script)
+    public function setScript($script): static
     {
         $this->script = $script;
 
diff --git a/src/Search.php b/src/Search.php
index 89726af4fd459dfb6f76028368fa8a00848b90aa..0d21cbf7f2d4eb883445a6b086c3cc7754ac4adc 100644
--- a/src/Search.php
+++ b/src/Search.php
@@ -37,26 +37,20 @@ class Search
     /**
      * If you don’t need to track the total number of hits at all you can improve
      * query times by setting this option to false. Defaults to true.
-     *
-     * @var bool
      */
-    private $trackTotalHits;
+    private ?bool $trackTotalHits = null;
 
     /**
      * To retrieve hits from a certain offset. Defaults to 0.
-     *
-     * @var int
      */
-    private $from;
+    private ?int $from = null;
 
     /**
      * The number of hits to return. Defaults to 10. If you do not care about getting some
      * hits back but only about the number of matches and/or aggregations, setting the value
      * to 0 will help performance.
-     *
-     * @var int
      */
-    private $size;
+    private ?int $size = null;
 
     /**
      * Allows to control how the _source field is returned with every hit. By default
@@ -69,10 +63,8 @@ class Search
 
     /**
      * Allows to selectively load specific stored fields for each document represented by a search hit.
-     *
-     * @var array
      */
-    private $storedFields;
+    private ?array $storedFields = null;
 
     /**
      * Allows to return a script evaluation (based on different fields) for each hit.
@@ -80,10 +72,8 @@ class Search
      * values to be returned (the evaluated value of the script). Script fields can
      * also access the actual _source document indexed and extract specific elements
      * to be returned from it (can be an "object" type).
-     *
-     * @var array
      */
-    private $scriptFields;
+    private ?array $scriptFields = null;
 
     /**
      * Allows to return the doc value representation of a field for each hit. Doc value
@@ -91,40 +81,36 @@ class Search
      * specifies fields without docvalues it will try to load the value from the fielddata
      * cache causing the terms for that field to be loaded to memory (cached), which will
      * result in more memory consumption.
-     *
-     * @var array
      */
-    private $docValueFields;
+    private ?array $docValueFields = null;
 
     /**
      * Enables explanation for each hit on how its score was computed.
      *
      * @var bool
      */
-    private $explain;
+    private ?bool $explain = null;
 
     /**
      * Returns a version for each search hit.
      *
      * @var bool
      */
-    private $version;
+    private ?bool $version = null;
 
     /**
      * Allows to configure different boost level per index when searching across more
      * than one indices. This is very handy when hits coming from one index matter more
      * than hits coming from another index (think social graph where each user has an index).
-     *
-     * @var array
      */
-    private $indicesBoost;
+    private ?array $indicesBoost = null;
 
     /**
      * Exclude documents which have a _score less than the minimum specified in min_score.
      *
      * @var int
      */
-    private $minScore;
+    private ?int $minScore = null;
 
     /**
      * Pagination of results can be done by using the from and size but the cost becomes
@@ -135,19 +121,15 @@ class Search
      * real time user requests. The search_after parameter circumvents this problem by
      * providing a live cursor. The idea is to use the results from the previous page to
      * help the retrieval of the next page.
-     *
-     * @var array
      */
-    private $searchAfter;
+    private ?array $searchAfter = null;
 
     /**
      * URI parameters alongside Request body search.
      *
      * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html
-     *
-     * @var array
      */
-    private $uriParams = [];
+    private ?array $uriParams = null;
 
     /**
      * While a search request returns a single “page” of results, the scroll API can be used to retrieve
@@ -155,20 +137,15 @@ class Search
      * as you would use a cursor on a traditional database. Scrolling is not intended for real time user
      * requests, but rather for processing large amounts of data, e.g. in order to reindex the contents
      * of one index into a new index with a different configuration.
-     *
-     * @var string
      */
-    private $scroll;
+    private ?string $scroll = null;
 
-    /**
-     * @var OrderedSerializer
-     */
-    private static $serializer;
+    private static ?OrderedSerializer $serializer = null;
 
     /**
      * @var SearchEndpointInterface[]
      */
-    private $endpoints = [];
+    private ?array $endpoints = null;
 
     /**
      * Constructor to initialize static properties
@@ -189,9 +166,9 @@ class Search
     /**
      * Initializes the serializer
      */
-    private function initializeSerializer()
+    private function initializeSerializer(): void
     {
-        if (static::$serializer === null) {
+        if (!static::$serializer instanceof OrderedSerializer) {
             static::$serializer = new OrderedSerializer(
                 [
                     new CustomReferencedNormalizer(),
@@ -206,21 +183,15 @@ class Search
      *
      * @param string $type Endpoint type.
      */
-    public function destroyEndpoint($type)
+    public function destroyEndpoint($type): void
     {
         unset($this->endpoints[$type]);
     }
 
     /**
      * Adds query to the search.
-     *
-     * @param BuilderInterface $query
-     * @param string           $boolType
-     * @param string           $key
-     *
-     * @return $this
      */
-    public function addQuery(BuilderInterface $query, $boolType = BoolQuery::MUST, $key = null)
+    public function addQuery(BuilderInterface $query, string $boolType = BoolQuery::MUST, mixed $key = null): static
     {
         $endpoint = $this->getEndpoint(QueryEndpoint::NAME);
         $endpoint->addToBool($query, $boolType, $key);
@@ -237,7 +208,7 @@ class Search
      */
     private function getEndpoint($type)
     {
-        if (!array_key_exists($type, $this->endpoints)) {
+        if (!array_key_exists($type, $this->endpoints ?? [])) {
             $this->endpoints[$type] = SearchEndpointFactory::get($type);
         }
 
@@ -259,11 +230,10 @@ class Search
     /**
      * Sets query endpoint parameters.
      *
-     * @param array $parameters
      *
      * @return $this
      */
-    public function setQueryParameters(array $parameters)
+    public function setQueryParameters(array $parameters): static
     {
         $this->setEndpointParameters(QueryEndpoint::NAME, $parameters);
 
@@ -274,11 +244,10 @@ class Search
      * Sets parameters to the endpoint.
      *
      * @param string $endpointName
-     * @param array  $parameters
      *
      * @return $this
      */
-    public function setEndpointParameters($endpointName, array $parameters)
+    public function setEndpointParameters($endpointName, array $parameters): static
     {
         /** @var AbstractSearchEndpoint $endpoint */
         $endpoint = $this->getEndpoint($endpointName);
@@ -299,7 +268,7 @@ class Search
      *
      * @return $this.
      */
-    public function addPostFilter(BuilderInterface $filter, $boolType = BoolQuery::MUST, $key = null)
+    public function addPostFilter(BuilderInterface $filter, $boolType = BoolQuery::MUST, $key = null): static
     {
         $this
             ->getEndpoint(PostFilterEndpoint::NAME)
@@ -323,11 +292,10 @@ class Search
     /**
      * Sets post filter endpoint parameters.
      *
-     * @param array $parameters
      *
      * @return $this
      */
-    public function setPostFilterParameters(array $parameters)
+    public function setPostFilterParameters(array $parameters): static
     {
         $this->setEndpointParameters(PostFilterEndpoint::NAME, $parameters);
 
@@ -337,11 +305,10 @@ class Search
     /**
      * Adds aggregation into search.
      *
-     * @param AbstractAggregation $aggregation
      *
      * @return $this
      */
-    public function addAggregation(AbstractAggregation $aggregation)
+    public function addAggregation(AbstractAggregation $aggregation): static
     {
         $this->getEndpoint(AggregationsEndpoint::NAME)->add($aggregation, $aggregation->getName());
 
@@ -361,11 +328,10 @@ class Search
     /**
      * Adds inner hit into search.
      *
-     * @param NestedInnerHit $innerHit
      *
      * @return $this
      */
-    public function addInnerHit(NestedInnerHit $innerHit)
+    public function addInnerHit(NestedInnerHit $innerHit): static
     {
         $this->getEndpoint(InnerHitsEndpoint::NAME)->add($innerHit, $innerHit->getName());
 
@@ -385,11 +351,10 @@ class Search
     /**
      * Adds sort to search.
      *
-     * @param BuilderInterface $sort
      *
      * @return $this
      */
-    public function addSort(BuilderInterface $sort)
+    public function addSort(BuilderInterface $sort): static
     {
         $this->getEndpoint(SortEndpoint::NAME)->add($sort);
 
@@ -413,7 +378,7 @@ class Search
      *
      * @return $this.
      */
-    public function addHighlight($highlight)
+    public function addHighlight(BuilderInterface $highlight): static
     {
         $this->getEndpoint(HighlightEndpoint::NAME)->add($highlight);
 
@@ -440,7 +405,7 @@ class Search
     *
     * @return $this
     */
-    public function addSuggest(NamedBuilderInterface $suggest)
+    public function addSuggest(NamedBuilderInterface $suggest): static
     {
         $this->getEndpoint(SuggestEndpoint::NAME)->add($suggest, $suggest->getName());
 
@@ -460,7 +425,7 @@ class Search
     /**
      * @return null|int
      */
-    public function getFrom()
+    public function getFrom(): ?int
     {
         return $this->from;
     }
@@ -470,24 +435,19 @@ class Search
      *
      * @return $this
      */
-    public function setFrom($from)
+    public function setFrom($from): static
     {
         $this->from = $from;
 
         return $this;
     }
 
-    /**
-     * @return bool
-     */
-    public function isTrackTotalHits()
+    public function isTrackTotalHits(): ?bool
     {
         return $this->trackTotalHits;
     }
 
     /**
-     * @param bool $trackTotalHits
-     *
      * @return $this
      */
     public function setTrackTotalHits(bool $trackTotalHits)
@@ -497,20 +457,12 @@ class Search
         return $this;
     }
 
-    /**
-     * @return null|int
-     */
-    public function getSize()
+    public function getSize(): ?int
     {
         return $this->size;
     }
 
-    /**
-     * @param null|int $size
-     *
-     * @return $this
-     */
-    public function setSize($size)
+    public function setSize(?int $size): static
     {
         $this->size = $size;
 
@@ -530,7 +482,7 @@ class Search
      *
      * @return $this
      */
-    public function setSource($source)
+    public function setSource($source): static
     {
         $this->source = $source;
 
@@ -550,7 +502,7 @@ class Search
      *
      * @return $this
      */
-    public function setStoredFields($storedFields)
+    public function setStoredFields($storedFields): static
     {
         $this->storedFields = $storedFields;
 
@@ -570,7 +522,7 @@ class Search
      *
      * @return $this
      */
-    public function setScriptFields($scriptFields)
+    public function setScriptFields($scriptFields): static
     {
         $this->scriptFields = $scriptFields;
 
@@ -590,7 +542,7 @@ class Search
      *
      * @return $this
      */
-    public function setDocValueFields($docValueFields)
+    public function setDocValueFields($docValueFields): static
     {
         $this->docValueFields = $docValueFields;
 
@@ -610,7 +562,7 @@ class Search
      *
      * @return $this
      */
-    public function setExplain($explain)
+    public function setExplain($explain): static
     {
         $this->explain = $explain;
 
@@ -630,7 +582,7 @@ class Search
      *
      * @return $this
      */
-    public function setVersion($version)
+    public function setVersion($version): static
     {
         $this->version = $version;
 
@@ -650,7 +602,7 @@ class Search
      *
      * @return $this
      */
-    public function setIndicesBoost($indicesBoost)
+    public function setIndicesBoost($indicesBoost): static
     {
         $this->indicesBoost = $indicesBoost;
 
@@ -670,7 +622,7 @@ class Search
      *
      * @return $this
      */
-    public function setMinScore($minScore)
+    public function setMinScore($minScore): static
     {
         $this->minScore = $minScore;
 
@@ -690,7 +642,7 @@ class Search
      *
      * @return $this
      */
-    public function setSearchAfter($searchAfter)
+    public function setSearchAfter($searchAfter): static
     {
         $this->searchAfter = $searchAfter;
 
@@ -710,7 +662,7 @@ class Search
      *
      * @return $this
      */
-    public function setScroll($scroll = '5m')
+    public function setScroll(string $scroll = '5m'): static
     {
         $this->scroll = $scroll;
 
@@ -725,7 +677,7 @@ class Search
      *
      * @return $this
      */
-    public function addUriParam($name, $value)
+    public function addUriParam($name, $value): static
     {
         if (in_array($name, [
             'q',
@@ -763,10 +715,8 @@ class Search
 
     /**
      * Returns query url parameters.
-     *
-     * @return array
      */
-    public function getUriParams()
+    public function getUriParams(): array
     {
         return $this->uriParams;
     }
@@ -774,7 +724,7 @@ class Search
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = array_filter(static::$serializer->normalize($this->endpoints));
 
diff --git a/src/SearchEndpoint/AbstractSearchEndpoint.php b/src/SearchEndpoint/AbstractSearchEndpoint.php
index d3e851dcb4847b747daad3005bdec55e51164cb1..1a5b436d4cc570a749de8495f7742f2431e5ac1e 100644
--- a/src/SearchEndpoint/AbstractSearchEndpoint.php
+++ b/src/SearchEndpoint/AbstractSearchEndpoint.php
@@ -25,7 +25,7 @@ abstract class AbstractSearchEndpoint extends AbstractNormalizable implements Se
     /**
      * @var BuilderInterface[]
      */
-    private $container = [];
+    private array $container = [];
 
     /**
      * {@inheritdoc}
@@ -48,7 +48,7 @@ abstract class AbstractSearchEndpoint extends AbstractNormalizable implements Se
     /**
      * {@inheritdoc}
      */
-    public function addToBool(BuilderInterface $builder, $boolType = null, $key = null)
+    public function addToBool(BuilderInterface $builder, ?string $boolType = null, mixed $key = null)
     {
         throw new \BadFunctionCallException(sprintf("Endpoint %s doesn't support bool statements", static::NAME));
     }
@@ -69,10 +69,8 @@ abstract class AbstractSearchEndpoint extends AbstractNormalizable implements Se
      * Checks if builder with specific key exists.
      *
      * @param string $key Key to check if it exists in container.
-     *
-     * @return bool
      */
-    public function has($key)
+    public function has($key): bool
     {
         return array_key_exists($key, $this->container);
     }
diff --git a/src/SearchEndpoint/AggregationsEndpoint.php b/src/SearchEndpoint/AggregationsEndpoint.php
index 079a6a5debcd9db843af2e6d8a7fe354c60f82e8..8eddd6b5ac0e5a31235d95e43d52d403e3142135 100644
--- a/src/SearchEndpoint/AggregationsEndpoint.php
+++ b/src/SearchEndpoint/AggregationsEndpoint.php
@@ -22,19 +22,17 @@ class AggregationsEndpoint extends AbstractSearchEndpoint
     /**
      * Endpoint name
      */
-    const NAME = 'aggregations';
+    final public const NAME = 'aggregations';
 
     /**
      * {@inheritdoc}
      */
-    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = [])
+    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null
     {
         $output = [];
-        if (count($this->getAll()) > 0) {
-            /** @var AbstractAggregation $aggregation */
-            foreach ($this->getAll() as $aggregation) {
-                $output[$aggregation->getName()] = $aggregation->toArray();
-            }
+        /** @var AbstractAggregation $aggregation */
+        foreach ($this->getAll() as $aggregation) {
+            $output[$aggregation->getName()] = $aggregation->toArray();
         }
 
         return $output;
diff --git a/src/SearchEndpoint/HighlightEndpoint.php b/src/SearchEndpoint/HighlightEndpoint.php
index f2b8d8e9836c1e81efdce451c3a0b8352f5197b6..b8380ba117ec58091f3688f316be0b450800f762 100644
--- a/src/SearchEndpoint/HighlightEndpoint.php
+++ b/src/SearchEndpoint/HighlightEndpoint.php
@@ -22,7 +22,7 @@ class HighlightEndpoint extends AbstractSearchEndpoint
     /**
      * Endpoint name
      */
-    const NAME = 'highlight';
+    final public const NAME = 'highlight';
 
     /**
      * @var BuilderInterface
@@ -37,7 +37,7 @@ class HighlightEndpoint extends AbstractSearchEndpoint
     /**
      * {@inheritdoc}
      */
-    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = [])
+    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null
     {
         if ($this->highlight) {
             return $this->highlight->toArray();
@@ -62,7 +62,7 @@ class HighlightEndpoint extends AbstractSearchEndpoint
     /**
      * {@inheritdoc}
      */
-    public function getAll($boolType = null)
+    public function getAll($boolType = null): array
     {
         return [$this->key => $this->highlight];
     }
diff --git a/src/SearchEndpoint/InnerHitsEndpoint.php b/src/SearchEndpoint/InnerHitsEndpoint.php
index f1562fe6e6212748eb74da37baf231ec0057ce70..bcf78c80df4f06772e076ed0d77db9a3ee87bf0c 100644
--- a/src/SearchEndpoint/InnerHitsEndpoint.php
+++ b/src/SearchEndpoint/InnerHitsEndpoint.php
@@ -22,19 +22,17 @@ class InnerHitsEndpoint extends AbstractSearchEndpoint
     /**
      * Endpoint name
      */
-    const NAME = 'inner_hits';
+    final public const NAME = 'inner_hits';
 
     /**
      * {@inheritdoc}
      */
-    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = [])
+    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null
     {
         $output = [];
-        if (count($this->getAll()) > 0) {
-            /** @var NestedInnerHit $innerHit */
-            foreach ($this->getAll() as $innerHit) {
-                $output[$innerHit->getName()] = $innerHit->toArray();
-            }
+        /** @var NestedInnerHit $innerHit */
+        foreach ($this->getAll() as $innerHit) {
+            $output[$innerHit->getName()] = $innerHit->toArray();
         }
 
         return $output;
diff --git a/src/SearchEndpoint/PostFilterEndpoint.php b/src/SearchEndpoint/PostFilterEndpoint.php
index 6055b7ed59475613a4bc19533a61035237ee520b..b35869dfe845cdad92fc16aa39483b2a4a4f6dc9 100644
--- a/src/SearchEndpoint/PostFilterEndpoint.php
+++ b/src/SearchEndpoint/PostFilterEndpoint.php
@@ -21,12 +21,12 @@ class PostFilterEndpoint extends QueryEndpoint
     /**
      * Endpoint name
      */
-    const NAME = 'post_filter';
+    final public const NAME = 'post_filter';
 
     /**
      * {@inheritdoc}
      */
-    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = [])
+    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null
     {
         if (!$this->getBool()) {
             return null;
@@ -38,7 +38,7 @@ class PostFilterEndpoint extends QueryEndpoint
     /**
      * {@inheritdoc}
      */
-    public function getOrder()
+    public function getOrder(): int
     {
         return 1;
     }
diff --git a/src/SearchEndpoint/QueryEndpoint.php b/src/SearchEndpoint/QueryEndpoint.php
index 6212b05d6b0bbcdd336b2c29f488d3bf1009e7b7..24c047701db15c52af430a36e031a7b0ae048bc7 100644
--- a/src/SearchEndpoint/QueryEndpoint.php
+++ b/src/SearchEndpoint/QueryEndpoint.php
@@ -24,22 +24,16 @@ class QueryEndpoint extends AbstractSearchEndpoint implements OrderedNormalizerI
     /**
      * Endpoint name
      */
-    const NAME = 'query';
+    public const NAME = 'query';
 
-    /**
-     * @var BoolQuery
-     */
-    private $bool;
+    private ?BoolQuery $bool = null;
 
-    /**
-     * @var bool
-     */
-    private $filtersSet = false;
+    private bool $filtersSet = false;
 
     /**
      * {@inheritdoc}
      */
-    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = [])
+    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null
     {
         if (!$this->filtersSet && $this->hasReference('filter_query')) {
             /** @var BuilderInterface $filter */
@@ -48,7 +42,7 @@ class QueryEndpoint extends AbstractSearchEndpoint implements OrderedNormalizerI
             $this->filtersSet = true;
         }
 
-        if (!$this->bool) {
+        if (!$this->bool instanceof BoolQuery) {
             return null;
         }
 
@@ -66,9 +60,9 @@ class QueryEndpoint extends AbstractSearchEndpoint implements OrderedNormalizerI
     /**
      * {@inheritdoc}
      */
-    public function addToBool(BuilderInterface $builder, $boolType = null, $key = null)
+    public function addToBool(BuilderInterface $builder, ?string $boolType = null, mixed $key = null)
     {
-        if (!$this->bool) {
+        if (!$this->bool instanceof BoolQuery) {
             $this->bool = new BoolQuery();
         }
 
diff --git a/src/SearchEndpoint/SearchEndpointFactory.php b/src/SearchEndpoint/SearchEndpointFactory.php
index 17e6838bd70c5e99932709fa7624e8ae9b72d2cd..e3acf4a5c5ea84ffe847bdfdedde9fd25e90dd21 100644
--- a/src/SearchEndpoint/SearchEndpointFactory.php
+++ b/src/SearchEndpoint/SearchEndpointFactory.php
@@ -19,14 +19,14 @@ class SearchEndpointFactory
     /**
      * @var array Holds namespaces for endpoints.
      */
-    private static $endpoints = [
-        'query' => 'ONGR\ElasticsearchDSL\SearchEndpoint\QueryEndpoint',
-        'post_filter' => 'ONGR\ElasticsearchDSL\SearchEndpoint\PostFilterEndpoint',
-        'sort' => 'ONGR\ElasticsearchDSL\SearchEndpoint\SortEndpoint',
-        'highlight' => 'ONGR\ElasticsearchDSL\SearchEndpoint\HighlightEndpoint',
-        'aggregations' => 'ONGR\ElasticsearchDSL\SearchEndpoint\AggregationsEndpoint',
-        'suggest' => 'ONGR\ElasticsearchDSL\SearchEndpoint\SuggestEndpoint',
-        'inner_hits' => 'ONGR\ElasticsearchDSL\SearchEndpoint\InnerHitsEndpoint',
+    private static array $endpoints = [
+        'query' => QueryEndpoint::class,
+        'post_filter' => PostFilterEndpoint::class,
+        'sort' => SortEndpoint::class,
+        'highlight' => HighlightEndpoint::class,
+        'aggregations' => AggregationsEndpoint::class,
+        'suggest' => SuggestEndpoint::class,
+        'inner_hits' => InnerHitsEndpoint::class,
     ];
 
     /**
diff --git a/src/SearchEndpoint/SearchEndpointInterface.php b/src/SearchEndpoint/SearchEndpointInterface.php
index 17ec4abfb25536fd107c608510a2b6e0d851b3ba..0464cba1f112f2a942944fb8d36656715ff39705 100644
--- a/src/SearchEndpoint/SearchEndpointInterface.php
+++ b/src/SearchEndpoint/SearchEndpointInterface.php
@@ -40,7 +40,7 @@ interface SearchEndpointInterface extends NormalizableInterface
      *
      * @return string Key of added builder.
      */
-    public function addToBool(BuilderInterface $builder, $boolType = null, $key = null);
+    public function addToBool(BuilderInterface $builder, ?string $boolType = null, mixed $key = null);
 
     /**
      * Removes contained builder.
diff --git a/src/SearchEndpoint/SortEndpoint.php b/src/SearchEndpoint/SortEndpoint.php
index 2461c85871717e3b12f22fb022a561131b2a611b..ba2f7d1bb6953b8f9a155bf514354313f32ed500 100644
--- a/src/SearchEndpoint/SortEndpoint.php
+++ b/src/SearchEndpoint/SortEndpoint.php
@@ -21,12 +21,12 @@ class SortEndpoint extends AbstractSearchEndpoint
     /**
      * Endpoint name
      */
-    const NAME = 'sort';
+    final public const NAME = 'sort';
 
     /**
      * {@inheritdoc}
      */
-    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = [])
+    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null
     {
         $output = [];
 
diff --git a/src/SearchEndpoint/SuggestEndpoint.php b/src/SearchEndpoint/SuggestEndpoint.php
index 2e2e16ac8adb34ec2f80ef4aea4faed5c59956dd..56a684b0d3dc625c3c1e88e28c0fa306278539c7 100644
--- a/src/SearchEndpoint/SuggestEndpoint.php
+++ b/src/SearchEndpoint/SuggestEndpoint.php
@@ -22,19 +22,17 @@ class SuggestEndpoint extends AbstractSearchEndpoint
     /**
      * Endpoint name
      */
-    const NAME = 'suggest';
+    final public const NAME = 'suggest';
 
     /**
      * {@inheritdoc}
      */
-    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = [])
+    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null
     {
         $output = [];
-        if (count($this->getAll()) > 0) {
-            /** @var TermSuggest $suggest */
-            foreach ($this->getAll() as $suggest) {
-                $output = array_merge($output, $suggest->toArray());
-            }
+        /** @var TermSuggest $suggest */
+        foreach ($this->getAll() as $suggest) {
+            $output = array_merge($output, $suggest->toArray());
         }
 
         return $output;
diff --git a/src/Serializer/Normalizer/CustomReferencedNormalizer.php b/src/Serializer/Normalizer/CustomReferencedNormalizer.php
index 6cd24a8e90641369e8469af214f5f1ba3cef8edc..bd5501b18e859d8320cbe5c2bcedb8bac781100a 100644
--- a/src/Serializer/Normalizer/CustomReferencedNormalizer.php
+++ b/src/Serializer/Normalizer/CustomReferencedNormalizer.php
@@ -18,15 +18,12 @@ use Symfony\Component\Serializer\Normalizer\CustomNormalizer;
  */
 class CustomReferencedNormalizer extends CustomNormalizer
 {
-    /**
-     * @var array
-     */
-    private $references = [];
+    private array $references = [];
 
     /**
      * {@inheritdoc}
      */
-    public function normalize($object, $format = null, array $context = [])
+    public function normalize(mixed $object, string $format = null, array $context = []): array|bool|string|int|float|null|\ArrayObject
     {
         $object->setReferences($this->references);
         $data = parent::normalize($object, $format, $context);
@@ -38,7 +35,7 @@ class CustomReferencedNormalizer extends CustomNormalizer
     /**
      * {@inheritdoc}
      */
-    public function supportsNormalization($data, $format = null)
+    public function supportsNormalization($data, $format = null): bool
     {
         return $data instanceof AbstractNormalizable;
     }
diff --git a/src/Serializer/OrderedSerializer.php b/src/Serializer/OrderedSerializer.php
index bcbb9c3d0b89fd2a64a5099053c4af19a802620c..90e332974f0761f86059b04af1785e8927ff468f 100644
--- a/src/Serializer/OrderedSerializer.php
+++ b/src/Serializer/OrderedSerializer.php
@@ -22,7 +22,7 @@ class OrderedSerializer extends Serializer
     /**
      * {@inheritdoc}
      */
-    public function normalize($data, $format = null, array $context = [])
+    public function normalize($data, string $format = null, array $context = []): array|bool|string|int|float|null|\ArrayObject
     {
         return parent::normalize(
             is_array($data) ? $this->order($data) : $data,
@@ -34,7 +34,7 @@ class OrderedSerializer extends Serializer
     /**
      * {@inheritdoc}
      */
-    public function denormalize($data, $type, $format = null, array $context = [])
+    public function denormalize($data, string $type, string $format = null, array $context = []): mixed
     {
         return parent::denormalize(
             is_array($data) ? $this->order($data) : $data,
@@ -46,21 +46,15 @@ class OrderedSerializer extends Serializer
 
     /**
      * Orders objects if can be done.
-     *
-     * @param array $data Data to order.
-     *
-     * @return array
      */
-    private function order(array $data)
+    private function order(array $data): array
     {
         $filteredData = $this->filterOrderable($data);
 
         if (!empty($filteredData)) {
             uasort(
                 $filteredData,
-                function (OrderedNormalizerInterface $a, OrderedNormalizerInterface $b) {
-                    return $a->getOrder() > $b->getOrder();
-                }
+                static fn(OrderedNormalizerInterface $a, OrderedNormalizerInterface $b): bool => $a->getOrder() > $b->getOrder()
             );
 
             return array_merge($filteredData, array_diff_key($data, $filteredData));
@@ -73,16 +67,12 @@ class OrderedSerializer extends Serializer
      * Filters out data which can be ordered.
      *
      * @param array $array Data to filter out.
-     *
-     * @return array
      */
-    private function filterOrderable($array)
+    private function filterOrderable(array $array): array
     {
         return array_filter(
             $array,
-            function ($value) {
-                return $value instanceof OrderedNormalizerInterface;
-            }
+            static fn($value): bool => $value instanceof OrderedNormalizerInterface
         );
     }
 }
diff --git a/src/Sort/FieldSort.php b/src/Sort/FieldSort.php
index 36cb8908d1be6c57033bf648e8309d107fd1b511..fe7c1d5f31b18a70cd3840a65cbfffed18d075c8 100644
--- a/src/Sort/FieldSort.php
+++ b/src/Sort/FieldSort.php
@@ -21,90 +21,51 @@ class FieldSort implements BuilderInterface
 {
     use ParametersTrait;
 
-    const ASC = 'asc';
-    const DESC = 'desc';
+    final public const ASC = 'asc';
+    final public const DESC = 'desc';
 
-    /**
-     * @var string
-     */
-    private $field;
-
-    /**
-     * @var string
-     */
-    private $order;
-
-    /**
-     * @var BuilderInterface
-     */
-    private $nestedFilter;
+    private ?BuilderInterface $nestedFilter = null;
 
     /**
      * @param string $field  Field name.
      * @param string $order  Order direction.
      * @param array  $params Params that can be set to field sort.
      */
-    public function __construct($field, $order = null, $params = [])
+    public function __construct(private string $field, private ?string $order = null, array $params = [])
     {
-        $this->field = $field;
-        $this->order = $order;
         $this->setParameters($params);
     }
 
-    /**
-     * @return string
-     */
-    public function getField()
+    public function getField(): string
     {
         return $this->field;
     }
 
-    /**
-     * @param string $field
-     *
-     * @return $this
-     */
-    public function setField($field)
+    public function setField(string $field): static
     {
         $this->field = $field;
 
         return $this;
     }
 
-    /**
-     * @return string
-     */
-    public function getOrder()
+    public function getOrder(): string
     {
         return $this->order;
     }
 
-    /**
-     * @param string $order
-     *
-     * @return $this
-     */
-    public function setOrder($order)
+    public function setOrder(string $order): static
     {
         $this->order = $order;
 
         return $this;
     }
 
-    /**
-     * @return BuilderInterface
-     */
-    public function getNestedFilter()
+    public function getNestedFilter(): ?BuilderInterface
     {
         return $this->nestedFilter;
     }
 
-    /**
-     * @param BuilderInterface $nestedFilter
-     *
-     * @return $this
-     */
-    public function setNestedFilter(BuilderInterface $nestedFilter)
+    public function setNestedFilter(BuilderInterface $nestedFilter): static
     {
         $this->nestedFilter = $nestedFilter;
 
@@ -113,10 +74,8 @@ class FieldSort implements BuilderInterface
 
     /**
      * Returns element type.
-     *
-     * @return string
      */
-    public function getType()
+    public function getType(): string
     {
         return 'sort';
     }
@@ -124,20 +83,18 @@ class FieldSort implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         if ($this->order) {
             $this->addParameter('order', $this->order);
         }
 
-        if ($this->nestedFilter) {
+        if ($this->nestedFilter instanceof BuilderInterface) {
             $this->addParameter('nested', $this->nestedFilter->toArray());
         }
 
-        $output = [
-            $this->field => !$this->getParameters() ? new \stdClass() : $this->getParameters(),
+        return [
+            $this->field => $this->getParameters() ?: [],
         ];
-
-        return $output;
     }
 }
diff --git a/src/Sort/NestedSort.php b/src/Sort/NestedSort.php
index 8954719fc2cebe8405c9008f03c3c2a59cc8b2ed..355ece621699aeb62b733373c768dcf66467bbbb 100644
--- a/src/Sort/NestedSort.php
+++ b/src/Sort/NestedSort.php
@@ -23,40 +23,24 @@ class NestedSort implements BuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $path;
-
-    /**
-     * @var BuilderInterface
-     */
-    private $filter;
-
-    /**
-     * @var BuilderInterface
-     */
-    private $nestedFilter;
+    private ?BuilderInterface $nestedFilter = null;
 
     /**
      * @param string $path
-     * @param BuilderInterface $filter
-     * @param array $parameters
+     * @param BuilderInterface|null $filter
      */
     public function __construct(
-        $path,
-        BuilderInterface $filter = null,
+        private $path,
+        private readonly ?BuilderInterface $filter = null,
         array $parameters = []
     ) {
-        $this->path = $path;
-        $this->filter = $filter;
         $this->setParameters($parameters);
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getType()
+    public function getType(): string
     {
         return 'nested';
     }
@@ -64,17 +48,17 @@ class NestedSort implements BuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
         $output = [
             'path'   => $this->path,
         ];
 
-        if ($this->filter) {
+        if ($this->filter instanceof BuilderInterface) {
             $output['filter'] = $this->filter->toArray();
         }
 
-        if ($this->nestedFilter) {
+        if ($this->nestedFilter instanceof BuilderInterface) {
             $output[$this->getType()] = $this->nestedFilter->toArray();
         }
 
@@ -83,10 +67,8 @@ class NestedSort implements BuilderInterface
 
     /**
      * Returns nested filter object.
-     *
-     * @return BuilderInterface
      */
-    public function getFilter()
+    public function getFilter(): ?BuilderInterface
     {
         return $this->filter;
     }
@@ -101,17 +83,12 @@ class NestedSort implements BuilderInterface
         return $this->path;
     }
 
-    /**
-     * @return BuilderInterface
-     */
-    public function getNestedFilter()
+    public function getNestedFilter(): ?BuilderInterface
     {
         return $this->nestedFilter;
     }
 
     /**
-     * @param BuilderInterface $nestedFilter
-     *
      * @return $this
      */
     public function setNestedFilter(BuilderInterface $nestedFilter)
diff --git a/src/Suggest/Suggest.php b/src/Suggest/Suggest.php
index 1738d84da83ff8c52e7bf2cbd3947bc1d9efe7f2..95fa710e726f9dc99b76787dea44f2bceb919858 100644
--- a/src/Suggest/Suggest.php
+++ b/src/Suggest/Suggest.php
@@ -13,41 +13,20 @@ namespace ONGR\ElasticsearchDSL\Suggest;
 
 use ONGR\ElasticsearchDSL\NamedBuilderInterface;
 use ONGR\ElasticsearchDSL\ParametersTrait;
-use Symfony\Component\Serializer\Exception\InvalidArgumentException;
 
 class Suggest implements NamedBuilderInterface
 {
     use ParametersTrait;
 
-    /**
-     * @var string
-     */
-    private $name;
-
-    /**
-     * @var string
-     */
-    private $type;
-
-    /**
-     * @var string
-     */
-    private $text;
-
-    /**
-     * @var string
-     */
-    private $field;
+    private string $name;
+    private string $type;
+    private string $text;
+    private string $field;
 
     /**
      * TermSuggest constructor.
-     * @param string $name
-     * @param string $type
-     * @param string $text
-     * @param string $field
-     * @param array $parameters
      */
-    public function __construct($name, $type, $text, $field, $parameters = [])
+    public function __construct(string $name, string $type, string $text, string $field, array $parameters = [])
     {
         $this->setName($name);
         $this->setType($type);
@@ -56,84 +35,48 @@ class Suggest implements NamedBuilderInterface
         $this->setParameters($parameters);
     }
 
-    /**
-     * @param string $name
-     *
-     * @return $this
-     */
-    public function setName($name)
+    public function setName(string $name): static
     {
         $this->name = $name;
 
         return $this;
     }
 
-    /**
-     * Returns suggest name
-     *
-     * @return string
-     */
-    public function getName()
+    public function getName(): string
     {
         return $this->name;
     }
 
-    /**
-     * Returns element type.
-     *
-     * @return string
-     */
-    public function getType()
+    public function getType(): string
     {
         return $this->type;
     }
 
-    /**
-     * @param string $type
-     *
-     * @return $this
-     */
-    public function setType($type)
+    public function setType(string $type): static
     {
         $this->type = $type;
 
         return $this;
     }
 
-    /**
-     * @return string
-     */
-    public function getText()
+    public function getText(): string
     {
         return $this->text;
     }
 
-    /**
-     * @param string $text
-     *
-     * @return $this
-     */
-    public function setText($text)
+    public function setText(string $text): static
     {
         $this->text = $text;
 
         return $this;
     }
 
-    /**
-     * @return string
-     */
-    public function getField()
+    public function getField(): string
     {
         return $this->field;
     }
 
-    /**
-     * @param string $field
-     *
-     * @return $this
-     */
-    public function setField($field)
+    public function setField(string $field): static
     {
         $this->field = $field;
 
@@ -143,15 +86,13 @@ class Suggest implements NamedBuilderInterface
     /**
      * {@inheritdoc}
      */
-    public function toArray()
+    public function toArray(): array
     {
-        $output = [
+        return [
             $this->getName() => [
                 'text' => $this->getText(),
                 $this->getType() => $this->processArray(['field' => $this->getField()]),
             ]
         ];
-
-        return $output;
     }
 }
diff --git a/tests/Functional/AbstractElasticsearchTestCase.php b/tests/Functional/AbstractElasticsearchTestCase.php
index 3c0234107aee98989f6a5f3245fc08a3da206f47..3df94835d2af1518497317531ab2d2636de9d796 100644
--- a/tests/Functional/AbstractElasticsearchTestCase.php
+++ b/tests/Functional/AbstractElasticsearchTestCase.php
@@ -11,8 +11,8 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Functional;
 
-use Elasticsearch\Client;
-use Elasticsearch\ClientBuilder;
+use Elastic\Elasticsearch\Client;
+use Elastic\Elasticsearch\ClientBuilder;
 use ONGR\ElasticsearchDSL\Search;
 use PHPUnit\Framework\TestCase;
 
@@ -21,7 +21,7 @@ abstract class AbstractElasticsearchTestCase extends TestCase
     /**
      * Test index name in the elasticsearch.
      */
-    const INDEX_NAME = 'elasticsaerch-dsl-test';
+    final public const INDEX_NAME = 'elasticsaerch-dsl-test';
 
     /**
      * @var Client
@@ -31,7 +31,7 @@ abstract class AbstractElasticsearchTestCase extends TestCase
     /**
      * {@inheritdoc}
      */
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -109,7 +109,7 @@ abstract class AbstractElasticsearchTestCase extends TestCase
     /**
      * {@inheritdoc}
      */
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         $this->deleteIndex();
@@ -143,7 +143,7 @@ abstract class AbstractElasticsearchTestCase extends TestCase
             foreach ($response['hits']['hits'] as $document) {
                 $documents[$document['_id']] = $document['_source'];
             }
-        } catch (\Exception $e) {
+        } catch (\Exception) {
             return $documents;
         }
 
@@ -153,11 +153,11 @@ abstract class AbstractElasticsearchTestCase extends TestCase
     /**
      * Deletes index from elasticsearch.
      */
-    private function deleteIndex()
+    private function deleteIndex(): void
     {
         try {
             $this->client->indices()->delete(['index' => self::INDEX_NAME]);
-        } catch (\Exception $e) {
+        } catch (\Exception) {
             // Do nothing.
         }
     }
diff --git a/tests/Functional/Query/FunctionScoreQueryTest.php b/tests/Functional/Query/FunctionScoreQueryTest.php
index 63e8987236ee1aa32f12bb49edc66e9d04cf9b77..60e1055c4a53d1ad571ce065e1c2cd3459d95e45 100644
--- a/tests/Functional/Query/FunctionScoreQueryTest.php
+++ b/tests/Functional/Query/FunctionScoreQueryTest.php
@@ -21,7 +21,7 @@ class FunctionScoreQueryTest extends AbstractElasticsearchTestCase
     /**
      * {@inheritdoc}
      */
-    protected function getDataArray()
+    protected function getDataArray(): array
     {
         return [
             'product' => [
@@ -44,7 +44,7 @@ class FunctionScoreQueryTest extends AbstractElasticsearchTestCase
     /**
      * Match all test
      */
-    public function testRandomScore()
+    public function testRandomScore(): void
     {
         $fquery = new FunctionScoreQuery(new MatchAllQuery());
         $fquery->addRandomFunction();
@@ -52,12 +52,13 @@ class FunctionScoreQueryTest extends AbstractElasticsearchTestCase
 
         $search = new Search();
         $search->addQuery($fquery);
+
         $results = $this->executeSearch($search);
 
-        $this->assertEquals(count($this->getDataArray()['product']), count($results));
+        $this->assertEquals(is_countable($this->getDataArray()['product']) ? count($this->getDataArray()['product']) : 0, count($results));
     }
 
-    public function testScriptScore()
+    public function testScriptScore(): void
     {
         $fquery = new FunctionScoreQuery(new MatchAllQuery());
         $fquery->addScriptScoreFunction(
@@ -76,6 +77,7 @@ class FunctionScoreQueryTest extends AbstractElasticsearchTestCase
 
         $search = new Search();
         $search->addQuery($fquery);
+
         $results = $this->executeSearch($search);
 
         foreach ($results as $document) {
diff --git a/tests/Functional/Query/MatchAllQueryTest.php b/tests/Functional/Query/MatchAllQueryTest.php
index 49d3a48f8edb4fee02e0aa79952307aadebcc5af..38c0a3ad54ca9918384dcc4b6440a4a801221d9f 100644
--- a/tests/Functional/Query/MatchAllQueryTest.php
+++ b/tests/Functional/Query/MatchAllQueryTest.php
@@ -20,7 +20,7 @@ class MatchAllQueryTest extends AbstractElasticsearchTestCase
     /**
      * {@inheritdoc}
      */
-    protected function getDataArray()
+    protected function getDataArray(): array
     {
         return [
             'product' => [
@@ -37,13 +37,13 @@ class MatchAllQueryTest extends AbstractElasticsearchTestCase
     /**
      * Match all test
      */
-    public function testMatchAll()
+    public function testMatchAll(): void
     {
         $search = new Search();
         $matchAll = new MatchAllQuery();
 
         $search->addQuery($matchAll);
-        $q = $search->getQueries();
+        $search->getQueries();
         $results = $this->executeSearch($search);
 
         $this->assertEquals($this->getDataArray()['product'], $results);
diff --git a/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php b/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php
index f73cc6126c980ab5c79768f67d078d5abb4249c8..02774511ec5bb2b38decb9dc76ef52f605fc023c 100644
--- a/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php
@@ -11,13 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\MockObject\MockObject;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\AdjacencyMatrixAggregation;
 use ONGR\ElasticsearchDSL\BuilderInterface;
 
 /**
  * Unit test for adjacency matrix aggregation.
  */
-class AdjacencyMatrixAggregationTest extends \PHPUnit\Framework\TestCase
+class AdjacencyMatrixAggregationTest extends TestCase
 {
 //    /**
 //     * Test if exception is thrown when not anonymous filter is without name.
@@ -35,11 +37,12 @@ class AdjacencyMatrixAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test GetArray method.
      */
-    public function testFiltersAggregationGetArray()
+    public function testFiltersAggregationGetArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $mock = $this->createMock(BuilderInterface::class);
         $aggregation = new AdjacencyMatrixAggregation('test_agg');
         $aggregation->addFilter('name', $mock);
+
         $result = $aggregation->getArray();
         $this->assertArrayHasKey('filters', $result);
     }
@@ -47,7 +50,7 @@ class AdjacencyMatrixAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testFiltersAggregationGetType()
+    public function testFiltersAggregationGetType(): void
     {
         $aggregation = new AdjacencyMatrixAggregation('foo');
         $result = $aggregation->getType();
@@ -57,11 +60,11 @@ class AdjacencyMatrixAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test for filter aggregation toArray() method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new AdjacencyMatrixAggregation('test_agg');
-        $filter = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')
-            ->setMethods(['toArray', 'getType'])
+        $filter = $this->getMockBuilder(BuilderInterface::class)
+            ->onlyMethods(['toArray', 'getType'])
             ->getMockForAbstractClass();
         $filter->expects($this->any())
             ->method('toArray')
@@ -93,12 +96,12 @@ class AdjacencyMatrixAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if filters can be passed to the constructor.
      */
-    public function testFilterConstructor()
+    public function testFilterConstructor(): void
     {
-        /** @var BuilderInterface|\PHPUnit_Framework_MockObject_MockObject $builderInterface1 */
-        $builderInterface1 = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface');
-        /** @var BuilderInterface|\PHPUnit_Framework_MockObject_MockObject $builderInterface2 */
-        $builderInterface2 = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface');
+        /** @var BuilderInterface|MockObject $builderInterface1 */
+        $builderInterface1 = $this->getMockForAbstractClass(BuilderInterface::class);
+        /** @var BuilderInterface|MockObject $builderInterface2 */
+        $builderInterface2 = $this->getMockForAbstractClass(BuilderInterface::class);
 
         $aggregation = new AdjacencyMatrixAggregation(
             'test',
@@ -112,8 +115,8 @@ class AdjacencyMatrixAggregationTest extends \PHPUnit\Framework\TestCase
             [
                 'adjacency_matrix' => [
                     'filters' => [
-                        'filter1' => null,
-                        'filter2' => null,
+                        'filter1' => $builderInterface1->toArray(),
+                        'filter2' => $builderInterface2->toArray(),
                     ],
                 ],
             ],
diff --git a/tests/Unit/Aggregation/Bucketing/AudoDateHistogramAggregationTest.php b/tests/Unit/Aggregation/Bucketing/AudoDateHistogramAggregationTest.php
index bece77d306e2ba2d714f4be7dfbc64292db0171e..c52b6a5e41261fddb81b5f630ebb44911bbd0422 100644
--- a/tests/Unit/Aggregation/Bucketing/AudoDateHistogramAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/AudoDateHistogramAggregationTest.php
@@ -11,15 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\AutoDateHistogramAggregation;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\TermsAggregation;
 
-class AudoDateHistogramAggregationTest extends \PHPUnit\Framework\TestCase
+class AudoDateHistogramAggregationTest extends TestCase
 {
     /**
      * Tests agg.
      */
-    public function testAutoDateHistogramAggregationSetField()
+    public function testAutoDateHistogramAggregationSetField(): void
     {
         // Case #0 terms aggregation.
         $aggregation = new AutoDateHistogramAggregation('test_agg', 'test_field');
@@ -34,7 +35,7 @@ class AudoDateHistogramAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests setSize method.
      */
-    public function testAutoDateHistogramAggregationFormat()
+    public function testAutoDateHistogramAggregationFormat(): void
     {
         $date = '2020-12-25';
         // Case #1
@@ -67,7 +68,7 @@ class AudoDateHistogramAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests buckets.
      */
-    public function testAutoDateHistogramAggregationBuckets()
+    public function testAutoDateHistogramAggregationBuckets(): void
     {
         // Case #1
         $aggregation = new AutoDateHistogramAggregation('test_agg', 'wrong_field');
@@ -101,7 +102,7 @@ class AudoDateHistogramAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testAutoDateHistogramAggregationGetType()
+    public function testAutoDateHistogramAggregationGetType(): void
     {
         $aggregation = new AutoDateHistogramAggregation('foo', 'bar');
         $result = $aggregation->getType();
diff --git a/tests/Unit/Aggregation/Bucketing/ChildrenAggregationTest.php b/tests/Unit/Aggregation/Bucketing/ChildrenAggregationTest.php
index f4cb6b3a4ab53c2e7c0a98128f25aed0972c28d5..7927c539a20abdf9d3e322a129cbcbbe0438b845 100644
--- a/tests/Unit/Aggregation/Bucketing/ChildrenAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/ChildrenAggregationTest.php
@@ -11,20 +11,21 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\ChildrenAggregation;
 
 /**
  * Unit test for children aggregation.
  */
-class ChildrenAggregationTest extends \PHPUnit\Framework\TestCase
+class ChildrenAggregationTest extends TestCase
 {
     /**
      * Tests if ChildrenAggregation#getArray throws exception when expected.
-     *
-     * @expectedException \LogicException
      */
-    public function testGetArrayException()
+    public function testGetArrayException(): void
     {
+        $this->expectException(\LogicException::class);
         $aggregation = new ChildrenAggregation('foo');
         $aggregation->getArray();
     }
@@ -32,7 +33,7 @@ class ChildrenAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testChildrenAggregationGetType()
+    public function testChildrenAggregationGetType(): void
     {
         $aggregation = new ChildrenAggregation('foo');
         $result = $aggregation->getType();
@@ -42,14 +43,15 @@ class ChildrenAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method.
      */
-    public function testChildrenAggregationGetArray()
+    public function testChildrenAggregationGetArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation')
+        $mock = $this->getMockBuilder(AbstractAggregation::class)
             ->disableOriginalConstructor()
             ->getMockForAbstractClass();
         $aggregation = new ChildrenAggregation('foo');
         $aggregation->addAggregation($mock);
         $aggregation->setChildren('question');
+
         $result = $aggregation->getArray();
         $expected = ['type' => 'question'];
         $this->assertEquals($expected, $result);
diff --git a/tests/Unit/Aggregation/Bucketing/CompositeAggregationTest.php b/tests/Unit/Aggregation/Bucketing/CompositeAggregationTest.php
index b45c223314c0a9764e90e31bbc75518517840cf3..eaf33757bdb3e7cef01578f5f8a8ce5dff6f32bd 100644
--- a/tests/Unit/Aggregation/Bucketing/CompositeAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/CompositeAggregationTest.php
@@ -11,15 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\CompositeAggregation;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\TermsAggregation;
 
-class CompositeAggregationTest extends \PHPUnit\Framework\TestCase
+class CompositeAggregationTest extends TestCase
 {
     /**
      * Test for composite aggregation toArray() method exception.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $compositeAgg = new CompositeAggregation('composite_test_agg');
         $termsAgg = new TermsAggregation('test_term_agg', 'test_field');
@@ -41,7 +42,7 @@ class CompositeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test for composite aggregation toArray() method with size and after part.
      */
-    public function testToArrayWithSizeAndAfter()
+    public function testToArrayWithSizeAndAfter(): void
     {
         $compositeAgg = new CompositeAggregation('composite_test_agg');
         $termsAgg = new TermsAggregation('test_term_agg', 'test_field');
@@ -67,7 +68,7 @@ class CompositeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test for composite aggregation getSize() method.
      */
-    public function testGetSize()
+    public function testGetSize(): void
     {
         $compositeAgg = new CompositeAggregation('composite_test_agg');
         $compositeAgg->setSize(5);
@@ -78,7 +79,7 @@ class CompositeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test for composite aggregation getAfter() method.
      */
-    public function testGetAfter()
+    public function testGetAfter(): void
     {
         $compositeAgg = new CompositeAggregation('composite_test_agg');
         $compositeAgg->setAfter(['test_term_agg' => 'test']);
@@ -89,18 +90,19 @@ class CompositeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testGetType()
+    public function testGetType(): void
     {
         $aggregation = new CompositeAggregation('foo');
         $result = $aggregation->getType();
         $this->assertEquals('composite', $result);
     }
 
-    public function testTermsSourceWithOrderParameter()
+    public function testTermsSourceWithOrderParameter(): void
     {
         $compositeAgg = new CompositeAggregation('composite_with_order');
         $termsAgg = new TermsAggregation('test_term_agg', 'test_field');
         $termsAgg->addParameter('order', 'asc');
+
         $compositeAgg->addSource($termsAgg);
 
         $expectedResult = [
@@ -117,11 +119,12 @@ class CompositeAggregationTest extends \PHPUnit\Framework\TestCase
     }
 
 
-    public function testTermsSourceWithDescOrderParameter()
+    public function testTermsSourceWithDescOrderParameter(): void
     {
         $compositeAgg = new CompositeAggregation('composite_with_order');
         $termsAgg = new TermsAggregation('test_term_agg', 'test_field');
         $termsAgg->addParameter('order', 'desc');
+
         $compositeAgg->addSource($termsAgg);
 
         $expectedResult = [
@@ -138,16 +141,18 @@ class CompositeAggregationTest extends \PHPUnit\Framework\TestCase
     }
 
 
-    public function testMultipleSourcesWithDifferentOrders()
+    public function testMultipleSourcesWithDifferentOrders(): void
     {
         $compositeAgg = new CompositeAggregation('composite_with_order');
 
         $termsAgg = new TermsAggregation('test_term_agg_1', 'test_field');
         $termsAgg->addParameter('order', 'desc');
+
         $compositeAgg->addSource($termsAgg);
 
         $termsAgg = new TermsAggregation('test_term_agg_2', 'test_field');
         $termsAgg->addParameter('order', 'asc');
+
         $compositeAgg->addSource($termsAgg);
 
         $expectedResult = [
diff --git a/tests/Unit/Aggregation/Bucketing/DateHistogramAggregationTest.php b/tests/Unit/Aggregation/Bucketing/DateHistogramAggregationTest.php
index 6f7544bbbde86e50b4ca582a4b7778d1f9572184..0d4b55b5984a8a09359805fbacdd09fd74cf1380 100644
--- a/tests/Unit/Aggregation/Bucketing/DateHistogramAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/DateHistogramAggregationTest.php
@@ -11,20 +11,21 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\DateHistogramAggregation;
 
 /**
  * Unit test for children aggregation.
  */
-class DateHistogramAggregationTest extends \PHPUnit\Framework\TestCase
+class DateHistogramAggregationTest extends TestCase
 {
     /**
      * Tests if ChildrenAggregation#getArray throws exception when expected.
-     *
-     * @expectedException \LogicException
      */
-    public function testGetArrayException()
+    public function testGetArrayException(): void
     {
+        $this->expectException(\LogicException::class);
         $aggregation = new DateHistogramAggregation('foo');
         $aggregation->getArray();
     }
@@ -32,7 +33,7 @@ class DateHistogramAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testDateHistogramAggregationGetType()
+    public function testDateHistogramAggregationGetType(): void
     {
         $aggregation = new DateHistogramAggregation('foo');
         $result = $aggregation->getType();
@@ -42,15 +43,16 @@ class DateHistogramAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method.
      */
-    public function testChildrenAggregationGetArray()
+    public function testChildrenAggregationGetArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation')
+        $mock = $this->getMockBuilder(AbstractAggregation::class)
             ->disableOriginalConstructor()
             ->getMockForAbstractClass();
         $aggregation = new DateHistogramAggregation('foo');
         $aggregation->addAggregation($mock);
         $aggregation->setField('date');
         $aggregation->setInterval('month');
+
         $result = $aggregation->getArray();
         $expected = ['field' => 'date', 'interval' => 'month'];
         $this->assertEquals($expected, $result);
diff --git a/tests/Unit/Aggregation/Bucketing/DateRangeAggregationTest.php b/tests/Unit/Aggregation/Bucketing/DateRangeAggregationTest.php
index 6a3c5dbe16d280981b138cfe58093d9fab1d46ab..497b3139a59c0a94ab3fb01a17b5242a721e5813 100644
--- a/tests/Unit/Aggregation/Bucketing/DateRangeAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/DateRangeAggregationTest.php
@@ -11,30 +11,31 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\MockObject\MockObject;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\DateRangeAggregation;
 
-class DateRangeAggregationTest extends \PHPUnit\Framework\TestCase
+class DateRangeAggregationTest extends TestCase
 {
     /**
      * Test if exception is thrown.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage Date range aggregation must have field, format set and range added.
      */
-    public function testIfExceptionIsThrownWhenNoParametersAreSet()
+    public function testIfExceptionIsThrownWhenNoParametersAreSet(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('Date range aggregation must have field, format set and range added.');
         $agg = new DateRangeAggregation('test_agg');
         $agg->getArray();
     }
 
     /**
      * Test if exception is thrown when both range parameters are null.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage Either from or to must be set. Both cannot be null.
      */
-    public function testIfExceptionIsThrownWhenBothRangesAreNull()
+    public function testIfExceptionIsThrownWhenBothRangesAreNull(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('Either from or to must be set. Both cannot be null.');
         $agg = new DateRangeAggregation('test_agg');
         $agg->addRange(null, null);
     }
@@ -42,12 +43,13 @@ class DateRangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test getArray method.
      */
-    public function testDateRangeAggregationGetArray()
+    public function testDateRangeAggregationGetArray(): void
     {
         $agg = new DateRangeAggregation('foo', 'baz');
         $agg->addRange(10, 20);
         $agg->setFormat('bar');
         $agg->setKeyed(true);
+
         $result = $agg->getArray();
         $expected = [
             'format' => 'bar',
@@ -61,7 +63,7 @@ class DateRangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testDateRangeAggregationGetType()
+    public function testDateRangeAggregationGetType(): void
     {
         $aggregation = new DateRangeAggregation('foo');
         $result = $aggregation->getType();
@@ -70,10 +72,8 @@ class DateRangeAggregationTest extends \PHPUnit\Framework\TestCase
 
     /**
      * Data provider for testDateRangeAggregationConstructor.
-     *
-     * @return array
      */
-    public function testDateRangeAggregationConstructorProvider()
+    public static function dateRangeAggregationConstructorProvider(): array
     {
         return [
             // Case #0. Minimum arguments.
@@ -110,15 +110,13 @@ class DateRangeAggregationTest extends \PHPUnit\Framework\TestCase
      *
      * @param string $field
      * @param string $format
-     * @param array  $ranges
-     *
-     * @dataProvider testDateRangeAggregationConstructorProvider
      */
-    public function testDateRangeAggregationConstructor($field = null, $format = null, array $ranges = null)
+    #[DataProvider('dateRangeAggregationConstructorProvider')]
+    public function testDateRangeAggregationConstructor($field = null, $format = null, array $ranges = null): void
     {
-        /** @var DateRangeAggregation|\PHPUnit_Framework_MockObject_MockObject $aggregation */
-        $aggregation = $this->getMockBuilder('ONGR\ElasticsearchDSL\Aggregation\Bucketing\DateRangeAggregation')
-            ->setMethods(['setField', 'setFormat', 'addRange'])
+        /** @var DateRangeAggregation|MockObject $aggregation */
+        $aggregation = $this->getMockBuilder(DateRangeAggregation::class)
+            ->onlyMethods(['setField', 'setFormat', 'addRange'])
             ->disableOriginalConstructor()
             ->getMock();
         $aggregation->expects($this->once())->method('setField')->with($field);
diff --git a/tests/Unit/Aggregation/Bucketing/FilterAggregationTest.php b/tests/Unit/Aggregation/Bucketing/FilterAggregationTest.php
index b453e014e3f36f88e732166ba7d7ef83f1d8512e..89c1a93cd5bfe79e80d29b3a7c87f618d70b8cd5 100644
--- a/tests/Unit/Aggregation/Bucketing/FilterAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/FilterAggregationTest.php
@@ -11,6 +11,9 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\Attributes\DoesNotPerformAssertions;
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\FilterAggregation;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\HistogramAggregation;
 use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery;
@@ -18,14 +21,12 @@ use ONGR\ElasticsearchDSL\Query\TermLevel\ExistsQuery;
 use ONGR\ElasticsearchDSL\Query\MatchAllQuery;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
 
-class FilterAggregationTest extends \PHPUnit\Framework\TestCase
+class FilterAggregationTest extends TestCase
 {
     /**
      * Data provider for testToArray.
-     *
-     * @return array
      */
-    public function getToArrayData()
+    public static function getToArrayData(): array
     {
         $out = [];
 
@@ -91,34 +92,31 @@ class FilterAggregationTest extends \PHPUnit\Framework\TestCase
      *
      * @param FilterAggregation $aggregation
      * @param array             $expectedResult
-     *
-     * @dataProvider getToArrayData
      */
-    public function testToArray($aggregation, $expectedResult)
+    #[DataProvider('getToArrayData')]
+    public function testToArray($aggregation, mixed $expectedResult): void
     {
         $this->assertEquals($expectedResult, $aggregation->toArray());
     }
 
     /**
      * Test for setField().
-     *
-     * @expectedException        \LogicException
-     * @expectedExceptionMessage doesn't support `field` parameter
      */
-    public function testSetField()
+    public function testSetField(): never
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage("doesn't support `field` parameter");
         $aggregation = new FilterAggregation('test_agg');
         $aggregation->setField('test_field');
     }
 
     /**
      * Test for toArray() without setting a filter.
-     *
-     * @expectedException        \LogicException
-     * @expectedExceptionMessage has no filter added
      */
-    public function testToArrayNoFilter()
+    public function testToArrayNoFilter(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('has no filter added');
         $aggregation = new FilterAggregation('test_agg');
         $aggregation->toArray();
     }
@@ -126,7 +124,8 @@ class FilterAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test for toArray() with setting a filter.
      */
-    public function testToArrayWithFilter()
+    #[DoesNotPerformAssertions]
+    public function testToArrayWithFilter(): void
     {
         $aggregation = new FilterAggregation('test_agg');
 
@@ -137,7 +136,7 @@ class FilterAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if filter can be passed to constructor.
      */
-    public function testConstructorFilter()
+    public function testConstructorFilter(): void
     {
         $matchAllFilter = new MatchAllQuery();
         $aggregation = new FilterAggregation('test', $matchAllFilter);
diff --git a/tests/Unit/Aggregation/Bucketing/FiltersAggregationTest.php b/tests/Unit/Aggregation/Bucketing/FiltersAggregationTest.php
index b3032a31669cdec169a2726bcbc63f80ea9fb634..de7e809388ad320a658a70b27734ce4340963ab5 100644
--- a/tests/Unit/Aggregation/Bucketing/FiltersAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/FiltersAggregationTest.php
@@ -11,23 +11,24 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\MockObject\MockObject;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\FiltersAggregation;
 use ONGR\ElasticsearchDSL\BuilderInterface;
 
 /**
  * Unit test for filters aggregation.
  */
-class FiltersAggregationTest extends \PHPUnit\Framework\TestCase
+class FiltersAggregationTest extends TestCase
 {
     /**
      * Test if exception is thrown when not anonymous filter is without name.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage In not anonymous filters filter name must be set.
      */
-    public function testIfExceptionIsThrown()
+    public function testIfExceptionIsThrown(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('In not anonymous filters filter name must be set.');
+        $mock = $this->createMock(BuilderInterface::class);
         $aggregation = new FiltersAggregation('test_agg');
         $aggregation->addFilter($mock);
     }
@@ -35,12 +36,13 @@ class FiltersAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test GetArray method.
      */
-    public function testFiltersAggregationGetArray()
+    public function testFiltersAggregationGetArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $mock = $this->createMock(BuilderInterface::class);
         $aggregation = new FiltersAggregation('test_agg');
         $aggregation->setAnonymous(true);
         $aggregation->addFilter($mock, 'name');
+
         $result = $aggregation->getArray();
         $this->assertArrayHasKey('filters', $result);
     }
@@ -48,7 +50,7 @@ class FiltersAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testFiltersAggregationGetType()
+    public function testFiltersAggregationGetType(): void
     {
         $aggregation = new FiltersAggregation('foo');
         $result = $aggregation->getType();
@@ -58,11 +60,11 @@ class FiltersAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test for filter aggregation toArray() method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new FiltersAggregation('test_agg');
-        $filter = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')
-            ->setMethods(['toArray', 'getType'])
+        $filter = $this->getMockBuilder(BuilderInterface::class)
+            ->onlyMethods(['toArray', 'getType'])
             ->getMockForAbstractClass();
         $filter->expects($this->any())
             ->method('toArray')
@@ -70,6 +72,7 @@ class FiltersAggregationTest extends \PHPUnit\Framework\TestCase
 
         $aggregation->addFilter($filter, 'first');
         $aggregation->addFilter($filter, 'second');
+
         $results = $aggregation->toArray();
         $expected = [
             'filters' => [
@@ -93,12 +96,12 @@ class FiltersAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if filters can be passed to constructor.
      */
-    public function testConstructorFilter()
+    public function testConstructorFilter(): void
     {
-        /** @var BuilderInterface|\PHPUnit_Framework_MockObject_MockObject $builderInterface1 */
-        $builderInterface1 = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface');
-        /** @var BuilderInterface|\PHPUnit_Framework_MockObject_MockObject $builderInterface2 */
-        $builderInterface2 = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface');
+        /** @var BuilderInterface|MockObject $builderInterface1 */
+        $builderInterface1 = $this->getMockForAbstractClass(BuilderInterface::class);
+        /** @var BuilderInterface|MockObject $builderInterface2 */
+        $builderInterface2 = $this->getMockForAbstractClass(BuilderInterface::class);
 
         $aggregation = new FiltersAggregation(
             'test',
@@ -112,8 +115,8 @@ class FiltersAggregationTest extends \PHPUnit\Framework\TestCase
             [
                 'filters' => [
                     'filters' => [
-                        'filter1' => null,
-                        'filter2' => null,
+                        'filter1' => $builderInterface1->toArray(),
+                        'filter2' => $builderInterface2->toArray(),
                     ],
                 ],
             ],
@@ -133,8 +136,8 @@ class FiltersAggregationTest extends \PHPUnit\Framework\TestCase
             [
                 'filters' => [
                     'filters' => [
-                        null,
-                        null,
+                        [],
+                        [],
                     ],
                 ],
             ],
diff --git a/tests/Unit/Aggregation/Bucketing/GeoDistanceAggregationTest.php b/tests/Unit/Aggregation/Bucketing/GeoDistanceAggregationTest.php
index 89f2f5d5841111975b90eb1fb85dc864b13feaa6..b5935d6609ae4a0bba2023b4a7175f6050b9908f 100644
--- a/tests/Unit/Aggregation/Bucketing/GeoDistanceAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/GeoDistanceAggregationTest.php
@@ -11,18 +11,19 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\GeoDistanceAggregation;
 
-class GeoDistanceAggregationTest extends \PHPUnit\Framework\TestCase
+class GeoDistanceAggregationTest extends TestCase
 {
     /**
      * Test if exception is thrown when field is not set.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage Geo distance aggregation must have a field set.
      */
-    public function testGeoDistanceAggregationExceptionWhenFieldIsNotSet()
+    public function testGeoDistanceAggregationExceptionWhenFieldIsNotSet(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('Geo distance aggregation must have a field set.');
         $agg = new GeoDistanceAggregation('test_agg');
         $agg->setOrigin('50, 70');
         $agg->getArray();
@@ -30,12 +31,11 @@ class GeoDistanceAggregationTest extends \PHPUnit\Framework\TestCase
 
     /**
      * Test if exception is thrown when origin is not set.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage Geo distance aggregation must have an origin set.
      */
-    public function testGeoDistanceAggregationExceptionWhenOriginIsNotSet()
+    public function testGeoDistanceAggregationExceptionWhenOriginIsNotSet(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('Geo distance aggregation must have an origin set.');
         $agg = new GeoDistanceAggregation('test_agg');
         $agg->setField('location');
         $agg->getArray();
@@ -43,22 +43,19 @@ class GeoDistanceAggregationTest extends \PHPUnit\Framework\TestCase
 
     /**
      * Test if exception is thrown when field is not set.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage Either from or to must be set. Both cannot be null.
      */
-    public function testGeoDistanceAggregationAddRangeException()
+    public function testGeoDistanceAggregationAddRangeException(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('Either from or to must be set. Both cannot be null.');
         $agg = new GeoDistanceAggregation('test_agg');
         $agg->addRange();
     }
 
     /**
      * Data provider for testGeoDistanceAggregationGetArray().
-     *
-     * @return array
      */
-    public function testGeoDistanceAggregationGetArrayDataProvider()
+    public static function geoDistanceAggregationGetArrayDataProvider(): array
     {
         $out = [];
         $filterData = [
@@ -85,12 +82,10 @@ class GeoDistanceAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method.
      *
-     * @param array $filterData
      * @param array $expected
-     *
-     * @dataProvider testGeoDistanceAggregationGetArrayDataProvider
      */
-    public function testGeoDistanceAggregationGetArray($filterData, $expected)
+    #[DataProvider('geoDistanceAggregationGetArrayDataProvider')]
+    public function testGeoDistanceAggregationGetArray(array $filterData, mixed $expected): void
     {
         $aggregation = new GeoDistanceAggregation('foo');
         $aggregation->setOrigin($filterData['origin']);
@@ -106,7 +101,7 @@ class GeoDistanceAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testGeoDistanceAggregationGetType()
+    public function testGeoDistanceAggregationGetType(): void
     {
         $aggregation = new GeoDistanceAggregation('foo');
         $result = $aggregation->getType();
@@ -116,7 +111,7 @@ class GeoDistanceAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if parameters can be passed to constructor.
      */
-    public function testConstructorFilter()
+    public function testConstructorFilter(): void
     {
         $aggregation = new GeoDistanceAggregation(
             'test',
diff --git a/tests/Unit/Aggregation/Bucketing/GeoHashGridAggregationTest.php b/tests/Unit/Aggregation/Bucketing/GeoHashGridAggregationTest.php
index 1ef28d345e53558cef7ac093710275a776ddf24a..983560264183b9ec7e0dae78e5dd9e296568eb6a 100644
--- a/tests/Unit/Aggregation/Bucketing/GeoHashGridAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/GeoHashGridAggregationTest.php
@@ -11,30 +11,29 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\GeoHashGridAggregation;
 
 /**
  * Unit test for geohash grid aggregation.
  */
-class GeoHashGridAggregationTest extends \PHPUnit\Framework\TestCase
+class GeoHashGridAggregationTest extends TestCase
 {
     /**
      * Test if exception is thrown.
-     *
-     * @expectedException \LogicException
      */
-    public function testGeoHashGridAggregationException()
+    public function testGeoHashGridAggregationException(): void
     {
+        $this->expectException(\LogicException::class);
         $agg = new GeoHashGridAggregation('test_agg');
         $agg->getArray();
     }
 
     /**
      * Data provider for testGeoHashGridAggregationGetArray().
-     *
-     * @return array
      */
-    public function getArrayDataProvider()
+    public static function getArrayDataProvider(): array
     {
         $out = [];
 
@@ -60,12 +59,10 @@ class GeoHashGridAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method.
      *
-     * @param array $filterData
      * @param array $expected
-     *
-     * @dataProvider getArrayDataProvider
      */
-    public function testGeoHashGridAggregationGetArray($filterData, $expected)
+    #[DataProvider('getArrayDataProvider')]
+    public function testGeoHashGridAggregationGetArray(array $filterData, mixed $expected): void
     {
         $aggregation = new GeoHashGridAggregation('foo');
         $aggregation->setPrecision($filterData['precision']);
@@ -80,7 +77,7 @@ class GeoHashGridAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testGeoHashGridAggregationGetType()
+    public function testGeoHashGridAggregationGetType(): void
     {
         $aggregation = new GeoHashGridAggregation('foo');
         $result = $aggregation->getType();
diff --git a/tests/Unit/Aggregation/Bucketing/GlobalAggregationTest.php b/tests/Unit/Aggregation/Bucketing/GlobalAggregationTest.php
index 725ed283991ba3e6fb6628cc995dc8a684d297b0..107c2ea5c3b57871ca3431faca5bf8004893c4e1 100644
--- a/tests/Unit/Aggregation/Bucketing/GlobalAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/GlobalAggregationTest.php
@@ -11,16 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\GlobalAggregation;
 
-class GlobalAggregationTest extends \PHPUnit\Framework\TestCase
+class GlobalAggregationTest extends TestCase
 {
     /**
      * Data provider for testToArray().
-     *
-     * @return array
      */
-    public function getToArrayData()
+    public static function getToArrayData(): array
     {
         $out = [];
 
@@ -28,7 +28,7 @@ class GlobalAggregationTest extends \PHPUnit\Framework\TestCase
         $aggregation = new GlobalAggregation('test_agg');
 
         $result = [
-            'global' => new \stdClass(),
+            'global' => [],
         ];
 
         $out[] = [
@@ -42,7 +42,7 @@ class GlobalAggregationTest extends \PHPUnit\Framework\TestCase
         $aggregation->addAggregation($aggregation2);
 
         $result = [
-            'global' => new \stdClass(),
+            'global' => [],
             'aggregations' => [
                 $aggregation2->getName() => $aggregation2->toArray(),
             ],
@@ -61,24 +61,22 @@ class GlobalAggregationTest extends \PHPUnit\Framework\TestCase
      *
      * @param GlobalAggregation $aggregation
      * @param array             $expectedResult
-     *
-     * @dataProvider getToArrayData
      */
-    public function testToArray($aggregation, $expectedResult)
+    #[DataProvider('getToArrayData')]
+    public function testToArray($aggregation, $expectedResult): void
     {
         $this->assertEquals(
-            json_encode($expectedResult),
-            json_encode($aggregation->toArray())
+            json_encode($expectedResult, JSON_THROW_ON_ERROR),
+            json_encode($aggregation->toArray(), JSON_THROW_ON_ERROR)
         );
     }
 
     /**
      * Test for setField method on global aggregation.
-     *
-     * @expectedException \LogicException
      */
-    public function testSetField()
+    public function testSetField(): never
     {
+        $this->expectException(\LogicException::class);
         $aggregation = new GlobalAggregation('test_agg');
         $aggregation->setField('test_field');
     }
diff --git a/tests/Unit/Aggregation/Bucketing/Ipv4RangeAggregationTest.php b/tests/Unit/Aggregation/Bucketing/Ipv4RangeAggregationTest.php
index 7566efe8d20955e01cd3c2d92085cd384a750dc1..c4bb7fec7b9edb9393e61e76ab71f499abc2b4a7 100644
--- a/tests/Unit/Aggregation/Bucketing/Ipv4RangeAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/Ipv4RangeAggregationTest.php
@@ -11,17 +11,17 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\Ipv4RangeAggregation;
 
-class Ipv4RangeAggregationTest extends \PHPUnit\Framework\TestCase
+class Ipv4RangeAggregationTest extends TestCase
 {
     /**
      * Test exception when field and range are not set.
-     *
-     * @expectedException \LogicException
      */
-    public function testIfExceptionIsThrownWhenFieldAndRangeAreNotSet()
+    public function testIfExceptionIsThrownWhenFieldAndRangeAreNotSet(): void
     {
+        $this->expectException(\LogicException::class);
         $agg = new Ipv4RangeAggregation('foo');
         $agg->toArray();
     }
@@ -29,7 +29,7 @@ class Ipv4RangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if field and range  can be passed to constructor.
      */
-    public function testConstructorFilter()
+    public function testConstructorFilter(): void
     {
         $aggregation = new Ipv4RangeAggregation('test', 'fieldName', [['from' => 'fromValue']]);
         $this->assertSame(
diff --git a/tests/Unit/Aggregation/Bucketing/MissingAggregationTest.php b/tests/Unit/Aggregation/Bucketing/MissingAggregationTest.php
index 613d97ba08cfe079abba4b23eaa17f61161ddea5..1b87daddc24986953b72e81bdfe4b8949519c8d9 100644
--- a/tests/Unit/Aggregation/Bucketing/MissingAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/MissingAggregationTest.php
@@ -11,18 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\MissingAggregation;
 
-class MissingAggregationTest extends \PHPUnit\Framework\TestCase
+class MissingAggregationTest extends TestCase
 {
     /**
      * Test if exception is thrown when field is not set.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage Missing aggregation must have a field set.
      */
-    public function testIfExceptionIsThrown()
+    public function testIfExceptionIsThrown(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('Missing aggregation must have a field set.');
         $agg = new MissingAggregation('test_agg');
         $agg->getArray();
     }
@@ -30,10 +30,11 @@ class MissingAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test getArray method.
      */
-    public function testMissingAggregationGetArray()
+    public function testMissingAggregationGetArray(): void
     {
         $aggregation = new MissingAggregation('foo');
         $aggregation->setField('bar');
+
         $result = $aggregation->getArray();
         $this->assertEquals('bar', $result['field']);
     }
@@ -41,7 +42,7 @@ class MissingAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test getType method.
      */
-    public function testMissingAggregationGetType()
+    public function testMissingAggregationGetType(): void
     {
         $aggregation = new MissingAggregation('bar');
         $result = $aggregation->getType();
diff --git a/tests/Unit/Aggregation/Bucketing/NestedAggregationTest.php b/tests/Unit/Aggregation/Bucketing/NestedAggregationTest.php
index b4458f12442cd0ddceb4617b46041f2d8c66cc21..53abc5ddc8ef86d4a7f2e004eddeefc6708aa04d 100644
--- a/tests/Unit/Aggregation/Bucketing/NestedAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/NestedAggregationTest.php
@@ -11,15 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\NestedAggregation;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\TermsAggregation;
 
-class NestedAggregationTest extends \PHPUnit\Framework\TestCase
+class NestedAggregationTest extends TestCase
 {
     /**
      * Test for nested aggregation toArray() method exception.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $termAggregation = new TermsAggregation('acme');
 
diff --git a/tests/Unit/Aggregation/Bucketing/RangeAggregationTest.php b/tests/Unit/Aggregation/Bucketing/RangeAggregationTest.php
index 55134a86bb418147858a8ef4cc34ca85b2671edf..778e67ec1f0944e3aa7fe3367e843219627bf2e4 100644
--- a/tests/Unit/Aggregation/Bucketing/RangeAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/RangeAggregationTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\RangeAggregation;
 
-class RangeAggregationTest extends \PHPUnit\Framework\TestCase
+class RangeAggregationTest extends TestCase
 {
     /**
      * Test addRange method.
      */
-    public function testRangeAggregationAddRange()
+    public function testRangeAggregationAddRange(): void
     {
         $aggregation = new RangeAggregation('test_agg');
         $aggregation->setField('test_field');
@@ -43,7 +44,7 @@ class RangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test addRange method with multiple values.
      */
-    public function testRangeAggregationAddRangeMultiple()
+    public function testRangeAggregationAddRangeMultiple(): void
     {
         $aggregation = new RangeAggregation('test_agg');
         $aggregation->setField('test_field');
@@ -74,7 +75,7 @@ class RangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test addRange method with nested values.
      */
-    public function testRangeAggregationAddRangeNested()
+    public function testRangeAggregationAddRangeNested(): void
     {
         $aggregation = new RangeAggregation('test_agg');
         $aggregation->setField('test_field');
@@ -117,7 +118,7 @@ class RangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testRangeAggregationGetType()
+    public function testRangeAggregationGetType(): void
     {
         $agg = new RangeAggregation('foo');
         $result = $agg->getType();
@@ -127,7 +128,7 @@ class RangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests removeRangeByKey method.
      */
-    public function testRangeAggregationRemoveRangeByKey()
+    public function testRangeAggregationRemoveRangeByKey(): void
     {
         $aggregation = new RangeAggregation('foo');
         $aggregation->setField('price');
@@ -167,7 +168,7 @@ class RangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests removeRange method.
      */
-    public function testRangeAggregationRemoveRange()
+    public function testRangeAggregationRemoveRange(): void
     {
         $aggregation = new RangeAggregation('foo');
         $aggregation->setField('price');
@@ -197,7 +198,7 @@ class RangeAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if parameter can be passed to constructor.
      */
-    public function testConstructor()
+    public function testConstructor(): void
     {
         $aggregation = new RangeAggregation('foo', 'fieldValue', [['from' => 'now', 'key' => 'nowkey']], true);
         $this->assertSame(
diff --git a/tests/Unit/Aggregation/Bucketing/ReverseNestedAggregationTest.php b/tests/Unit/Aggregation/Bucketing/ReverseNestedAggregationTest.php
index 11ed18f70b16efd491316cff46bfbd95e43245a8..62d711d2fd6e329587e6d0e096efa2b9623b85c0 100644
--- a/tests/Unit/Aggregation/Bucketing/ReverseNestedAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/ReverseNestedAggregationTest.php
@@ -11,15 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\ReverseNestedAggregation;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\TermsAggregation;
 
-class ReverseNestedAggregationTest extends \PHPUnit\Framework\TestCase
+class ReverseNestedAggregationTest extends TestCase
 {
     /**
      * Test for reverse_nested aggregation toArray() method exception.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $termAggregation = new TermsAggregation('acme');
 
@@ -40,7 +41,7 @@ class ReverseNestedAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test for reverse_nested aggregation toArray() without path.
      */
-    public function testToArrayNoPath()
+    public function testToArrayNoPath(): void
     {
         $termAggregation = new TermsAggregation('acme');
 
@@ -48,15 +49,15 @@ class ReverseNestedAggregationTest extends \PHPUnit\Framework\TestCase
         $aggregation->addAggregation($termAggregation);
 
         $expectedResult = [
-            'reverse_nested' => new \stdClass(),
+            'reverse_nested' => [],
             'aggregations' => [
                 $termAggregation->getName() => $termAggregation->toArray(),
             ],
         ];
 
         $this->assertEquals(
-            json_encode($expectedResult),
-            json_encode($aggregation->toArray())
+            json_encode($expectedResult, JSON_THROW_ON_ERROR),
+            json_encode($aggregation->toArray(), JSON_THROW_ON_ERROR)
         );
     }
 }
diff --git a/tests/Unit/Aggregation/Bucketing/SamplerAggregationTest.php b/tests/Unit/Aggregation/Bucketing/SamplerAggregationTest.php
index 0bbb209bf8053653b50297b7de5d1df6d491dbb3..b429e2f8136cd050725014934cb21d15ad9a9807 100644
--- a/tests/Unit/Aggregation/Bucketing/SamplerAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/SamplerAggregationTest.php
@@ -11,18 +11,19 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\SamplerAggregation;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\TermsAggregation;
 
 /**
  * Unit test for children aggregation.
  */
-class SamplerAggregationTest extends \PHPUnit\Framework\TestCase
+class SamplerAggregationTest extends TestCase
 {
     /**
      * Tests getType method.
      */
-    public function testGetType()
+    public function testGetType(): void
     {
         $aggregation = new SamplerAggregation('foo');
         $result = $aggregation->getType();
@@ -32,7 +33,7 @@ class SamplerAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $termAggregation = new TermsAggregation('acme');
 
@@ -40,6 +41,7 @@ class SamplerAggregationTest extends \PHPUnit\Framework\TestCase
         $aggregation->addAggregation($termAggregation);
         $aggregation->setField('name');
         $aggregation->setShardSize(200);
+
         $result = $aggregation->toArray();
         $expected = [
             'sampler' => [
@@ -56,7 +58,7 @@ class SamplerAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method without provided shard size.
      */
-    public function testGetArrayNoShardSize()
+    public function testGetArrayNoShardSize(): void
     {
         $aggregation = new SamplerAggregation('foo', 'bar');
         $this->assertEquals(['field' => 'bar'], $aggregation->getArray());
diff --git a/tests/Unit/Aggregation/Bucketing/SignificantTermsAggregationTest.php b/tests/Unit/Aggregation/Bucketing/SignificantTermsAggregationTest.php
index c6cf213375b30a33dfe24e2571e6e67867fb6d25..2b9bcd5b7e779827394e59c6e7dd4bb8b97e440b 100644
--- a/tests/Unit/Aggregation/Bucketing/SignificantTermsAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/SignificantTermsAggregationTest.php
@@ -11,17 +11,19 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\SignificantTermsAggregation;
 
 /**
  * Unit test for children aggregation.
  */
-class SignificantTermsAggregationTest extends \PHPUnit\Framework\TestCase
+class SignificantTermsAggregationTest extends TestCase
 {
     /**
      * Tests getType method.
      */
-    public function testSignificantTermsAggregationGetType()
+    public function testSignificantTermsAggregationGetType(): void
     {
         $aggregation = new SignificantTermsAggregation('foo');
         $result = $aggregation->getType();
@@ -31,13 +33,14 @@ class SignificantTermsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method.
      */
-    public function testSignificantTermsAggregationGetArray()
+    public function testSignificantTermsAggregationGetArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation')
+        $mock = $this->getMockBuilder(AbstractAggregation::class)
             ->disableOriginalConstructor()
             ->getMockForAbstractClass();
         $aggregation = new SignificantTermsAggregation('foo', 'title');
         $aggregation->addAggregation($mock);
+
         $result = $aggregation->getArray();
         $expected = ['field' => 'title'];
         $this->assertEquals($expected, $result);
diff --git a/tests/Unit/Aggregation/Bucketing/SignificantTextAggregationTest.php b/tests/Unit/Aggregation/Bucketing/SignificantTextAggregationTest.php
index 23b96f3f9513bce0ab82312d8bb4a63a8cf2b1e9..8fea54c494ede2ecefdab9fb1da7545233eaefdd 100644
--- a/tests/Unit/Aggregation/Bucketing/SignificantTextAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/SignificantTextAggregationTest.php
@@ -11,17 +11,19 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\SignificantTextAggregation;
 
 /**
  * Unit test for children aggregation.
  */
-class SignificantTextAggregationTest extends \PHPUnit\Framework\TestCase
+class SignificantTextAggregationTest extends TestCase
 {
     /**
      * Tests getType method.
      */
-    public function testSignificantTextAggregationGetType()
+    public function testSignificantTextAggregationGetType(): void
     {
         $aggregation = new SignificantTextAggregation('foo');
         $result = $aggregation->getType();
@@ -31,13 +33,14 @@ class SignificantTextAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method.
      */
-    public function testSignificantTermsAggregationGetArray()
+    public function testSignificantTermsAggregationGetArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation')
+        $mock = $this->getMockBuilder(AbstractAggregation::class)
             ->disableOriginalConstructor()
             ->getMockForAbstractClass();
         $aggregation = new SignificantTextAggregation('foo', 'title');
         $aggregation->addAggregation($mock);
+
         $result = $aggregation->getArray();
         $expected = ['field' => 'title'];
         $this->assertEquals($expected, $result);
diff --git a/tests/Unit/Aggregation/Bucketing/TermsAggregationTest.php b/tests/Unit/Aggregation/Bucketing/TermsAggregationTest.php
index 47924419963bb1aa9960596833488e9037ee1aa3..ecbb009ac35a49f923945f92754fdb93332fd646 100644
--- a/tests/Unit/Aggregation/Bucketing/TermsAggregationTest.php
+++ b/tests/Unit/Aggregation/Bucketing/TermsAggregationTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\TermsAggregation;
 
-class TermsAggregationTest extends \PHPUnit\Framework\TestCase
+class TermsAggregationTest extends TestCase
 {
     /**
      * Tests setField method.
      */
-    public function testTermsAggregationSetField()
+    public function testTermsAggregationSetField(): void
     {
         // Case #0 terms aggregation.
         $aggregation = new TermsAggregation('test_agg');
@@ -34,7 +35,7 @@ class TermsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests setSize method.
      */
-    public function testTermsAggregationSetSize()
+    public function testTermsAggregationSetSize(): void
     {
         // Case #1 terms aggregation with size.
         $aggregation = new TermsAggregation('test_agg');
@@ -69,7 +70,7 @@ class TermsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests minDocumentCount method.
      */
-    public function testTermsAggregationMinDocumentCount()
+    public function testTermsAggregationMinDocumentCount(): void
     {
         // Case #3 terms aggregation with size and min document count.
         $aggregation = new TermsAggregation('test_agg');
@@ -91,7 +92,7 @@ class TermsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests include, exclude method.
      */
-    public function testTermsAggregationSimpleIncludeExclude()
+    public function testTermsAggregationSimpleIncludeExclude(): void
     {
         // Case #4 terms aggregation with simple include, exclude.
         $aggregation = new TermsAggregation('test_agg');
@@ -113,7 +114,7 @@ class TermsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests include, exclude with flags method.
      */
-    public function testTermsAggregationIncludeExcludeFlags()
+    public function testTermsAggregationIncludeExcludeFlags(): void
     {
         // Case #5 terms aggregation with include, exclude and flags.
         $aggregation = new TermsAggregation('test_agg');
@@ -153,7 +154,7 @@ class TermsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests setOrder method.
      */
-    public function testTermsAggregationSetOrder()
+    public function testTermsAggregationSetOrder(): void
     {
         // Case #6 terms aggregation with order default direction.
         $aggregation = new TermsAggregation('test_agg');
@@ -173,7 +174,7 @@ class TermsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests setOrder DESC method.
      */
-    public function testTermsAggregationSetOrderDESC()
+    public function testTermsAggregationSetOrderDESC(): void
     {
         // Case #7 terms aggregation with order term mode, desc direction.
         $aggregation = new TermsAggregation('test_agg');
@@ -193,7 +194,7 @@ class TermsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testTermsAggregationGetType()
+    public function testTermsAggregationGetType(): void
     {
         $aggregation = new TermsAggregation('foo');
         $result = $aggregation->getType();
diff --git a/tests/Unit/Aggregation/Metric/CardinalityAggregationTest.php b/tests/Unit/Aggregation/Metric/CardinalityAggregationTest.php
index 8ec9f2cf172461bd91ce240076b43b94529cafc1..5f16d92784c630dad455dfafcbc3287f188432ea 100644
--- a/tests/Unit/Aggregation/Metric/CardinalityAggregationTest.php
+++ b/tests/Unit/Aggregation/Metric/CardinalityAggregationTest.php
@@ -11,21 +11,23 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Metric\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Metric\CardinalityAggregation;
 
 /**
  * Unit test for cardinality aggregation.
  */
-class CardinalityAggregationTest extends \PHPUnit\Framework\TestCase
+class CardinalityAggregationTest extends TestCase
 {
     /**
      * Tests getArray method.
      */
-    public function testGetArray()
+    public function testGetArray(): void
     {
         $aggregation = new CardinalityAggregation('bar');
 
         $aggregation->setScript('foo');
+
         $result = $aggregation->getArray();
 
         $this->assertArrayHasKey('script', $result, 'key=script when script is set');
@@ -52,12 +54,11 @@ class CardinalityAggregationTest extends \PHPUnit\Framework\TestCase
 
     /**
      * Tests if CardinalityAggregation#getArray throws exception when expected.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage Cardinality aggregation must have field or script set.
      */
-    public function testGetArrayException()
+    public function testGetArrayException(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('Cardinality aggregation must have field or script set.');
         $aggregation = new CardinalityAggregation('bar');
         $aggregation->getArray();
     }
@@ -65,7 +66,7 @@ class CardinalityAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testCardinallyAggregationGetType()
+    public function testCardinallyAggregationGetType(): void
     {
         $aggregation = new CardinalityAggregation('foo');
         $result = $aggregation->getType();
diff --git a/tests/Unit/Aggregation/Metric/GeoBoundsAggregationTest.php b/tests/Unit/Aggregation/Metric/GeoBoundsAggregationTest.php
index efccb9ba240a8f2af6d7790e92adc0500a096355..62bfd269d2147ac416689ce56631f9d37f9b6f55 100644
--- a/tests/Unit/Aggregation/Metric/GeoBoundsAggregationTest.php
+++ b/tests/Unit/Aggregation/Metric/GeoBoundsAggregationTest.php
@@ -11,20 +11,20 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Metric\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Metric\GeoBoundsAggregation;
 
 /**
  * Unit test for geo bounds aggregation.
  */
-class GeoBoundsAggregationTest extends \PHPUnit\Framework\TestCase
+class GeoBoundsAggregationTest extends TestCase
 {
     /**
      * Test if exception is thrown.
-     *
-     * @expectedException \LogicException
      */
-    public function testGeoBoundsAggregationException()
+    public function testGeoBoundsAggregationException(): void
     {
+        $this->expectException(\LogicException::class);
         $agg = new GeoBoundsAggregation('test_agg');
         $agg->getArray();
     }
@@ -32,7 +32,7 @@ class GeoBoundsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testGeoBoundsAggregationGetType()
+    public function testGeoBoundsAggregationGetType(): void
     {
         $agg = new GeoBoundsAggregation('foo');
         $result = $agg->getType();
@@ -42,11 +42,12 @@ class GeoBoundsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method.
      */
-    public function testGeoBoundsAggregationGetArray()
+    public function testGeoBoundsAggregationGetArray(): void
     {
         $agg = new GeoBoundsAggregation('foo');
         $agg->setField('bar');
         $agg->setWrapLongitude(true);
+
         $result = [
             'geo_bounds' => [
                 'field' => 'bar',
diff --git a/tests/Unit/Aggregation/Metric/GeoCentroidAggregationTest.php b/tests/Unit/Aggregation/Metric/GeoCentroidAggregationTest.php
index dca14573d4f80da6e675eb8c13837270a235fa40..640feaf74e7a8b9c0deef32459ff6ba56a991f7b 100644
--- a/tests/Unit/Aggregation/Metric/GeoCentroidAggregationTest.php
+++ b/tests/Unit/Aggregation/Metric/GeoCentroidAggregationTest.php
@@ -11,20 +11,20 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Metric\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Metric\GeoCentroidAggregation;
 
 /**
  * Unit test for children aggregation.
  */
-class GeoCentroidAggregationTest extends \PHPUnit\Framework\TestCase
+class GeoCentroidAggregationTest extends TestCase
 {
     /**
      * Test if exception is thrown when field is not provided
-     *
-     * @expectedException \LogicException
      */
-    public function testGetArrayException()
+    public function testGetArrayException(): void
     {
+        $this->expectException(\LogicException::class);
         $aggregation = new GeoCentroidAggregation('foo');
         $aggregation->getArray();
     }
@@ -32,7 +32,7 @@ class GeoCentroidAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testGeoCentroidAggregationGetType()
+    public function testGeoCentroidAggregationGetType(): void
     {
         $aggregation = new GeoCentroidAggregation('foo');
         $this->assertEquals('geo_centroid', $aggregation->getType());
@@ -41,7 +41,7 @@ class GeoCentroidAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getArray method.
      */
-    public function testGeoCentroidAggregationGetArray()
+    public function testGeoCentroidAggregationGetArray(): void
     {
         $aggregation = new GeoCentroidAggregation('foo', 'location');
         $this->assertEquals(['field' => 'location'], $aggregation->getArray());
diff --git a/tests/Unit/Aggregation/Metric/PercentileRanksAggregationTest.php b/tests/Unit/Aggregation/Metric/PercentileRanksAggregationTest.php
index 12aeffcc910ee4547371bdd83d1f78c81b170b2e..775f2dff9f72bdd3c087a50a8d8d8336ca30f9bc 100644
--- a/tests/Unit/Aggregation/Metric/PercentileRanksAggregationTest.php
+++ b/tests/Unit/Aggregation/Metric/PercentileRanksAggregationTest.php
@@ -11,12 +11,13 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Metric\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Metric\PercentileRanksAggregation;
 
 /**
  * Percentile ranks aggregation unit tests.
  */
-class PercentileRanksAggregationTest extends \PHPUnit\Framework\TestCase
+class PercentileRanksAggregationTest extends TestCase
 {
     /**
      * @var PercentileRanksAggregation
@@ -26,39 +27,36 @@ class PercentileRanksAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Phpunit setup.
      */
-    public function setUp()
+    protected function setUp(): void
     {
         $this->agg = new PercentileRanksAggregation('foo');
     }
 
     /**
      * Tests if exception is thrown when required parameters not set.
-     *
-     * @expectedException \LogicException
      */
-    public function testIfPercentileRanksAggregationThrowsAnException()
+    public function testIfPercentileRanksAggregationThrowsAnException(): void
     {
+        $this->expectException(\LogicException::class);
         $this->agg->toArray();
     }
 
     /**
      * Tests exception when only field is set.
-     *
-     * @expectedException \LogicException
      */
-    public function testIfExceptionIsThrownWhenFieldSetAndValueNotSet()
+    public function testIfExceptionIsThrownWhenFieldSetAndValueNotSet(): void
     {
+        $this->expectException(\LogicException::class);
         $this->agg->setField('bar');
         $this->agg->toArray();
     }
 
     /**
      * Tests exception when only value is set.
-     *
-     * @expectedException \LogicException
      */
-    public function testIfExceptionIsThrownWhenScriptSetAndValueNotSet()
+    public function testIfExceptionIsThrownWhenScriptSetAndValueNotSet(): void
     {
+        $this->expectException(\LogicException::class);
         $this->agg->setScript('bar');
         $this->agg->toArray();
     }
@@ -66,7 +64,7 @@ class PercentileRanksAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test getType method.
      */
-    public function testGetType()
+    public function testGetType(): void
     {
         $this->assertEquals('percentile_ranks', $this->agg->getType());
     }
@@ -74,7 +72,7 @@ class PercentileRanksAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $this->agg->setField('bar');
         $this->agg->setValues(['bar']);
diff --git a/tests/Unit/Aggregation/Metric/PercentilesAggregationTest.php b/tests/Unit/Aggregation/Metric/PercentilesAggregationTest.php
index aa98aa3ed623a99577e3f0a76f9d20fc96f1672b..5ed758e4efd497938f48a097a58cd74091dd3e09 100644
--- a/tests/Unit/Aggregation/Metric/PercentilesAggregationTest.php
+++ b/tests/Unit/Aggregation/Metric/PercentilesAggregationTest.php
@@ -11,18 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Metric\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Metric\PercentilesAggregation;
 
-class PercentilesAggregationTest extends \PHPUnit\Framework\TestCase
+class PercentilesAggregationTest extends TestCase
 {
     /**
      * Tests if PercentilesAggregation#getArray throws exception when expected.
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage Percentiles aggregation must have field or script set.
      */
-    public function testPercentilesAggregationGetArrayException()
+    public function testPercentilesAggregationGetArrayException(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('Percentiles aggregation must have field or script set.');
         $aggregation = new PercentilesAggregation('bar');
         $aggregation->getArray();
     }
@@ -30,7 +30,7 @@ class PercentilesAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test getType method.
      */
-    public function testGetType()
+    public function testGetType(): void
     {
         $aggregation = new PercentilesAggregation('bar');
         $this->assertEquals('percentiles', $aggregation->getType());
@@ -39,7 +39,7 @@ class PercentilesAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Test getArray method.
      */
-    public function testGetArray()
+    public function testGetArray(): void
     {
         $aggregation = new PercentilesAggregation('bar', 'fieldValue', ['percentsValue']);
         $this->assertSame(
diff --git a/tests/Unit/Aggregation/Metric/StatsAggregationTest.php b/tests/Unit/Aggregation/Metric/StatsAggregationTest.php
index e130641ea8288042191e5dca86b9b4c13b65ab12..4ae9e6614ca770dfd1acdc536e2f001b642ebe0d 100644
--- a/tests/Unit/Aggregation/Metric/StatsAggregationTest.php
+++ b/tests/Unit/Aggregation/Metric/StatsAggregationTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Metric\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Metric\StatsAggregation;
 
-class StatsAggregationTest extends \PHPUnit\Framework\TestCase
+class StatsAggregationTest extends TestCase
 {
     /**
      * Test for stats aggregation toArray() method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new StatsAggregation('test_agg');
         $aggregation->setField('test_field');
@@ -33,7 +34,7 @@ class StatsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if parameter can be passed to constructor.
      */
-    public function testConstructor()
+    public function testConstructor(): void
     {
         $aggregation = new StatsAggregation('foo', 'fieldValue', 'scriptValue');
         $this->assertSame(
diff --git a/tests/Unit/Aggregation/Metric/TopHitsAggregationTest.php b/tests/Unit/Aggregation/Metric/TopHitsAggregationTest.php
index f6018dc819d5f4f0f0dfa15b04ca678a4b875402..271fac54fea2071f0354905d6c1e7a31d265da49 100644
--- a/tests/Unit/Aggregation/Metric/TopHitsAggregationTest.php
+++ b/tests/Unit/Aggregation/Metric/TopHitsAggregationTest.php
@@ -11,18 +11,19 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Metric\Aggregation;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Metric\TopHitsAggregation;
 use ONGR\ElasticsearchDSL\Sort\FieldSort;
 
 /**
  * Unit tests for top hits aggregation.
  */
-class TopHitsAggregationTest extends \PHPUnit\Framework\TestCase
+class TopHitsAggregationTest extends TestCase
 {
     /**
      * Check if aggregation returns the expected array.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $sort = new FieldSort('acme', FieldSort::ASC);
         $aggregation = new TopHitsAggregation('acme', 1, 1, $sort);
@@ -43,7 +44,7 @@ class TopHitsAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Check if parameters can be set to agg.
      */
-    public function testParametersAddition()
+    public function testParametersAddition(): void
     {
         $aggregation = new TopHitsAggregation('acme', 0, 1);
         $aggregation->addParameter('_source', ['include' => ['title']]);
diff --git a/tests/Unit/Aggregation/Pipeline/AvgBucketAggregationTest.php b/tests/Unit/Aggregation/Pipeline/AvgBucketAggregationTest.php
index d4d26af10e1e1d21292dc63d5d6ef63bbe188af5..7d06cabfc876c13da03d3f62fb62fd1730342c0d 100644
--- a/tests/Unit/Aggregation/Pipeline/AvgBucketAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/AvgBucketAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\AvgBucketAggregation;
 
 /**
  * Unit test for avg_bucket aggregation.
  */
-class AvgBucketAggregationTest extends \PHPUnit\Framework\TestCase
+class AvgBucketAggregationTest extends TestCase
 {
     /**
      * Tests getArray method.
      */
-    public function testGetArray()
+    public function testGetArray(): void
     {
         $aggregation = new AvgBucketAggregation('foo', 'foo>bar');
 
@@ -31,7 +32,7 @@ class AvgBucketAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getType method.
      */
-    public function testAvgBucketAggregationGetType()
+    public function testAvgBucketAggregationGetType(): void
     {
         $aggregation = new AvgBucketAggregation('foo', 'foo>bar');
         $this->assertEquals('avg_bucket', $aggregation->getType());
diff --git a/tests/Unit/Aggregation/Pipeline/BucketScriptAggregationTest.php b/tests/Unit/Aggregation/Pipeline/BucketScriptAggregationTest.php
index 16c85b62fbb9e76f36d971b9a0843354fb06b895..ac3da94d3aaf828d9dab4391b830ee04af4892a0 100644
--- a/tests/Unit/Aggregation/Pipeline/BucketScriptAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/BucketScriptAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\BucketScriptAggregation;
 
 /**
  * Unit test for bucket script pipeline aggregation.
  */
-class BucketScriptAggregationTest extends \PHPUnit\Framework\TestCase
+class BucketScriptAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new BucketScriptAggregation(
             'test',
@@ -50,12 +51,11 @@ class BucketScriptAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if the exception is thrown in getArray method if no
      * buckets_path or script is set
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage `test` aggregation must have script set.
      */
-    public function testGetArrayException()
+    public function testGetArrayException(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('`test` aggregation must have script set.');
         $agg = new BucketScriptAggregation('test', []);
 
         $agg->getArray();
diff --git a/tests/Unit/Aggregation/Pipeline/BucketSelectorAggregationTest.php b/tests/Unit/Aggregation/Pipeline/BucketSelectorAggregationTest.php
index c8edbc9c5ba7dd9203b8b7f9dda508d6b1d0fac6..07f4fc05f8ce21a2674d2de951f8f75c6b894f0c 100644
--- a/tests/Unit/Aggregation/Pipeline/BucketSelectorAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/BucketSelectorAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\BucketSelectorAggregation;
 
 /**
  * Unit test for bucket selector pipeline aggregation.
  */
-class BucketSelectorAggregationTest extends \PHPUnit\Framework\TestCase
+class BucketSelectorAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new BucketSelectorAggregation(
             'test',
@@ -48,12 +49,11 @@ class BucketSelectorAggregationTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if the exception is thrown in getArray method if no
      * buckets_path or script is set
-     *
-     * @expectedException \LogicException
-     * @expectedExceptionMessage `test` aggregation must have script set.
      */
-    public function testGetArrayException()
+    public function testGetArrayException(): void
     {
+        $this->expectException(\LogicException::class);
+        $this->expectExceptionMessage('`test` aggregation must have script set.');
         $agg = new BucketSelectorAggregation('test', []);
 
         $agg->getArray();
diff --git a/tests/Unit/Aggregation/Pipeline/BucketSortAggregationTest.php b/tests/Unit/Aggregation/Pipeline/BucketSortAggregationTest.php
index 098c7d92ddc0f04dd2c9c56297632f6836d33e32..9ab5e6bf3a9c2b93a3a19958b941bd283a5d2f5d 100644
--- a/tests/Unit/Aggregation/Pipeline/BucketSortAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/BucketSortAggregationTest.php
@@ -11,6 +11,7 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\BucketSortAggregation;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\MovingFunctionAggregation;
 use ONGR\ElasticsearchDSL\Sort\FieldSort;
@@ -18,12 +19,12 @@ use ONGR\ElasticsearchDSL\Sort\FieldSort;
 /**
  * Unit test for the bucket sort aggregation.
  */
-class BucketSortAggregationTest extends \PHPUnit\Framework\TestCase
+class BucketSortAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new BucketSortAggregation('acme', 'test');
 
diff --git a/tests/Unit/Aggregation/Pipeline/CumulativeSumAggregationTest.php b/tests/Unit/Aggregation/Pipeline/CumulativeSumAggregationTest.php
index 2a9049497b1f887c7a7c45b00570cedb6022de31..019a50ec8124405f2b8c44f34917d0e3f48593e0 100644
--- a/tests/Unit/Aggregation/Pipeline/CumulativeSumAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/CumulativeSumAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\CumulativeSumAggregation;
 
 /**
  * Unit test for cumulative sum aggregation.
  */
-class CumulativeSumAggregationTest extends \PHPUnit\Framework\TestCase
+class CumulativeSumAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new CumulativeSumAggregation('acme', 'test');
 
diff --git a/tests/Unit/Aggregation/Pipeline/DerivativeAggregationTest.php b/tests/Unit/Aggregation/Pipeline/DerivativeAggregationTest.php
index 2d37b5ace17a2a3c97ede69feb117771da76cdc5..70ff4ba250f37a31175d29f71857ac374cf3ce2e 100644
--- a/tests/Unit/Aggregation/Pipeline/DerivativeAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/DerivativeAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\DerivativeAggregation;
 
 /**
  * Unit test for derivative aggregation.
  */
-class DerivativeAggregationTest extends \PHPUnit\Framework\TestCase
+class DerivativeAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new DerivativeAggregation('foo', 'foo>bar');
         $aggregation->addParameter('gap_policy', 'skip');
diff --git a/tests/Unit/Aggregation/Pipeline/ExtendedStatsBucketAggregationTest.php b/tests/Unit/Aggregation/Pipeline/ExtendedStatsBucketAggregationTest.php
index 69f3efc18f102a547650d2f0a1e86842ba0205c3..05f077c59d28837230cf26b90ef65299df1353db 100644
--- a/tests/Unit/Aggregation/Pipeline/ExtendedStatsBucketAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/ExtendedStatsBucketAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\ExtendedStatsBucketAggregation;
 
 /**
  * Unit test for stats bucket aggregation.
  */
-class ExtendedStatsBucketAggregationTest extends \PHPUnit\Framework\TestCase
+class ExtendedStatsBucketAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new ExtendedStatsBucketAggregation('acme', 'test');
 
diff --git a/tests/Unit/Aggregation/Pipeline/MaxBucketAggregationTest.php b/tests/Unit/Aggregation/Pipeline/MaxBucketAggregationTest.php
index db8af0808f4d71c1ca8a741739dcbab9137ef0d9..b66bee7c922edcd7f0633be92c3e3909c68c5baf 100644
--- a/tests/Unit/Aggregation/Pipeline/MaxBucketAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/MaxBucketAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\MaxBucketAggregation;
 
 /**
  * Unit test for max bucket aggregation.
  */
-class MaxBucketAggregationTest extends \PHPUnit\Framework\TestCase
+class MaxBucketAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new MaxBucketAggregation('acme', 'test');
 
diff --git a/tests/Unit/Aggregation/Pipeline/MinBucketAggregationTest.php b/tests/Unit/Aggregation/Pipeline/MinBucketAggregationTest.php
index cee5c0c101c5b41f4427cb7040bb063960e70fb1..03f3a6f44eb2b68ec64256e1c22fcc0d5a8c3551 100644
--- a/tests/Unit/Aggregation/Pipeline/MinBucketAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/MinBucketAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\MinBucketAggregation;
 
 /**
  * Unit test for min bucket aggregation.
  */
-class MinBucketAggregationTest extends \PHPUnit\Framework\TestCase
+class MinBucketAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new MinBucketAggregation('acme', 'test');
 
diff --git a/tests/Unit/Aggregation/Pipeline/MovingFunctionAggregationTest.php b/tests/Unit/Aggregation/Pipeline/MovingFunctionAggregationTest.php
index 0f769cf1cec2dc68afbd7f5a9f8f75dddda15a42..4d5a4a4e5d7c697a5e089dd9454876dff870c38b 100644
--- a/tests/Unit/Aggregation/Pipeline/MovingFunctionAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/MovingFunctionAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\MovingFunctionAggregation;
 
 /**
  * Unit test for sum bucket aggregation.
  */
-class MovingFunctionAggregationTest extends \PHPUnit\Framework\TestCase
+class MovingFunctionAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new MovingFunctionAggregation('acme', 'test');
 
diff --git a/tests/Unit/Aggregation/Pipeline/PercentilesBucketAggregationTest.php b/tests/Unit/Aggregation/Pipeline/PercentilesBucketAggregationTest.php
index 21ecc1b203eaf62d331f8f3a319e77aff5790f1b..fb8dc4e2644d637937f9ae6c1830b7cf2b376614 100644
--- a/tests/Unit/Aggregation/Pipeline/PercentilesBucketAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/PercentilesBucketAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\PercentilesBucketAggregation;
 
 /**
  * Unit test for percentiles bucket aggregation.
  */
-class PercentilesBucketAggregationTest extends \PHPUnit\Framework\TestCase
+class PercentilesBucketAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new PercentilesBucketAggregation('acme', 'test');
         $aggregation->setPercents([25.0, 50.0, 75.0]);
diff --git a/tests/Unit/Aggregation/Pipeline/SerialDifferencingAggregationTest.php b/tests/Unit/Aggregation/Pipeline/SerialDifferencingAggregationTest.php
index 41c0bac8dc1046673ed4da9b3c1bab15bbf6191b..7f720c46a09c0d12bdf089111dfffe737b8c069c 100644
--- a/tests/Unit/Aggregation/Pipeline/SerialDifferencingAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/SerialDifferencingAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\SerialDifferencingAggregation;
 
 /**
  * Unit test for serial differencing aggregation.
  */
-class SerialDifferencingAggregationTest extends \PHPUnit\Framework\TestCase
+class SerialDifferencingAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new SerialDifferencingAggregation('acme', 'test');
         $aggregation->addParameter('lag', '7');
diff --git a/tests/Unit/Aggregation/Pipeline/StatsBucketAggregationTest.php b/tests/Unit/Aggregation/Pipeline/StatsBucketAggregationTest.php
index 3bf5dd452d2f4610d1cce20bbc6f66ac1dcc583f..4c4c0c2d695e14de3ecbeacbee27dffbfd6fba91 100644
--- a/tests/Unit/Aggregation/Pipeline/StatsBucketAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/StatsBucketAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\StatsBucketAggregation;
 
 /**
  * Unit test for stats bucket aggregation.
  */
-class StatsBucketAggregationTest extends \PHPUnit\Framework\TestCase
+class StatsBucketAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new StatsBucketAggregation('acme', 'test');
 
diff --git a/tests/Unit/Aggregation/Pipeline/SumBucketAggregationTest.php b/tests/Unit/Aggregation/Pipeline/SumBucketAggregationTest.php
index 2e117543ca7901734b25872ef726fff5f349b22f..a658c5fcff3e59f8c2d94d736894ae61e1379dfb 100644
--- a/tests/Unit/Aggregation/Pipeline/SumBucketAggregationTest.php
+++ b/tests/Unit/Aggregation/Pipeline/SumBucketAggregationTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Aggregation\Pipeline;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Pipeline\SumBucketAggregation;
 
 /**
  * Unit test for sum bucket aggregation.
  */
-class SumBucketAggregationTest extends \PHPUnit\Framework\TestCase
+class SumBucketAggregationTest extends TestCase
 {
     /**
      * Tests toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $aggregation = new SumBucketAggregation('acme', 'test');
 
diff --git a/tests/Unit/BuilderBagTest.php b/tests/Unit/BuilderBagTest.php
index 49d6a2ffd99c8b55c5ce18e556b66e1b923b2fd8..a8199e9d9c5c1926cab4938e1b39c39368cc9319 100644
--- a/tests/Unit/BuilderBagTest.php
+++ b/tests/Unit/BuilderBagTest.php
@@ -11,15 +11,17 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\MockObject\MockObject;
 use ONGR\ElasticsearchDSL\BuilderBag;
 use ONGR\ElasticsearchDSL\BuilderInterface;
 
-class BuilderBagTest extends \PHPUnit\Framework\TestCase
+class BuilderBagTest extends TestCase
 {
     /**
      * Tests if bag knows if he has a builder.
      */
-    public function testHas()
+    public function testHas(): void
     {
         $bag = new BuilderBag();
         $fooBuilder = $this->getBuilder('foo');
@@ -30,7 +32,7 @@ class BuilderBagTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if bag can remove a builder.
      */
-    public function testRemove()
+    public function testRemove(): void
     {
         $bag = new BuilderBag();
         $fooBuilder = $this->getBuilder('foo');
@@ -48,7 +50,7 @@ class BuilderBagTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if bag can clear it's builders.
      */
-    public function testClear()
+    public function testClear(): void
     {
         $bag = new BuilderBag(
             [
@@ -65,7 +67,7 @@ class BuilderBagTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if bag can get a builder.
      */
-    public function testGet()
+    public function testGet(): void
     {
         $bag = new BuilderBag();
         $bazBuilder = $this->getBuilder('baz');
@@ -79,12 +81,13 @@ class BuilderBagTest extends \PHPUnit\Framework\TestCase
      *
      * @param string $name
      *
-     * @return \PHPUnit_Framework_MockObject_MockObject|BuilderInterface
+     * @return MockObject|BuilderInterface
      */
-    private function getBuilder($name)
+    private function getBuilder(mixed $name)
     {
-        $friendlyBuilderMock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')
-            ->setMethods(['getName', 'toArray', 'getType'])
+        $friendlyBuilderMock = $this->getMockBuilder(BuilderInterface::class)
+            ->addMethods(['getName'])
+            ->onlyMethods(['toArray', 'getType'])
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/tests/Unit/Highlight/HighlightTest.php b/tests/Unit/Highlight/HighlightTest.php
index bc5ddaa1b538af36fc83d40125aa7b862d80f418..c4761d8a719870e5ba5bef024d32c5fd28777b5e 100644
--- a/tests/Unit/Highlight/HighlightTest.php
+++ b/tests/Unit/Highlight/HighlightTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Highlight;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Highlight\Highlight;
 
-class HighlightTest extends \PHPUnit\Framework\TestCase
+class HighlightTest extends TestCase
 {
     /**
      * Tests GetType method, it should return 'highlight'.
      */
-    public function testGetType()
+    public function testGetType(): void
     {
         $highlight = new Highlight();
         $result = $highlight->getType();
@@ -28,10 +29,11 @@ class HighlightTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests ParametersTrait hasParameter method.
      */
-    public function testTraitHasParameter()
+    public function testTraitHasParameter(): void
     {
         $highlight = new Highlight();
         $highlight->addParameter('_source', ['include' => ['title']]);
+
         $result = $highlight->hasParameter('_source');
         $this->assertTrue($result);
     }
@@ -39,11 +41,12 @@ class HighlightTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests ParametersTrait removeParameter method.
      */
-    public function testTraitRemoveParameter()
+    public function testTraitRemoveParameter(): void
     {
         $highlight = new Highlight();
         $highlight->addParameter('_source', ['include' => ['title']]);
         $highlight->removeParameter('_source');
+
         $result = $highlight->hasParameter('_source');
         $this->assertFalse($result);
     }
@@ -51,10 +54,11 @@ class HighlightTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests ParametersTrait getParameter method.
      */
-    public function testTraitGetParameter()
+    public function testTraitGetParameter(): void
     {
         $highlight = new Highlight();
         $highlight->addParameter('_source', ['include' => 'title']);
+
         $expectedResult = ['include' => 'title'];
         $this->assertEquals($expectedResult, $highlight->getParameter('_source'));
     }
@@ -62,7 +66,7 @@ class HighlightTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests ParametersTrait getParameters and setParameters methods.
      */
-    public function testTraitSetGetParameters()
+    public function testTraitSetGetParameters(): void
     {
         $highlight = new Highlight();
         $highlight->setParameters(
@@ -85,16 +89,17 @@ class HighlightTest extends \PHPUnit\Framework\TestCase
     /**
      * Test toArray method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $highlight = new Highlight();
         $highlight->addField('ok');
         $highlight->addParameter('_source', ['include' => ['title']]);
         $highlight->setTags(['<tag>'], ['</tag>']);
+
         $result = $highlight->toArray();
         $expectedResult = [
             'fields' => [
-                'ok' => new \StdClass,
+                'ok' => [],
             ],
             '_source' => [
                 'include' => [
diff --git a/tests/Unit/InnerHit/NestedInnerHitTest.php b/tests/Unit/InnerHit/NestedInnerHitTest.php
index 0e1ee2cbb28f00805a9a57ab4b9bdbc42e9fd667..cbddec82e34fc84afc05b1f6a7548f9398180ae8 100644
--- a/tests/Unit/InnerHit/NestedInnerHitTest.php
+++ b/tests/Unit/InnerHit/NestedInnerHitTest.php
@@ -2,19 +2,19 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\InnerHit;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\InnerHit\NestedInnerHit;
 use ONGR\ElasticsearchDSL\Query\FullText\MatchQuery;
 use ONGR\ElasticsearchDSL\Query\Joining\NestedQuery;
 use ONGR\ElasticsearchDSL\Search;
 
-class NestedInnerHitTest extends \PHPUnit\Framework\TestCase
+class NestedInnerHitTest extends TestCase
 {
     /**
      * Data provider for testToArray().
-     *
-     * @return array
      */
-    public function getTestToArrayData()
+    public static function getTestToArrayData(): array
     {
         $out = [];
 
@@ -38,7 +38,7 @@ class NestedInnerHitTest extends \PHPUnit\Framework\TestCase
             $emptyInnerHit,
             [
                 'path' => [
-                    'foo' => new \stdClass(),
+                    'foo' => [],
                 ],
             ],
         ];
@@ -90,10 +90,9 @@ class NestedInnerHitTest extends \PHPUnit\Framework\TestCase
      *
      * @param NestedInnerHit $innerHit
      * @param array          $expected
-     *
-     * @dataProvider getTestToArrayData
      */
-    public function testToArray($innerHit, $expected)
+    #[DataProvider('getTestToArrayData')]
+    public function testToArray($innerHit, mixed $expected): void
     {
         $this->assertEquals($expected, $innerHit->toArray());
     }
@@ -102,7 +101,7 @@ class NestedInnerHitTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests getters and setters for $name, $path and $query
      */
-    public function testGettersAndSetters()
+    public function testGettersAndSetters(): void
     {
         $query = new MatchQuery('acme', 'test');
         $search = new Search();
diff --git a/tests/Unit/InnerHit/ParentInnerHitTest.php b/tests/Unit/InnerHit/ParentInnerHitTest.php
index 7794b9b4d38bbe97e58541be24dc4b9a26d346da..bc1783ca84f678beee3000aafb9c035d8c4280e1 100644
--- a/tests/Unit/InnerHit/ParentInnerHitTest.php
+++ b/tests/Unit/InnerHit/ParentInnerHitTest.php
@@ -2,13 +2,14 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\InnerHit;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\InnerHit\ParentInnerHit;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
 use ONGR\ElasticsearchDSL\Search;
 
-class ParentInnerHitTest extends \PHPUnit\Framework\TestCase
+class ParentInnerHitTest extends TestCase
 {
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new TermQuery('foo', 'bar');
         $search = new Search();
diff --git a/tests/Unit/ParametersTraitTest.php b/tests/Unit/ParametersTraitTest.php
index d456e288274d2598efa658495f77d9e89769ea8f..d4035dc929abffb4704e8af9eba756396e802f08 100644
--- a/tests/Unit/ParametersTraitTest.php
+++ b/tests/Unit/ParametersTraitTest.php
@@ -11,30 +11,32 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit;
 
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\ParametersTrait;
 
 /**
  * Test for ParametersTrait.
  */
-class ParametersTraitTest extends \PHPUnit\Framework\TestCase
+class ParametersTraitTest extends TestCase
 {
     /**
      * @var ParametersTrait
      */
-    private $parametersTraitMock;
+    private MockObject $parametersTraitMock;
 
     /**
      * {@inheritdoc}
      */
-    public function setUp()
+    protected function setUp(): void
     {
-        $this->parametersTraitMock = $this->getMockForTrait('ONGR\ElasticsearchDSL\ParametersTrait');
+        $this->parametersTraitMock = $this->getMockForTrait(ParametersTrait::class);
     }
 
     /**
      * Tests addParameter method.
      */
-    public function testGetAndAddParameter()
+    public function testGetAndAddParameter(): void
     {
         $this->parametersTraitMock->addParameter('acme', 123);
         $this->assertEquals(123, $this->parametersTraitMock->getParameter('acme'));
diff --git a/tests/Unit/Query/Compound/BoolQueryTest.php b/tests/Unit/Query/Compound/BoolQueryTest.php
index 93fe2db74fee48f5c0b832c12fe5a3eeb7b9e101..708f016945530c529218a973882b63de77eea1b7 100644
--- a/tests/Unit/Query/Compound/BoolQueryTest.php
+++ b/tests/Unit/Query/Compound/BoolQueryTest.php
@@ -11,6 +11,7 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Compound;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery;
 use ONGR\ElasticsearchDSL\Query\MatchAllQuery;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
@@ -18,16 +19,15 @@ use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
 /**
  * Unit test for Bool.
  */
-class BoolQueryTest extends \PHPUnit\Framework\TestCase
+class BoolQueryTest extends TestCase
 {
     /**
      * Test for addToBool() without setting a correct bool operator.
-     *
-     * @expectedException        \UnexpectedValueException
-     * @expectedExceptionMessage The bool operator acme is not supported
      */
-    public function testBoolAddToBoolException()
+    public function testBoolAddToBoolException(): void
     {
+        $this->expectException(\UnexpectedValueException::class);
+        $this->expectExceptionMessage('The bool operator acme is not supported');
         $bool = new BoolQuery();
         $bool->add(new MatchAllQuery(), 'acme');
     }
@@ -35,7 +35,7 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests constructor builds container
      */
-    public function testBoolConstructor()
+    public function testBoolConstructor(): void
     {
         $bool = new BoolQuery([
             BoolQuery::SHOULD => [new TermQuery('key1', 'value1')],
@@ -81,12 +81,11 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
 
     /**
      * Tests exception thrown if invalid BoolQuery type key is specified
-     *
-     * @expectedException        \UnexpectedValueException
-     * @expectedExceptionMessage The bool operator acme is not supported
      */
-    public function testBoolConstructorException()
+    public function testBoolConstructorException(): void
     {
+        $this->expectException(\UnexpectedValueException::class);
+        $this->expectExceptionMessage('The bool operator acme is not supported');
         new BoolQuery([
             'acme' => [new TermQuery('key1', 'value1')],
         ]);
@@ -95,12 +94,13 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests toArray() method.
      */
-    public function testBoolToArray()
+    public function testBoolToArray(): void
     {
         $bool = new BoolQuery();
         $bool->add(new TermQuery('key1', 'value1'), BoolQuery::SHOULD);
         $bool->add(new TermQuery('key2', 'value2'), BoolQuery::MUST);
         $bool->add(new TermQuery('key3', 'value3'), BoolQuery::MUST_NOT);
+
         $expected = [
             'bool' => [
                 'should' => [
@@ -132,21 +132,22 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests bool query with empty body if it forms \stdObject
      */
-    public function testEmptyBoolQuery()
+    public function testEmptyBoolQuery(): void
     {
         $bool = new BoolQuery();
 
-        $this->assertEquals(['bool' => new \stdClass()], $bool->toArray());
+        $this->assertEquals(['bool' => []], $bool->toArray());
     }
 
     /**
      * Tests bool query in filter context.
      */
-    public function testBoolInFilterContext()
+    public function testBoolInFilterContext(): void
     {
         $bool = new BoolQuery();
         $bool->add(new TermQuery('key1', 'value1'), BoolQuery::FILTER);
         $bool->add(new TermQuery('key2', 'value2'), BoolQuery::MUST);
+
         $expected = [
             'bool' => [
                 'filter' => [
@@ -171,10 +172,11 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Test if simplified structure is returned in case single MUST query given.
      */
-    public function testSingleMust()
+    public function testSingleMust(): void
     {
         $bool = new BoolQuery();
         $bool->add(new TermQuery('key2', 'value2'), BoolQuery::MUST);
+
         $expected = [
             'term' => [
                 'key2' => 'value2',
@@ -186,17 +188,17 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if BoolQuery::getQueries returns an empty array.
      */
-    public function testGetQueriesEmpty()
+    public function testGetQueriesEmpty(): void
     {
         $bool = new BoolQuery();
 
-        $this->assertInternalType('array', $bool->getQueries());
+        $this->assertIsArray($bool->getQueries());
     }
 
     /**
      * Tests if BoolQuery::getQueries returns an array with the added queries of all bool types.
      */
-    public function testGetQueries()
+    public function testGetQueries(): void
     {
         $query = new TermQuery('key1', 'value1');
         $query2 = new TermQuery('key2', 'value2');
@@ -205,23 +207,23 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
         $bool->add($query, BoolQuery::MUST, 'query');
         $bool->add($query2, BoolQuery::SHOULD, 'query2');
 
-        $this->assertSame(array('query' => $query, 'query2' => $query2), $bool->getQueries());
+        $this->assertSame(['query' => $query, 'query2' => $query2], $bool->getQueries());
     }
 
     /**
      * Tests if BoolQuery::getQueries with specified bool type returns an empty array.
      */
-    public function testGetQueriesByBoolTypeEmpty()
+    public function testGetQueriesByBoolTypeEmpty(): void
     {
         $bool = new BoolQuery();
 
-        $this->assertInternalType('array', $bool->getQueries(BoolQuery::MUST));
+        $this->assertIsArray($bool->getQueries(BoolQuery::MUST));
     }
 
     /**
      * Tests if BoolQuery::getQueries with specified bool type returns an array with added queries.
      */
-    public function testGetQueriesByBoolTypeWithQueryAddedToBoolType()
+    public function testGetQueriesByBoolTypeWithQueryAddedToBoolType(): void
     {
         $query = new TermQuery('key1', 'value1');
         $query2 = new TermQuery('key2', 'value2');
@@ -230,6 +232,6 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
         $bool->add($query, BoolQuery::MUST, 'query');
         $bool->add($query2, BoolQuery::SHOULD, 'query2');
 
-        $this->assertSame(array('query' => $query), $bool->getQueries(BoolQuery::MUST));
+        $this->assertSame(['query' => $query], $bool->getQueries(BoolQuery::MUST));
     }
 }
diff --git a/tests/Unit/Query/Compound/BoostingQueryTest.php b/tests/Unit/Query/Compound/BoostingQueryTest.php
index 7fa687b65fdc1b0245db8e2198b26dd32a02b164..823c83bce3f05c79c7582ff71a048e4cf670fd6e 100644
--- a/tests/Unit/Query/Compound/BoostingQueryTest.php
+++ b/tests/Unit/Query/Compound/BoostingQueryTest.php
@@ -11,16 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Compound;
 
+use ONGR\ElasticsearchDSL\BuilderInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Compound\BoostingQuery;
 
-class BoostingQueryTest extends \PHPUnit\Framework\TestCase
+class BoostingQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $mock = $this->createMock(BuilderInterface::class);
         $mock
             ->expects($this->any())
             ->method('toArray')
diff --git a/tests/Unit/Query/Compound/ConstantScoreQueryTest.php b/tests/Unit/Query/Compound/ConstantScoreQueryTest.php
index c1a11dcc9f7fb9787347127469abc9fcc4c34aa7..6e7e96ee9ba8f513a0fc17d9985ed74a2ef3d2c3 100644
--- a/tests/Unit/Query/Compound/ConstantScoreQueryTest.php
+++ b/tests/Unit/Query/Compound/ConstantScoreQueryTest.php
@@ -11,16 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Compound;
 
+use ONGR\ElasticsearchDSL\BuilderInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Compound\ConstantScoreQuery;
 
-class ConstantScoreQueryTest extends \PHPUnit\Framework\TestCase
+class ConstantScoreQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $mock = $this->createMock(BuilderInterface::class);
         $mock
             ->expects($this->any())
             ->method('toArray')
diff --git a/tests/Unit/Query/Compound/DisMaxQueryTest.php b/tests/Unit/Query/Compound/DisMaxQueryTest.php
index cbdda1fe4c5233e86f5aab031b6ff7c32f914d28..7e366f3e117c166503c1a3d3c023a3696f7c218a 100644
--- a/tests/Unit/Query/Compound/DisMaxQueryTest.php
+++ b/tests/Unit/Query/Compound/DisMaxQueryTest.php
@@ -11,16 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Compound;
 
+use ONGR\ElasticsearchDSL\BuilderInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Compound\DisMaxQuery;
 
-class DisMaxQueryTest extends \PHPUnit\Framework\TestCase
+class DisMaxQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $mock = $this->createMock(BuilderInterface::class);
         $mock
             ->expects($this->any())
             ->method('toArray')
@@ -29,6 +31,7 @@ class DisMaxQueryTest extends \PHPUnit\Framework\TestCase
         $query = new DisMaxQuery(['boost' => 1.2]);
         $query->addQuery($mock);
         $query->addQuery($mock);
+
         $expected = [
             'dis_max' => [
                 'queries' => [
diff --git a/tests/Unit/Query/Compound/FunctionScoreQueryTest.php b/tests/Unit/Query/Compound/FunctionScoreQueryTest.php
index 9997b0b7d045c64bf877a76375e73e3994d725f4..8270a4110eb0239277d2d929c8814af549838f0f 100644
--- a/tests/Unit/Query/Compound/FunctionScoreQueryTest.php
+++ b/tests/Unit/Query/Compound/FunctionScoreQueryTest.php
@@ -11,32 +11,32 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Compound;
 
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\BuilderInterface;
 use ONGR\ElasticsearchDSL\Query\Compound\FunctionScoreQuery;
 use ONGR\ElasticsearchDSL\Query\MatchAllQuery;
-use PHPUnit_Framework_MockObject_MockObject as MockObject;
 
 /**
  * Tests for FunctionScoreQuery.
  */
-class FunctionScoreQueryTest extends \PHPUnit\Framework\TestCase
+class FunctionScoreQueryTest extends TestCase
 {
     /**
      * Data provider for testAddRandomFunction.
-     *
-     * @return array
      */
-    public function addRandomFunctionProvider()
+    public static function addRandomFunctionProvider(): array
     {
         return [
             // Case #0. No seed.
             [
                 'seed' => null,
                 'expectedArray' => [
-                    'query' => null,
+                    'query' => [],
                     'functions' => [
                         [
-                            'random_score' => new \stdClass(),
+                            'random_score' => [],
                         ],
                     ],
                 ],
@@ -45,7 +45,7 @@ class FunctionScoreQueryTest extends \PHPUnit\Framework\TestCase
             [
                 'seed' => 'someSeed',
                 'expectedArray' => [
-                    'query' => null,
+                    'query' => [],
                     'functions' => [
                         [
                             'random_score' => [ 'seed' => 'someSeed'],
@@ -59,15 +59,13 @@ class FunctionScoreQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests addRandomFunction method.
      *
-     * @param mixed $seed
      * @param array $expectedArray
-     *
-     * @dataProvider addRandomFunctionProvider
      */
-    public function testAddRandomFunction($seed, $expectedArray)
+    #[DataProvider('addRandomFunctionProvider')]
+    public function testAddRandomFunction(mixed $seed, $expectedArray): void
     {
         /** @var MatchAllQuery|MockObject $matchAllQuery */
-        $matchAllQuery = $this->getMockBuilder('ONGR\ElasticsearchDSL\Query\MatchAllQuery')->getMock();
+        $matchAllQuery = $this->createMock(MatchAllQuery::class);
 
         $functionScoreQuery = new FunctionScoreQuery($matchAllQuery);
         $functionScoreQuery->addRandomFunction($seed);
@@ -78,17 +76,17 @@ class FunctionScoreQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests default argument values.
      */
-    public function testAddFieldValueFactorFunction()
+    public function testAddFieldValueFactorFunction(): void
     {
         /** @var BuilderInterface|MockObject $builderInterface */
-        $builderInterface = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface');
+        $builderInterface = $this->getMockForAbstractClass(BuilderInterface::class);
         $functionScoreQuery = new FunctionScoreQuery($builderInterface);
         $functionScoreQuery->addFieldValueFactorFunction('field1', 2);
         $functionScoreQuery->addFieldValueFactorFunction('field2', 1.5, 'ln');
 
         $this->assertEquals(
             [
-                'query' => null,
+                'query' => [],
                 'functions' => [
                     [
                         'field_value_factor' => [
diff --git a/tests/Unit/Query/FullText/CommonTermsQueryTest.php b/tests/Unit/Query/FullText/CommonTermsQueryTest.php
index 8a387132a665e10791c23dfbe4dcfb6631877234..05fd5dc4d7f0658d6b066bda3b939924a299296c 100644
--- a/tests/Unit/Query/FullText/CommonTermsQueryTest.php
+++ b/tests/Unit/Query/FullText/CommonTermsQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\FullText;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\FullText\CommonTermsQuery;
 
-class CommonTermsQueryTest extends \PHPUnit\Framework\TestCase
+class CommonTermsQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new CommonTermsQuery('body', 'this is bonsai cool', ['cutoff_frequency' => 0.01]);
         $expected = [
diff --git a/tests/Unit/Query/FullText/MatchPhrasePrefixQueryTest.php b/tests/Unit/Query/FullText/MatchPhrasePrefixQueryTest.php
index 9a0d651e78befdeb498855a947f4186e58ebad85..f01774c5f9e01ca075930ab3a0c84fe1047fd611 100644
--- a/tests/Unit/Query/FullText/MatchPhrasePrefixQueryTest.php
+++ b/tests/Unit/Query/FullText/MatchPhrasePrefixQueryTest.php
@@ -14,12 +14,12 @@ namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\FullText;
 use ONGR\ElasticsearchDSL\Query\FullText\MatchPhrasePrefixQuery;
 use PHPUnit\Framework\TestCase;
 
-class MatchPhrasePrefixQueryTest extends \PHPUnit\Framework\TestCase
+class MatchPhrasePrefixQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new MatchPhrasePrefixQuery('message', 'this is a test');
         $expected = [
diff --git a/tests/Unit/Query/FullText/MatchPhraseQueryTest.php b/tests/Unit/Query/FullText/MatchPhraseQueryTest.php
index 0bd142c009259f6028db561cca7274b6705d8b97..4790cbb40d4686656b54d08b91fa2f9ed5e79afa 100644
--- a/tests/Unit/Query/FullText/MatchPhraseQueryTest.php
+++ b/tests/Unit/Query/FullText/MatchPhraseQueryTest.php
@@ -14,12 +14,12 @@ namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\FullText;
 use ONGR\ElasticsearchDSL\Query\FullText\MatchPhraseQuery;
 use PHPUnit\Framework\TestCase;
 
-class MatchPhraseQueryTest extends \PHPUnit\Framework\TestCase
+class MatchPhraseQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new MatchPhraseQuery('message', 'this is a test');
         $expected = [
diff --git a/tests/Unit/Query/FullText/MatchQueryTest.php b/tests/Unit/Query/FullText/MatchQueryTest.php
index e1b664f2685962bf1d27dfef0b45d28b11bcc9c9..048d7dd25ef7275cce49e87ac7f6dc6bc67c3edd 100644
--- a/tests/Unit/Query/FullText/MatchQueryTest.php
+++ b/tests/Unit/Query/FullText/MatchQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\FullText;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\FullText\MatchQuery;
 
-class MatchQueryTest extends \PHPUnit\Framework\TestCase
+class MatchQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new MatchQuery('message', 'this is a test');
         $expected = [
diff --git a/tests/Unit/Query/FullText/MultiMatchQueryTest.php b/tests/Unit/Query/FullText/MultiMatchQueryTest.php
index 833bfb432b010a360a06bc182879a754e79554fe..ee26796e3042e175a2737bb3393c06d2aef605a7 100644
--- a/tests/Unit/Query/FullText/MultiMatchQueryTest.php
+++ b/tests/Unit/Query/FullText/MultiMatchQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\FullText;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\FullText\MultiMatchQuery;
 
-class MultiMatchQueryTest extends \PHPUnit\Framework\TestCase
+class MultiMatchQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new MultiMatchQuery(['message', 'title'], 'this is a test');
         $expected = [
@@ -34,7 +35,7 @@ class MultiMatchQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests multi-match query with no fields.
      */
-    public function testToArrayWithNoFields()
+    public function testToArrayWithNoFields(): void
     {
         $query = new MultiMatchQuery([], 'this is a test');
         $expected = [
diff --git a/tests/Unit/Query/FullText/QueryStringQueryTest.php b/tests/Unit/Query/FullText/QueryStringQueryTest.php
index 7d8337d40db3c2b43695dab9b3bec280eb40eb3a..2a7b2180e041e420de486030d6395cca8713ec68 100644
--- a/tests/Unit/Query/FullText/QueryStringQueryTest.php
+++ b/tests/Unit/Query/FullText/QueryStringQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\FullText;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\FullText\QueryStringQuery;
 
-class QueryStringQueryTest extends \PHPUnit\Framework\TestCase
+class QueryStringQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new QueryStringQuery('this AND that OR thus');
         $expected = [
diff --git a/tests/Unit/Query/FullText/SimpleQueryStringQueryTest.php b/tests/Unit/Query/FullText/SimpleQueryStringQueryTest.php
index fd6d10c44e19e92060e2b29849985f070f72f8e5..bcaffe9dcebb7c3c0aed77f01e28f5a40b5bb57a 100644
--- a/tests/Unit/Query/FullText/SimpleQueryStringQueryTest.php
+++ b/tests/Unit/Query/FullText/SimpleQueryStringQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\FullText;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\FullText\SimpleQueryStringQuery;
 
-class SimpleQueryStringQueryTest extends \PHPUnit\Framework\TestCase
+class SimpleQueryStringQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new SimpleQueryStringQuery('"fried eggs" +(eggplant | potato) -frittata');
         $expected = [
diff --git a/tests/Unit/Query/Geo/GeoBoundingBoxQueryTest.php b/tests/Unit/Query/Geo/GeoBoundingBoxQueryTest.php
index bc9c01b1e245531b7146cfe5e6fe8416d02b2579..11b1ff9213d3c52a166f402c5b8d7ec3d1ace327 100644
--- a/tests/Unit/Query/Geo/GeoBoundingBoxQueryTest.php
+++ b/tests/Unit/Query/Geo/GeoBoundingBoxQueryTest.php
@@ -11,27 +11,26 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Geo;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Query\Geo\GeoBoundingBoxQuery;
 
-class GeoBoundingBoxQueryTest extends \PHPUnit\Framework\TestCase
+class GeoBoundingBoxQueryTest extends TestCase
 {
     /**
      * Test if exception is thrown when geo points are not set.
-     *
-     * @expectedException \LogicException
      */
-    public function testGeoBoundBoxQueryException()
+    public function testGeoBoundBoxQueryException(): void
     {
+        $this->expectException(\LogicException::class);
         $query = new GeoBoundingBoxQuery('location', []);
         $query->toArray();
     }
 
     /**
      * Data provider for testToArray().
-     *
-     * @return array
      */
-    public function getArrayDataProvider()
+    public static function getArrayDataProvider(): array
     {
         return [
             // Case #1 (2 values).
@@ -112,10 +111,9 @@ class GeoBoundingBoxQueryTest extends \PHPUnit\Framework\TestCase
      * @param array  $values     Bounding box values.
      * @param array  $parameters Optional parameters.
      * @param array  $expected   Expected result.
-     *
-     * @dataProvider getArrayDataProvider
      */
-    public function testToArray($field, $values, $parameters, $expected)
+    #[DataProvider('getArrayDataProvider')]
+    public function testToArray($field, $values, $parameters, $expected): void
     {
         $query = new GeoBoundingBoxQuery($field, $values, $parameters);
         $result = $query->toArray();
diff --git a/tests/Unit/Query/Geo/GeoDistanceQueryTest.php b/tests/Unit/Query/Geo/GeoDistanceQueryTest.php
index b7f416da0c03e67193b27efc2cfd11af6ef88046..71d3e5606903eb4134653edc4f6570ce4b6d519d 100644
--- a/tests/Unit/Query/Geo/GeoDistanceQueryTest.php
+++ b/tests/Unit/Query/Geo/GeoDistanceQueryTest.php
@@ -11,16 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Geo;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Query\Geo\GeoDistanceQuery;
 
-class GeoDistanceQueryTest extends \PHPUnit\Framework\TestCase
+class GeoDistanceQueryTest extends TestCase
 {
     /**
      * Data provider for testToArray().
-     *
-     * @return array
      */
-    public function getArrayDataProvider()
+    public static function getArrayDataProvider(): array
     {
         return [
             // Case #1.
@@ -50,10 +50,9 @@ class GeoDistanceQueryTest extends \PHPUnit\Framework\TestCase
      * @param array  $location   Location.
      * @param array  $parameters Optional parameters.
      * @param array  $expected   Expected result.
-     *
-     * @dataProvider getArrayDataProvider
      */
-    public function testToArray($field, $distance, $location, $parameters, $expected)
+    #[DataProvider('getArrayDataProvider')]
+    public function testToArray($field, $distance, $location, $parameters, $expected): void
     {
         $query = new GeoDistanceQuery($field, $distance, $location, $parameters);
         $result = $query->toArray();
diff --git a/tests/Unit/Query/Geo/GeoPolygonQueryTest.php b/tests/Unit/Query/Geo/GeoPolygonQueryTest.php
index 1edcaf97df8851d5bef6cc500a286c8c7debfff0..b15fa778ca8c486260389573409f6b303235d281 100644
--- a/tests/Unit/Query/Geo/GeoPolygonQueryTest.php
+++ b/tests/Unit/Query/Geo/GeoPolygonQueryTest.php
@@ -11,16 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Geo;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Query\Geo\GeoPolygonQuery;
 
-class GeoPolygonQueryTest extends \PHPUnit\Framework\TestCase
+class GeoPolygonQueryTest extends TestCase
 {
     /**
      * Data provider to testToArray.
-     *
-     * @return array
      */
-    public function getArrayDataProvider()
+    public static function getArrayDataProvider(): array
     {
         return [
             // Case #1.
@@ -76,10 +76,9 @@ class GeoPolygonQueryTest extends \PHPUnit\Framework\TestCase
      * @param array  $points     Polygon's points.
      * @param array  $parameters Optional parameters.
      * @param array  $expected   Expected result.
-     *
-     * @dataProvider getArrayDataProvider
      */
-    public function testToArray($field, $points, $parameters, $expected)
+    #[DataProvider('getArrayDataProvider')]
+    public function testToArray($field, $points, $parameters, $expected): void
     {
         $filter = new GeoPolygonQuery($field, $points, $parameters);
         $result = $filter->toArray();
diff --git a/tests/Unit/Query/Geo/GeoShapeQueryTest.php b/tests/Unit/Query/Geo/GeoShapeQueryTest.php
index 1779129d5a7ab51597a16d576cace148187d6917..94289cbee45f77930748e6b9816baa9a34251d70 100644
--- a/tests/Unit/Query/Geo/GeoShapeQueryTest.php
+++ b/tests/Unit/Query/Geo/GeoShapeQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Geo;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Geo\GeoShapeQuery;
 
-class GeoShapeQueryTest extends \PHPUnit\Framework\TestCase
+class GeoShapeQueryTest extends TestCase
 {
     /**
      * Tests toArray() method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $filter = new GeoShapeQuery(['param1' => 'value1']);
         $filter->addShape('location', 'envelope', [[13, 53], [14, 52]], GeoShapeQuery::INTERSECTS);
@@ -42,7 +43,7 @@ class GeoShapeQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Test for toArray() in case of pre-indexed shape.
      */
-    public function testToArrayIndexed()
+    public function testToArrayIndexed(): void
     {
         $filter = new GeoShapeQuery(['param1' => 'value1']);
         $filter->addPreIndexedShape('location', 'DEU', 'countries', 'shapes', 'location', GeoShapeQuery::WITHIN);
diff --git a/tests/Unit/Query/Joining/HasChildQueryTest.php b/tests/Unit/Query/Joining/HasChildQueryTest.php
index 147ca6742f73890e4abe35f573532bf13f4ae381..e5e6e1719e287005ddfc0cd404581aea4b5552a0 100644
--- a/tests/Unit/Query/Joining/HasChildQueryTest.php
+++ b/tests/Unit/Query/Joining/HasChildQueryTest.php
@@ -11,16 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Joining;
 
+use ONGR\ElasticsearchDSL\BuilderInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Joining\HasChildQuery;
 
-class HasChildQueryTest extends \PHPUnit\Framework\TestCase
+class HasChildQueryTest extends TestCase
 {
     /**
      * Tests whether __constructor calls setParameters method.
      */
-    public function testConstructor()
+    public function testConstructor(): void
     {
-        $parentQuery = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $parentQuery = $this->createMock(BuilderInterface::class);
         $query = new HasChildQuery('test_type', $parentQuery, ['test_parameter1']);
         $this->assertEquals(['test_parameter1'], $query->getParameters());
     }
diff --git a/tests/Unit/Query/Joining/HasParentQueryTest.php b/tests/Unit/Query/Joining/HasParentQueryTest.php
index 7601815ef27176da5a72d5e9fd185979514cdc28..c1402691563bb26f3cc42d0855cb18257194ea01 100644
--- a/tests/Unit/Query/Joining/HasParentQueryTest.php
+++ b/tests/Unit/Query/Joining/HasParentQueryTest.php
@@ -11,16 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Joining;
 
+use ONGR\ElasticsearchDSL\BuilderInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Joining\HasParentQuery;
 
-class HasParentQueryTest extends \PHPUnit\Framework\TestCase
+class HasParentQueryTest extends TestCase
 {
     /**
      * Tests whether __constructor calls setParameters method.
      */
-    public function testConstructor()
+    public function testConstructor(): void
     {
-        $parentQuery = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $parentQuery = $this->createMock(BuilderInterface::class);
         $query = new HasParentQuery('test_type', $parentQuery, ['test_parameter1']);
         $this->assertEquals(['test_parameter1'], $query->getParameters());
     }
diff --git a/tests/Unit/Query/Joining/NestedQueryTest.php b/tests/Unit/Query/Joining/NestedQueryTest.php
index 0291e726603edfd591152f7027001cd2791373da..5c161da897b1b6570f42865768047ad71f183849 100644
--- a/tests/Unit/Query/Joining/NestedQueryTest.php
+++ b/tests/Unit/Query/Joining/NestedQueryTest.php
@@ -11,17 +11,17 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Joining;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Query\Joining\NestedQuery;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery;
 
-class NestedQueryTest extends \PHPUnit\Framework\TestCase
+class NestedQueryTest extends TestCase
 {
     /**
      * Data provider to testGetToArray.
-     *
-     * @return array
      */
-    public function getArrayDataProvider()
+    public static function getArrayDataProvider(): array
     {
         $query = [
             'terms' => [
@@ -54,13 +54,13 @@ class NestedQueryTest extends \PHPUnit\Framework\TestCase
      * @param string $path
      * @param array  $parameters
      * @param array  $expected
-     *
-     * @dataProvider getArrayDataProvider
      */
-    public function testToArray($path, $parameters, $expected)
+    #[DataProvider('getArrayDataProvider')]
+    public function testToArray($path, $parameters, $expected): void
     {
         $query = new TermsQuery('foo', 'bar');
         $query = new NestedQuery($path, $query, $parameters);
+
         $result = $query->toArray();
         $this->assertEquals(['nested' => $expected], $result);
     }
diff --git a/tests/Unit/Query/MatchAllQueryTest.php b/tests/Unit/Query/MatchAllQueryTest.php
index bab4cc08441cf208a0fa0d8e9640b374dd21c5eb..a1e040e5a8459091de0b978219fb1c24cde87f5d 100644
--- a/tests/Unit/Query/MatchAllQueryTest.php
+++ b/tests/Unit/Query/MatchAllQueryTest.php
@@ -11,23 +11,24 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\MatchAllQuery;
 
-class MatchAllQueryTest extends \PHPUnit\Framework\TestCase
+class MatchAllQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArrayWhenThereAreNoParams()
+    public function testToArrayWhenThereAreNoParams(): void
     {
         $query = new MatchAllQuery();
-        $this->assertEquals(['match_all' => new \stdClass()], $query->toArray());
+        $this->assertEquals(['match_all' => []], $query->toArray());
     }
 
     /**
      * Tests toArray().
      */
-    public function testToArrayWithParams()
+    public function testToArrayWithParams(): void
     {
         $params = ['boost' => 5];
         $query = new MatchAllQuery($params);
diff --git a/tests/Unit/Query/Span/FieldMaskingSpanQueryTest.php b/tests/Unit/Query/Span/FieldMaskingSpanQueryTest.php
index 48ef28a500e2103a1a125b65d6a25415deb1ccbf..b56fa6a20faa85e78889f15f421734664452266e 100644
--- a/tests/Unit/Query/Span/FieldMaskingSpanQueryTest.php
+++ b/tests/Unit/Query/Span/FieldMaskingSpanQueryTest.php
@@ -11,6 +11,7 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\FieldMaskingSpanQuery;
 use ONGR\ElasticsearchDSL\Query\Span\SpanNearQuery;
 use ONGR\ElasticsearchDSL\Query\Span\SpanTermQuery;
@@ -18,12 +19,12 @@ use ONGR\ElasticsearchDSL\Query\Span\SpanTermQuery;
 /**
  * Unit test for FieldMaskingSpanQuery.
  */
-class FieldMaskingSpanQueryTest extends \PHPUnit\Framework\TestCase
+class FieldMaskingSpanQueryTest extends TestCase
 {
     /**
      * Tests for toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $spanTermQuery = new SpanTermQuery('text', 'quick brown');
 
diff --git a/tests/Unit/Query/Span/SpanContainingQueryTest.php b/tests/Unit/Query/Span/SpanContainingQueryTest.php
index 71411abf5302bb83db64bd841874c05135c4ed48..2e8d2b728e0bade66061836673d32a2b6633e45b 100644
--- a/tests/Unit/Query/Span/SpanContainingQueryTest.php
+++ b/tests/Unit/Query/Span/SpanContainingQueryTest.php
@@ -11,17 +11,19 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\SpanContainingQuery;
 
 /**
  * Unit test for SpanContainingQuery.
  */
-class SpanContainingQueryTest extends \PHPUnit\Framework\TestCase
+class SpanContainingQueryTest extends TestCase
 {
     /**
      * Tests for toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new SpanContainingQuery(
             $this->getSpanQueryMock('foo'),
@@ -41,13 +43,11 @@ class SpanContainingQueryTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @param string $value
-     *
      * @returns \PHPUnit_Framework_MockObject_MockObject
      */
-    private function getSpanQueryMock($value)
+    private function getSpanQueryMock(string $value)
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface')->getMock();
+        $mock = $this->createMock(SpanQueryInterface::class);
         $mock
             ->expects($this->once())
             ->method('toArray')
diff --git a/tests/Unit/Query/Span/SpanFirstQueryTest.php b/tests/Unit/Query/Span/SpanFirstQueryTest.php
index fbff909a61aa695e78c4fc4137b20b1e8708e2c3..09583bed9f37dae670e1271f4090c439f44a4b7e 100644
--- a/tests/Unit/Query/Span/SpanFirstQueryTest.php
+++ b/tests/Unit/Query/Span/SpanFirstQueryTest.php
@@ -11,19 +11,21 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\SpanFirstQuery;
 
 /**
  * Unit test for SpanFirstQuery.
  */
-class SpanFirstQueryTest extends \PHPUnit\Framework\TestCase
+class SpanFirstQueryTest extends TestCase
 {
     /**
      * Tests for toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface')->getMock();
+        $mock = $this->createMock(SpanQueryInterface::class);
         $mock
             ->expects($this->once())
             ->method('toArray')
diff --git a/tests/Unit/Query/Span/SpanMultiTermQueryTest.php b/tests/Unit/Query/Span/SpanMultiTermQueryTest.php
index e6f4f803286b7087e8160e596cf997cd2d4a0cb0..27254475a5046f9cb88a04a96054fccbf20ad304 100644
--- a/tests/Unit/Query/Span/SpanMultiTermQueryTest.php
+++ b/tests/Unit/Query/Span/SpanMultiTermQueryTest.php
@@ -11,19 +11,21 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use ONGR\ElasticsearchDSL\BuilderInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\SpanMultiTermQuery;
 
 /**
  * Unit test for SpanMultiTermQuery.
  */
-class SpanMultiTermQueryTest extends \PHPUnit\Framework\TestCase
+class SpanMultiTermQueryTest extends TestCase
 {
     /**
      * Test for toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $mock = $this->createMock(BuilderInterface::class);
         $mock
             ->expects($this->once())
             ->method('toArray')
diff --git a/tests/Unit/Query/Span/SpanNearQueryTest.php b/tests/Unit/Query/Span/SpanNearQueryTest.php
index a71d073378a36db8e9e8d716d51762cc6f0c824e..847f21079cc1b044f2f2ac9e40d116aa93449560 100644
--- a/tests/Unit/Query/Span/SpanNearQueryTest.php
+++ b/tests/Unit/Query/Span/SpanNearQueryTest.php
@@ -11,19 +11,21 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\SpanNearQuery;
 
 /**
  * Unit test for SpanNearQuery.
  */
-class SpanNearQueryTest extends \PHPUnit\Framework\TestCase
+class SpanNearQueryTest extends TestCase
 {
     /**
      * Tests for toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface')->getMock();
+        $mock = $this->createMock(SpanQueryInterface::class);
         $mock
             ->expects($this->once())
             ->method('toArray')
@@ -32,6 +34,7 @@ class SpanNearQueryTest extends \PHPUnit\Framework\TestCase
         $query = new SpanNearQuery(['in_order' => false]);
         $query->setSlop(5);
         $query->addQuery($mock);
+
         $result = [
             'span_near' => [
                 'clauses' => [
diff --git a/tests/Unit/Query/Span/SpanNotQueryTest.php b/tests/Unit/Query/Span/SpanNotQueryTest.php
index 0fb002f2f3456c2022fa1e74873577fe62360c89..74178399d9f9bb43cbec7e4f38e989c5bd34fbe0 100644
--- a/tests/Unit/Query/Span/SpanNotQueryTest.php
+++ b/tests/Unit/Query/Span/SpanNotQueryTest.php
@@ -11,19 +11,21 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\SpanNotQuery;
 
 /**
  * Unit test for SpanNotQuery.
  */
-class SpanNotQueryTest extends \PHPUnit\Framework\TestCase
+class SpanNotQueryTest extends TestCase
 {
     /**
      * Tests for toArray().
      */
-    public function testSpanNotQueryToArray()
+    public function testSpanNotQueryToArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface')->getMock();
+        $mock = $this->createMock(SpanQueryInterface::class);
         $mock
             ->expects($this->exactly(2))
             ->method('toArray')
diff --git a/tests/Unit/Query/Span/SpanOrQueryTest.php b/tests/Unit/Query/Span/SpanOrQueryTest.php
index 537caf44be953fd3a51bc822d9a23a1aee18485b..6bd5ecdd5c5c9f518fc5482f4d335943f1a01c36 100644
--- a/tests/Unit/Query/Span/SpanOrQueryTest.php
+++ b/tests/Unit/Query/Span/SpanOrQueryTest.php
@@ -11,19 +11,21 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\SpanOrQuery;
 
 /**
  * Unit test for SpanOrQuery.
  */
-class SpanOrQueryTest extends \PHPUnit\Framework\TestCase
+class SpanOrQueryTest extends TestCase
 {
     /**
      * Tests for toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface')->getMock();
+        $mock = $this->createMock(SpanQueryInterface::class);
         $mock
             ->expects($this->once())
             ->method('toArray')
@@ -31,6 +33,7 @@ class SpanOrQueryTest extends \PHPUnit\Framework\TestCase
 
         $query = new SpanOrQuery();
         $query->addQuery($mock);
+
         $result = [
             'span_or' => [
                 'clauses' => [
@@ -43,7 +46,7 @@ class SpanOrQueryTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals($result, $query->toArray());
 
         $result = $query->getQueries();
-        $this->assertInternalType('array', $result);
+        $this->assertIsArray($result);
         $this->assertEquals(1, count($result));
     }
 }
diff --git a/tests/Unit/Query/Span/SpanTermQueryTest.php b/tests/Unit/Query/Span/SpanTermQueryTest.php
index d260a6190883f20ae441120c37f55e286a2e2eff..91f7b37f0a6c0b3a5d9ad945b4cbc46b751e7d90 100644
--- a/tests/Unit/Query/Span/SpanTermQueryTest.php
+++ b/tests/Unit/Query/Span/SpanTermQueryTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\SpanTermQuery;
 
 /**
  * Unit test for SpanTermQuery.
  */
-class SpanTermQueryTest extends \PHPUnit\Framework\TestCase
+class SpanTermQueryTest extends TestCase
 {
     /**
      * Tests for toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new SpanTermQuery('user', 'bob');
         $expected = [
@@ -34,7 +35,7 @@ class SpanTermQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests for toArray() with parameters.
      */
-    public function testToArrayWithParameters()
+    public function testToArrayWithParameters(): void
     {
         $query = new SpanTermQuery('user', 'bob', ['boost' => 2]);
         $expected = [
diff --git a/tests/Unit/Query/Span/SpanWithinQueryTest.php b/tests/Unit/Query/Span/SpanWithinQueryTest.php
index d0a7c1603807cf32a86e15a875907781e517b5af..a3bf213b5cb074758debc373bc37431fdaa3033e 100644
--- a/tests/Unit/Query/Span/SpanWithinQueryTest.php
+++ b/tests/Unit/Query/Span/SpanWithinQueryTest.php
@@ -11,17 +11,19 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Span;
 
+use ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Span\SpanWithinQuery;
 
 /**
  * Unit test for SpanWithinQuery.
  */
-class SpanWithinQueryTest extends \PHPUnit\Framework\TestCase
+class SpanWithinQueryTest extends TestCase
 {
     /**
      * Tests for toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new SpanWithinQuery(
             $this->getSpanQueryMock('foo'),
@@ -41,13 +43,11 @@ class SpanWithinQueryTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @param string $value
-     *
      * @returns \PHPUnit_Framework_MockObject_MockObject
      */
-    private function getSpanQueryMock($value)
+    private function getSpanQueryMock(string $value)
     {
-        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\Query\Span\SpanQueryInterface')->getMock();
+        $mock = $this->createMock(SpanQueryInterface::class);
         $mock
             ->expects($this->once())
             ->method('toArray')
diff --git a/tests/Unit/Query/Specialized/MoreLikeThisQueryTest.php b/tests/Unit/Query/Specialized/MoreLikeThisQueryTest.php
index 557b40ee98195a6b54b9bf38e7c2627fa70074a7..6961ff357c2f4e1964c8c7aa4ec1a85ce28319bb 100644
--- a/tests/Unit/Query/Specialized/MoreLikeThisQueryTest.php
+++ b/tests/Unit/Query/Specialized/MoreLikeThisQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Specialized;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Specialized\MoreLikeThisQuery;
 
-class MoreLikeThisQueryTest extends \PHPUnit\Framework\TestCase
+class MoreLikeThisQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new MoreLikeThisQuery('this is a test', ['fields' => ['title', 'description']]);
         $expected = [
diff --git a/tests/Unit/Query/Specialized/ScriptQueryTest.php b/tests/Unit/Query/Specialized/ScriptQueryTest.php
index 7327f159b02f3cd1a27f4010a907f623a0f61c5c..2c55ec430fabb6a95cf0e51de18d8eb9bcef9403 100644
--- a/tests/Unit/Query/Specialized/ScriptQueryTest.php
+++ b/tests/Unit/Query/Specialized/ScriptQueryTest.php
@@ -11,16 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Specialized;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Query\Specialized\ScriptQuery;
 
-class ScriptQueryTest extends \PHPUnit\Framework\TestCase
+class ScriptQueryTest extends TestCase
 {
     /**
      * Data provider for testToArray().
-     *
-     * @return array
      */
-    public function getArrayDataProvider()
+    public static function getArrayDataProvider(): array
     {
         return [
             'simple_script' => [
@@ -42,10 +42,9 @@ class ScriptQueryTest extends \PHPUnit\Framework\TestCase
      * @param string $script     Script
      * @param array  $parameters Optional parameters
      * @param array  $expected   Expected values
-     *
-     * @dataProvider getArrayDataProvider
      */
-    public function testToArray($script, $parameters, $expected)
+    #[DataProvider('getArrayDataProvider')]
+    public function testToArray($script, $parameters, $expected): void
     {
         $filter = new ScriptQuery($script, $parameters);
         $result = $filter->toArray();
diff --git a/tests/Unit/Query/Specialized/TemplateQueryTest.php b/tests/Unit/Query/Specialized/TemplateQueryTest.php
index 80e497a5b0fc31c62ba68693e4c6ce7bd6bef8b4..618b23f990cc79dbb8e41de51f3f49ec4b3bfea0 100644
--- a/tests/Unit/Query/Specialized/TemplateQueryTest.php
+++ b/tests/Unit/Query/Specialized/TemplateQueryTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\Specialized;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\Specialized\TemplateQuery;
 
 /**
  * Unit test for Template.
  */
-class TemplateQueryTest extends \PHPUnit\Framework\TestCase
+class TemplateQueryTest extends TestCase
 {
     /**
      * Tests toArray() method with inline.
      */
-    public function testToArrayInline()
+    public function testToArrayInline(): void
     {
         $inline = '"term": {"field": "{{query_string}}"}';
         $params = ['query_string' => 'all about search'];
@@ -38,13 +39,14 @@ class TemplateQueryTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests toArray() method with file
      */
-    public function testToArrayFile()
+    public function testToArrayFile(): void
     {
         $file = 'my_template';
         $params = ['query_string' => 'all about search'];
         $query = new TemplateQuery();
         $query->setFile($file);
         $query->setParams($params);
+
         $expected = [
             'template' => [
                 'file' => $file,
@@ -56,11 +58,10 @@ class TemplateQueryTest extends \PHPUnit\Framework\TestCase
 
     /**
      * Tests toArray() exception
-     *
-     * @expectedException \InvalidArgumentException
      */
-    public function testToArrayException()
+    public function testToArrayException(): void
     {
+        $this->expectException(\InvalidArgumentException::class);
         $query = new TemplateQuery();
         $query->toArray();
     }
diff --git a/tests/Unit/Query/TermLevel/ExistsQueryTest.php b/tests/Unit/Query/TermLevel/ExistsQueryTest.php
index 9ffd57e0eb3d84274ac79b53c7c373ea72137e62..d8cda8ed56350f9ef18a5588417dea6a4e146174 100644
--- a/tests/Unit/Query/TermLevel/ExistsQueryTest.php
+++ b/tests/Unit/Query/TermLevel/ExistsQueryTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\ExistsQuery;
 
 /**
  * Unit test for ExistsQuery.
  */
-class ExistsQueryTest extends \PHPUnit\Framework\TestCase
+class ExistsQueryTest extends TestCase
 {
     /**
      * Tests toArray() method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new ExistsQuery('bar');
         $this->assertEquals(['exists' => ['field' => 'bar']], $query->toArray());
diff --git a/tests/Unit/Query/TermLevel/FuzzyQueryTest.php b/tests/Unit/Query/TermLevel/FuzzyQueryTest.php
index 8eeb5998b672b6de3ee1d68afc324cdab6aaf541..2cd491df1d51d7ca9edea52dab7ede4272fb8cba 100644
--- a/tests/Unit/Query/TermLevel/FuzzyQueryTest.php
+++ b/tests/Unit/Query/TermLevel/FuzzyQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\FuzzyQuery;
 
-class FuzzyQueryTest extends \PHPUnit\Framework\TestCase
+class FuzzyQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new FuzzyQuery('user', 'ki', ['boost' => 1.2]);
         $expected = [
diff --git a/tests/Unit/Query/TermLevel/IdsQueryTest.php b/tests/Unit/Query/TermLevel/IdsQueryTest.php
index eda356f1f43b1c585143256049b516ee9e032cbf..4e8a48048a4ecaae1b4057dc7ffa6e408742efe0 100644
--- a/tests/Unit/Query/TermLevel/IdsQueryTest.php
+++ b/tests/Unit/Query/TermLevel/IdsQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\IdsQuery;
 
-class IdsQueryTest extends \PHPUnit\Framework\TestCase
+class IdsQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new IdsQuery(['foo', 'bar']);
         $expected = [
diff --git a/tests/Unit/Query/TermLevel/PrefixQueryTest.php b/tests/Unit/Query/TermLevel/PrefixQueryTest.php
index 54604b522046e9fa4afd183a6a48b7630bc89b0c..00035dda00f84cd7271b6eaee715299e72f0237c 100644
--- a/tests/Unit/Query/TermLevel/PrefixQueryTest.php
+++ b/tests/Unit/Query/TermLevel/PrefixQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\PrefixQuery;
 
-class PrefixQueryTest extends \PHPUnit\Framework\TestCase
+class PrefixQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new PrefixQuery('user', 'ki');
         $expected = [
diff --git a/tests/Unit/Query/TermLevel/RangeQueryTest.php b/tests/Unit/Query/TermLevel/RangeQueryTest.php
index 9506b06e3aa9b143be5f4fe3df7ed33426cd3841..7a7fc36725085c4270a4c4494295e1606333fa47 100644
--- a/tests/Unit/Query/TermLevel/RangeQueryTest.php
+++ b/tests/Unit/Query/TermLevel/RangeQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\RangeQuery;
 
-class RangeQueryTest extends \PHPUnit\Framework\TestCase
+class RangeQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new RangeQuery('age', ['gte' => 10, 'lte' => 20]);
         $expected = [
diff --git a/tests/Unit/Query/TermLevel/RegexpQueryTest.php b/tests/Unit/Query/TermLevel/RegexpQueryTest.php
index 37035df53c71627a350231de5443de826d6c03eb..d2f29a32600133dc59fe361a534abebfe203fc2f 100644
--- a/tests/Unit/Query/TermLevel/RegexpQueryTest.php
+++ b/tests/Unit/Query/TermLevel/RegexpQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\RegexpQuery;
 
-class RegexpQueryTest extends \PHPUnit\Framework\TestCase
+class RegexpQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new RegexpQuery('user', 's.*y');
         $expected = [
diff --git a/tests/Unit/Query/TermLevel/TermQueryTest.php b/tests/Unit/Query/TermLevel/TermQueryTest.php
index 70bb264a820c953fef524701b86e32888e67d986..25d365a4d874dfc4f20bddb184afb77ff95c30bd 100644
--- a/tests/Unit/Query/TermLevel/TermQueryTest.php
+++ b/tests/Unit/Query/TermLevel/TermQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
 
-class TermQueryTest extends \PHPUnit\Framework\TestCase
+class TermQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new TermQuery('user', 'bob');
         $expected = [
diff --git a/tests/Unit/Query/TermLevel/TermsQueryTest.php b/tests/Unit/Query/TermLevel/TermsQueryTest.php
index a7c128e10be16beb17f282736139c1dd472ef342..7e5776d137f07af0b18d28353bd3470f8a047e10 100644
--- a/tests/Unit/Query/TermLevel/TermsQueryTest.php
+++ b/tests/Unit/Query/TermLevel/TermsQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery;
 
-class TermsQueryTest extends \PHPUnit\Framework\TestCase
+class TermsQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new TermsQuery('user', ['bob', 'elasticsearch']);
         $expected = [
diff --git a/tests/Unit/Query/TermLevel/TermsSetQueryTest.php b/tests/Unit/Query/TermLevel/TermsSetQueryTest.php
index c51fa90456a47e5fff3e531bfa5a5c28fc20e487..c2c9b42f44b186558a10d068fe3d7778b8b72086 100644
--- a/tests/Unit/Query/TermLevel/TermsSetQueryTest.php
+++ b/tests/Unit/Query/TermLevel/TermsSetQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermsSetQuery;
 
-class TermsSetQueryTest extends \PHPUnit\Framework\TestCase
+class TermsSetQueryTest extends TestCase
 {
     /**
      * Tests toArray().
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $terms = ['php', 'c++', 'java'];
         $parameters = ['minimum_should_match_field' => 'required_matches'];
@@ -35,7 +36,7 @@ class TermsSetQueryTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals($expected, $query->toArray());
     }
 
-    public function testItThrowsAaExceptionWhenMinimumShouldMatchFieldOrMinimumShouldMatchScriptIsNotGiven()
+    public function testItThrowsAaExceptionWhenMinimumShouldMatchFieldOrMinimumShouldMatchScriptIsNotGiven(): void
     {
         $message = "Either minimum_should_match_field or minimum_should_match_script must be set.";
         $this->expectException(\InvalidArgumentException::class);
diff --git a/tests/Unit/Query/TermLevel/TypeQueryTest.php b/tests/Unit/Query/TermLevel/TypeQueryTest.php
index 6a0cd7f638dbee302b1d5eee84712ad7c5ab18aa..6b5873ad169c210bca87ab33b2dae1e7472ffbcd 100644
--- a/tests/Unit/Query/TermLevel/TypeQueryTest.php
+++ b/tests/Unit/Query/TermLevel/TypeQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TypeQuery;
 
-class TypeQueryTest extends \PHPUnit\Framework\TestCase
+class TypeQueryTest extends TestCase
 {
     /**
      * Test for query toArray() method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new TypeQuery('foo');
         $expectedResult = [
diff --git a/tests/Unit/Query/TermLevel/WildcardQueryTest.php b/tests/Unit/Query/TermLevel/WildcardQueryTest.php
index cbc951896bbc3ad0404f2aaaa75e9100b2edf261..e40b8e53380a453cfb104e1b1f2282bd2d46616b 100644
--- a/tests/Unit/Query/TermLevel/WildcardQueryTest.php
+++ b/tests/Unit/Query/TermLevel/WildcardQueryTest.php
@@ -11,14 +11,15 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Query\TermLevel;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\WildcardQuery;
 
-class WildcardQueryTest extends \PHPUnit\Framework\TestCase
+class WildcardQueryTest extends TestCase
 {
     /**
      * Test for query toArray() method.
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $query = new WildcardQuery('user', 'ki*y');
         $expectedResult = [
diff --git a/tests/Unit/SearchEndpoint/AggregationsEndpointTest.php b/tests/Unit/SearchEndpoint/AggregationsEndpointTest.php
index 016c1ff7cd71813de081c6c17dc4c23d687647c3..3d66c9114dd523ef64cea6883dc50955989ec21a 100644
--- a/tests/Unit/SearchEndpoint/AggregationsEndpointTest.php
+++ b/tests/Unit/SearchEndpoint/AggregationsEndpointTest.php
@@ -11,21 +11,22 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Unit\SearchEndpoint;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Aggregation\Bucketing\MissingAggregation;
 use ONGR\ElasticsearchDSL\SearchEndpoint\AggregationsEndpoint;
 
 /**
  * Class AggregationsEndpointTest.
  */
-class AggregationsEndpointTest extends \PHPUnit\Framework\TestCase
+class AggregationsEndpointTest extends TestCase
 {
     /**
      * Tests constructor.
      */
-    public function testItCanBeInstantiated()
+    public function testItCanBeInstantiated(): void
     {
         $this->assertInstanceOf(
-            'ONGR\ElasticsearchDSL\SearchEndpoint\AggregationsEndpoint',
+            AggregationsEndpoint::class,
             new AggregationsEndpoint()
         );
     }
@@ -33,12 +34,13 @@ class AggregationsEndpointTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if endpoint returns builders.
      */
-    public function testEndpointGetter()
+    public function testEndpointGetter(): void
     {
         $aggName = 'acme_agg';
         $agg = new MissingAggregation('acme');
         $endpoint = new AggregationsEndpoint();
         $endpoint->add($agg, $aggName);
+
         $builders = $endpoint->getAll();
 
         $this->assertCount(1, $builders);
diff --git a/tests/Unit/SearchEndpoint/HighlightEndpointTest.php b/tests/Unit/SearchEndpoint/HighlightEndpointTest.php
index 5b1a623f8c8c7e59fa1c8c9f10023672a1a13ad8..0f0742978ce5897e95506d5b29376d991388db39 100644
--- a/tests/Unit/SearchEndpoint/HighlightEndpointTest.php
+++ b/tests/Unit/SearchEndpoint/HighlightEndpointTest.php
@@ -11,51 +11,52 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Unit\SearchEndpoint;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Highlight\Highlight;
 use ONGR\ElasticsearchDSL\SearchEndpoint\HighlightEndpoint;
 use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
-use PHPUnit_Framework_MockObject_MockObject as MockObject;
 
 /**
  * Class HighlightEndpointTest.
  */
-class HighlightEndpointTest extends \PHPUnit\Framework\TestCase
+class HighlightEndpointTest extends TestCase
 {
     /**
      * Tests constructor.
      */
-    public function testItCanBeInstantiated()
+    public function testItCanBeInstantiated(): void
     {
-        $this->assertInstanceOf('ONGR\ElasticsearchDSL\SearchEndpoint\HighlightEndpoint', new HighlightEndpoint());
+        $this->assertInstanceOf(HighlightEndpoint::class, new HighlightEndpoint());
     }
 
     /**
      * Tests adding builder.
      */
-    public function testNormalization()
+    public function testNormalization(): void
     {
         $instance = new HighlightEndpoint();
         /** @var NormalizerInterface|MockObject $normalizerInterface */
         $normalizerInterface = $this->getMockForAbstractClass(
-            'Symfony\Component\Serializer\Normalizer\NormalizerInterface'
+            NormalizerInterface::class
         );
 
         $this->assertNull($instance->normalize($normalizerInterface));
 
         $highlight = new Highlight();
         $highlight->addField('acme');
+
         $instance->add($highlight);
 
         $this->assertEquals(
-            json_encode($highlight->toArray()),
-            json_encode($instance->normalize($normalizerInterface))
+            json_encode($highlight->toArray(), JSON_THROW_ON_ERROR),
+            json_encode($instance->normalize($normalizerInterface), JSON_THROW_ON_ERROR)
         );
     }
 
     /**
      * Tests if endpoint returns builders.
      */
-    public function testEndpointGetter()
+    public function testEndpointGetter(): void
     {
         $highlightName = 'acme_highlight';
         $highlight = new Highlight();
@@ -63,6 +64,7 @@ class HighlightEndpointTest extends \PHPUnit\Framework\TestCase
 
         $endpoint = new HighlightEndpoint();
         $endpoint->add($highlight, $highlightName);
+
         $builders = $endpoint->getAll();
 
         $this->assertCount(1, $builders);
diff --git a/tests/Unit/SearchEndpoint/InnerHitsEndpointTest.php b/tests/Unit/SearchEndpoint/InnerHitsEndpointTest.php
index 26e2a7a360773b9853fddf494f3c7d89da0d83e8..5d90d263b1c6486990fcd0df084b2794bc7d4dbb 100644
--- a/tests/Unit/SearchEndpoint/InnerHitsEndpointTest.php
+++ b/tests/Unit/SearchEndpoint/InnerHitsEndpointTest.php
@@ -11,20 +11,23 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Unit\SearchEndpoint;
 
+use ONGR\ElasticsearchDSL\BuilderInterface;
+use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\SearchEndpoint\InnerHitsEndpoint;
 
 /**
  * Class AggregationsEndpointTest.
  */
-class InnerHitsEndpointTest extends \PHPUnit\Framework\TestCase
+class InnerHitsEndpointTest extends TestCase
 {
     /**
      * Tests constructor.
      */
-    public function testItCanBeInstantiated()
+    public function testItCanBeInstantiated(): void
     {
         $this->assertInstanceOf(
-            'ONGR\ElasticsearchDSL\SearchEndpoint\InnerHitsEndpoint',
+            InnerHitsEndpoint::class,
             new InnerHitsEndpoint()
         );
     }
@@ -32,12 +35,13 @@ class InnerHitsEndpointTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if endpoint returns builders.
      */
-    public function testEndpointGetter()
+    public function testEndpointGetter(): void
     {
         $hitName = 'foo';
-        $innerHit = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $innerHit = $this->createMock(BuilderInterface::class);
         $endpoint = new InnerHitsEndpoint();
         $endpoint->add($innerHit, $hitName);
+
         $builders = $endpoint->getAll();
 
         $this->assertCount(1, $builders);
@@ -47,20 +51,20 @@ class InnerHitsEndpointTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests normalize method
      */
-    public function testNormalization()
+    public function testNormalization(): void
     {
-        $normalizer = $this
-            ->getMockBuilder('Symfony\Component\Serializer\Normalizer\NormalizerInterface')
-            ->getMock();
+        $normalizer = $this->createMock(NormalizerInterface::class);
         $innerHit = $this
-            ->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')
-            ->setMethods(['getName', 'toArray', 'getType'])
+            ->getMockBuilder(BuilderInterface::class)
+            ->addMethods(['getName'])
+            ->onlyMethods(['toArray', 'getType'])
             ->getMock();
         $innerHit->expects($this->any())->method('getName')->willReturn('foo');
         $innerHit->expects($this->any())->method('toArray')->willReturn(['foo' => 'bar']);
 
         $endpoint = new InnerHitsEndpoint();
         $endpoint->add($innerHit, 'foo');
+
         $expected = [
             'foo' => [
                 'foo' => 'bar'
diff --git a/tests/Unit/SearchEndpoint/PostFilterEndpointTest.php b/tests/Unit/SearchEndpoint/PostFilterEndpointTest.php
index 36adfc3e6e29dff29981472bcfe9783020db9077..c6993d51857abb143f66dbab376fd564dbb4444c 100644
--- a/tests/Unit/SearchEndpoint/PostFilterEndpointTest.php
+++ b/tests/Unit/SearchEndpoint/PostFilterEndpointTest.php
@@ -11,28 +11,28 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Unit\SearchEndpoint;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\MatchAllQuery;
 use ONGR\ElasticsearchDSL\SearchEndpoint\PostFilterEndpoint;
 use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
-use PHPUnit_Framework_MockObject_MockObject as MockObject;
 
 /**
  * Class PostFilterEndpointTest.
  */
-class PostFilterEndpointTest extends \PHPUnit\Framework\TestCase
+class PostFilterEndpointTest extends TestCase
 {
     /**
      * Tests constructor.
      */
-    public function testItCanBeInstantiated()
+    public function testItCanBeInstantiated(): void
     {
-        $this->assertInstanceOf('ONGR\ElasticsearchDSL\SearchEndpoint\PostFilterEndpoint', new PostFilterEndpoint());
+        $this->assertInstanceOf(PostFilterEndpoint::class, new PostFilterEndpoint());
     }
 
     /**
      * Tests if correct order is returned. It's very important that filters must be executed second.
      */
-    public function testGetOrder()
+    public function testGetOrder(): void
     {
         $instance = new PostFilterEndpoint();
         $this->assertEquals(1, $instance->getOrder());
@@ -41,12 +41,12 @@ class PostFilterEndpointTest extends \PHPUnit\Framework\TestCase
     /**
      * Test normalization.
      */
-    public function testNormalization()
+    public function testNormalization(): void
     {
         $instance = new PostFilterEndpoint();
         /** @var NormalizerInterface|MockObject $normalizerInterface */
         $normalizerInterface = $this->getMockForAbstractClass(
-            'Symfony\Component\Serializer\Normalizer\NormalizerInterface'
+            NormalizerInterface::class
         );
         $this->assertNull($instance->normalize($normalizerInterface));
 
@@ -54,21 +54,22 @@ class PostFilterEndpointTest extends \PHPUnit\Framework\TestCase
         $instance->add($matchAll);
 
         $this->assertEquals(
-            json_encode($matchAll->toArray()),
-            json_encode($instance->normalize($normalizerInterface))
+            json_encode($matchAll->toArray(), JSON_THROW_ON_ERROR),
+            json_encode($instance->normalize($normalizerInterface), JSON_THROW_ON_ERROR)
         );
     }
 
     /**
      * Tests if endpoint returns builders.
      */
-    public function testEndpointGetter()
+    public function testEndpointGetter(): void
     {
         $filterName = 'acme_post_filter';
         $filter = new MatchAllQuery();
 
         $endpoint = new PostFilterEndpoint();
         $endpoint->add($filter, $filterName);
+
         $builders = $endpoint->getAll();
 
         $this->assertCount(1, $builders);
diff --git a/tests/Unit/SearchEndpoint/QueryEndpointTest.php b/tests/Unit/SearchEndpoint/QueryEndpointTest.php
index 5d28e152dcaf4476d0318d4fa6c973ef1bdde308..4ce4a8e562b2ad6537fa418fd17d3bbf970fc88b 100644
--- a/tests/Unit/SearchEndpoint/QueryEndpointTest.php
+++ b/tests/Unit/SearchEndpoint/QueryEndpointTest.php
@@ -11,28 +11,28 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Unit\SearchEndpoint;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\MatchAllQuery;
 use ONGR\ElasticsearchDSL\SearchEndpoint\QueryEndpoint;
-use PHPUnit_Framework_MockObject_MockObject as MockObject;
 use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
 
 /**
  * Unit test class for the QueryEndpoint.
  */
-class QueryEndpointTest extends \PHPUnit\Framework\TestCase
+class QueryEndpointTest extends TestCase
 {
     /**
      * Tests constructor.
      */
-    public function testItCanBeInstantiated()
+    public function testItCanBeInstantiated(): void
     {
-        $this->assertInstanceOf('ONGR\ElasticsearchDSL\SearchEndpoint\QueryEndpoint', new QueryEndpoint());
+        $this->assertInstanceOf(QueryEndpoint::class, new QueryEndpoint());
     }
 
     /**
      * Tests if correct order is returned. Query must be executed after filter and post filter.
      */
-    public function testGetOrder()
+    public function testGetOrder(): void
     {
         $instance = new QueryEndpoint();
         $this->assertEquals(2, $instance->getOrder());
@@ -41,12 +41,12 @@ class QueryEndpointTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if endpoint return correct normalized data.
      */
-    public function testEndpoint()
+    public function testEndpoint(): void
     {
         $instance = new QueryEndpoint();
         /** @var NormalizerInterface|MockObject $normalizerInterface */
         $normalizerInterface = $this->getMockForAbstractClass(
-            'Symfony\Component\Serializer\Normalizer\NormalizerInterface'
+            NormalizerInterface::class
         );
 
         $this->assertNull($instance->normalize($normalizerInterface));
@@ -63,12 +63,13 @@ class QueryEndpointTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if endpoint returns builders.
      */
-    public function testEndpointGetter()
+    public function testEndpointGetter(): void
     {
         $queryName = 'acme_query';
         $query = new MatchAllQuery();
         $endpoint = new QueryEndpoint();
         $endpoint->add($query, $queryName);
+
         $builders = $endpoint->getAll();
 
         $this->assertCount(1, $builders);
diff --git a/tests/Unit/SearchEndpoint/SearchEndpointFactoryTest.php b/tests/Unit/SearchEndpoint/SearchEndpointFactoryTest.php
index b33028bbdf6758800d49587377287e9e6eb8cc68..e81263e53a557f405db6678c04413f2f9365456b 100644
--- a/tests/Unit/SearchEndpoint/SearchEndpointFactoryTest.php
+++ b/tests/Unit/SearchEndpoint/SearchEndpointFactoryTest.php
@@ -11,28 +11,30 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Unit\SearchEndpoint;
 
+use PHPUnit\Framework\Attributes\DoesNotPerformAssertions;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\SearchEndpoint\AggregationsEndpoint;
 use ONGR\ElasticsearchDSL\SearchEndpoint\SearchEndpointFactory;
 
 /**
  * Unit test class for search endpoint factory.
  */
-class SearchEndpointFactoryTest extends \PHPUnit\Framework\TestCase
+class SearchEndpointFactoryTest extends TestCase
 {
     /**
      * Tests get method exception.
-     *
-     * @expectedException \RuntimeException
      */
-    public function testGet()
+    public function testGet(): void
     {
+        $this->expectException(\RuntimeException::class);
         SearchEndpointFactory::get('foo');
     }
 
     /**
      * Tests if factory can create endpoint.
      */
-    public function testFactory()
+    #[DoesNotPerformAssertions]
+    public function testFactory(): void
     {
         SearchEndpointFactory::get(AggregationsEndpoint::NAME);
     }
diff --git a/tests/Unit/SearchEndpoint/SortEndpointTest.php b/tests/Unit/SearchEndpoint/SortEndpointTest.php
index 7f825bcfd9c438d0e87e9444242108668774d49c..3af8d44a31bb1fbe52bb4e56f9913b8c45b7f3d0 100644
--- a/tests/Unit/SearchEndpoint/SortEndpointTest.php
+++ b/tests/Unit/SearchEndpoint/SortEndpointTest.php
@@ -11,37 +11,38 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Unit\SearchEndpoint;
 
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\SearchEndpoint\SortEndpoint;
 use ONGR\ElasticsearchDSL\Sort\FieldSort;
-use PHPUnit_Framework_MockObject_MockObject as MockObject;
 use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
 
 /**
  * Class SortEndpointTest.
  */
-class SortEndpointTest extends \PHPUnit\Framework\TestCase
+class SortEndpointTest extends TestCase
 {
     /**
      * Tests constructor.
      */
-    public function testItCanBeInstantiated()
+    public function testItCanBeInstantiated(): void
     {
-        $this->assertInstanceOf('ONGR\ElasticsearchDSL\SearchEndpoint\SortEndpoint', new SortEndpoint());
+        $this->assertInstanceOf(SortEndpoint::class, new SortEndpoint());
     }
 
     /**
      * Tests endpoint normalization.
      */
-    public function testNormalize()
+    public function testNormalize(): void
     {
         $instance = new SortEndpoint();
 
         /** @var NormalizerInterface|MockObject $normalizerInterface */
         $normalizerInterface = $this->getMockForAbstractClass(
-            'Symfony\Component\Serializer\Normalizer\NormalizerInterface'
+            NormalizerInterface::class
         );
 
-        $sort = new FieldSort('acme', ['order' => FieldSort::ASC]);
+        $sort = new FieldSort('acme', FieldSort::ASC);
         $instance->add($sort);
 
         $this->assertEquals(
@@ -53,12 +54,13 @@ class SortEndpointTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests if endpoint returns builders.
      */
-    public function testEndpointGetter()
+    public function testEndpointGetter(): void
     {
         $sortName = 'acme_sort';
         $sort = new FieldSort('acme');
         $endpoint = new SortEndpoint();
         $endpoint->add($sort, $sortName);
+
         $builders = $endpoint->getAll();
 
         $this->assertCount(1, $builders);
diff --git a/tests/Unit/SearchEndpoint/SuggestEndpointTest.php b/tests/Unit/SearchEndpoint/SuggestEndpointTest.php
index 34c8704ba5b080ddf065d990381d3512cca66658..00dc30777ef2e504df8f341f6479e8f498aa88f1 100644
--- a/tests/Unit/SearchEndpoint/SuggestEndpointTest.php
+++ b/tests/Unit/SearchEndpoint/SuggestEndpointTest.php
@@ -11,31 +11,32 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Unit\SearchEndpoint;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\SearchEndpoint\SuggestEndpoint;
 use ONGR\ElasticsearchDSL\Suggest\Suggest;
-use PHPUnit_Framework_MockObject_MockObject as MockObject;
 use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
 
-class SuggestEndpointTest extends \PHPUnit\Framework\TestCase
+class SuggestEndpointTest extends TestCase
 {
     /**
      * Tests constructor.
      */
-    public function testItCanBeInstantiated()
+    public function testItCanBeInstantiated(): void
     {
-        $this->assertInstanceOf('ONGR\ElasticsearchDSL\SearchEndpoint\SuggestEndpoint', new SuggestEndpoint());
+        $this->assertInstanceOf(SuggestEndpoint::class, new SuggestEndpoint());
     }
 
     /**
      * Tests if endpoint returns builders.
      */
-    public function testEndpointGetter()
+    public function testEndpointGetter(): void
     {
         $suggestName = 'acme_suggest';
         $text = 'foo';
         $suggest = new Suggest($suggestName, 'text', $text, 'acme');
         $endpoint = new SuggestEndpoint();
         $endpoint->add($suggest, $suggestName);
+
         $builders = $endpoint->getAll();
 
         $this->assertCount(1, $builders);
@@ -45,13 +46,13 @@ class SuggestEndpointTest extends \PHPUnit\Framework\TestCase
     /**
      * Tests endpoint normalization.
      */
-    public function testNormalize()
+    public function testNormalize(): void
     {
         $instance = new SuggestEndpoint();
 
         /** @var NormalizerInterface|MockObject $normalizerInterface */
         $normalizerInterface = $this->getMockForAbstractClass(
-            'Symfony\Component\Serializer\Normalizer\NormalizerInterface'
+            NormalizerInterface::class
         );
 
         $suggest = new Suggest('foo', 'bar', 'acme', 'foo');
diff --git a/tests/Unit/SearchTest.php b/tests/Unit/SearchTest.php
index bfb2f4d3b5df5ec4c64777a52b60db3ccea0adc2..1c0a291674ee89744190713458c520d94981601c 100644
--- a/tests/Unit/SearchTest.php
+++ b/tests/Unit/SearchTest.php
@@ -11,6 +11,7 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\ExistsQuery;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
 use ONGR\ElasticsearchDSL\Search;
@@ -20,17 +21,17 @@ use ONGR\ElasticsearchDSL\Suggest\Suggest;
 /**
  * Test for Search.
  */
-class SearchTest extends \PHPUnit\Framework\TestCase
+class SearchTest extends TestCase
 {
     /**
      * Tests Search constructor.
      */
-    public function testItCanBeInstantiated()
+    public function testItCanBeInstantiated(): void
     {
-        $this->assertInstanceOf('ONGR\ElasticsearchDSL\Search', new Search());
+        $this->assertInstanceOf(Search::class, new Search());
     }
 
-    public function testScrollUriParameter()
+    public function testScrollUriParameter(): void
     {
         $search = new Search();
         $search->setScroll('5m');
diff --git a/tests/Unit/Sort/FieldSortTest.php b/tests/Unit/Sort/FieldSortTest.php
index d8863785feb47ad38d5aef35c635cc98f81d9503..5ec31c060db885770cdd8b246d2a31b2a8c4e675 100644
--- a/tests/Unit/Sort/FieldSortTest.php
+++ b/tests/Unit/Sort/FieldSortTest.php
@@ -11,17 +11,18 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Sort;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
 use ONGR\ElasticsearchDSL\Sort\FieldSort;
 use ONGR\ElasticsearchDSL\Sort\NestedSort;
 
-class FieldSortTest extends \PHPUnit\Framework\TestCase
+class FieldSortTest extends TestCase
 {
     /**
      * Test for toArray() method.
      *
      */
-    public function testToArray()
+    public function testToArray(): void
     {
         $nestedFilter = new NestedSort('somePath', new TermQuery('somePath.id', 10));
         $sort = new FieldSort('someField', 'asc');
diff --git a/tests/Unit/Sort/NestedSortTest.php b/tests/Unit/Sort/NestedSortTest.php
index 5fb970f19326a8f1d5ef5911b24f97b4ba15b632..3bbfe8b2045e4b008681be4195ed2c6463258074 100644
--- a/tests/Unit/Sort/NestedSortTest.php
+++ b/tests/Unit/Sort/NestedSortTest.php
@@ -11,16 +11,17 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Sort;
 
+use PHPUnit\Framework\TestCase;
 use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
 use ONGR\ElasticsearchDSL\Sort\NestedSort;
 
-class NestedSortTest extends \PHPUnit\Framework\TestCase
+class NestedSortTest extends TestCase
 {
     /**
      * Test for single nested.
      *
      */
-    public function testSingle()
+    public function testSingle(): void
     {
         $query = new NestedSort('somePath', new TermQuery('somePath.id', 10));
         $expected = [
@@ -39,7 +40,7 @@ class NestedSortTest extends \PHPUnit\Framework\TestCase
      * Test for single nested, no filter.
      *
      */
-    public function testNoFilter()
+    public function testNoFilter(): void
     {
         $query = new NestedSort('somePath');
         $expected = [
@@ -53,7 +54,7 @@ class NestedSortTest extends \PHPUnit\Framework\TestCase
      * Test for single nested.
      *
      */
-    public function testMultipleNesting()
+    public function testMultipleNesting(): void
     {
         $query = new NestedSort('somePath', new TermQuery('somePath.id', 10));
         $nestedFilter1 = new NestedSort('secondPath', new TermQuery('secondPath.foo', 'bar'));
diff --git a/tests/Unit/Suggest/SuggestTest.php b/tests/Unit/Suggest/SuggestTest.php
index 7ae17892bd8131ba4d52b22212bc81a15d8764dd..3ba31b97df6552d0c02d53cd4c7de0b4fa329779 100644
--- a/tests/Unit/Suggest/SuggestTest.php
+++ b/tests/Unit/Suggest/SuggestTest.php
@@ -11,14 +11,16 @@
 
 namespace ONGR\ElasticsearchDSL\Tests\Unit\Suggest;
 
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\Attributes\DataProvider;
 use ONGR\ElasticsearchDSL\Suggest\Suggest;
 
-class SuggestTest extends \PHPUnit\Framework\TestCase
+class SuggestTest extends TestCase
 {
     /**
      * Tests getType method.
      */
-    public function testSuggestGetType()
+    public function testSuggestGetType(): void
     {
         $suggest = new Suggest('foo', 'term', 'acme', 'bar');
         $this->assertEquals('term', $suggest->getType());
@@ -29,7 +31,7 @@ class SuggestTest extends \PHPUnit\Framework\TestCase
      *
      * @return array[]
      */
-    public function getTestToArrayData()
+    public static function getTestToArrayData(): array
     {
         return [
             [
@@ -110,13 +112,8 @@ class SuggestTest extends \PHPUnit\Framework\TestCase
         ];
     }
 
-    /**
-     * @param Suggest $suggest
-     * @param array $expected
-     *
-     * @dataProvider getTestToArrayData()
-     */
-    public function testToArray(Suggest $suggest, array $expected)
+    #[DataProvider('getTestToArrayData')]
+    public function testToArray(Suggest $suggest, array $expected): void
     {
         $this->assertEquals($expected, $suggest->toArray());
     }