Completed
Push — master ( 7a2c62...76754f )
by Simonas
02:52 queued 01:18
created

Search::setSource()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
/*
4
 * This file is part of the ONGR package.
5
 *
6
 * (c) NFQ Technologies UAB <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace ONGR\ElasticsearchDSL;
13
14
use ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation;
15
use ONGR\ElasticsearchDSL\Highlight\Highlight;
16
use ONGR\ElasticsearchDSL\InnerHit\NestedInnerHit;
17
use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery;
18
use ONGR\ElasticsearchDSL\SearchEndpoint\AbstractSearchEndpoint;
19
use ONGR\ElasticsearchDSL\SearchEndpoint\AggregationsEndpoint;
20
use ONGR\ElasticsearchDSL\SearchEndpoint\HighlightEndpoint;
21
use ONGR\ElasticsearchDSL\SearchEndpoint\InnerHitsEndpoint;
22
use ONGR\ElasticsearchDSL\SearchEndpoint\PostFilterEndpoint;
23
use ONGR\ElasticsearchDSL\SearchEndpoint\QueryEndpoint;
24
use ONGR\ElasticsearchDSL\SearchEndpoint\SearchEndpointFactory;
25
use ONGR\ElasticsearchDSL\SearchEndpoint\SearchEndpointInterface;
26
use ONGR\ElasticsearchDSL\SearchEndpoint\SortEndpoint;
27
use ONGR\ElasticsearchDSL\Serializer\Normalizer\CustomReferencedNormalizer;
28
use ONGR\ElasticsearchDSL\Serializer\OrderedSerializer;
29
use Symfony\Component\Serializer\Normalizer\CustomNormalizer;
30
use ONGR\ElasticsearchDSL\SearchEndpoint\SuggestEndpoint;
31
32
/**
33
 * Search object that can be executed by a manager.
34
 */
35
class Search
36
{
37
    /**
38
     * If you don’t need to track the total number of hits at all you can improve
39
     * query times by setting this option to false. Defaults to true.
40
     *
41
     * @var bool
42
     */
43
    private $trackTotalHits;
44
45
    /**
46
     * To retrieve hits from a certain offset. Defaults to 0.
47
     *
48
     * @var int
49
     */
50
    private $from;
51
52
    /**
53
     * The number of hits to return. Defaults to 10. If you do not care about getting some
54
     * hits back but only about the number of matches and/or aggregations, setting the value
55
     * to 0 will help performance.
56
     *
57
     * @var int
58
     */
59
    private $size;
60
61
    /**
62
     * Allows to control how the _source field is returned with every hit. By default
63
     * operations return the contents of the _source field unless you have used the
64
     * stored_fields parameter or if the _source field is disabled.
65
     *
66
     * @var bool
67
     */
68
    private $source;
69
70
    /**
71
     * Allows to selectively load specific stored fields for each document represented by a search hit.
72
     *
73
     * @var array
74
     */
75
    private $storedFields;
76
77
    /**
78
     * Allows to return a script evaluation (based on different fields) for each hit.
79
     * Script fields can work on fields that are not stored, and allow to return custom
80
     * values to be returned (the evaluated value of the script). Script fields can
81
     * also access the actual _source document indexed and extract specific elements
82
     * to be returned from it (can be an "object" type).
83
     *
84
     * @var array
85
     */
86
    private $scriptFields;
87
88
    /**
89
     * Allows to return the doc value representation of a field for each hit. Doc value
90
     * fields can work on fields that are not stored. Note that if the fields parameter
91
     * specifies fields without docvalues it will try to load the value from the fielddata
92
     * cache causing the terms for that field to be loaded to memory (cached), which will
93
     * result in more memory consumption.
94
     *
95
     * @var array
96
     */
97
    private $docValueFields;
98
99
    /**
100
     * Enables explanation for each hit on how its score was computed.
101
     *
102
     * @var bool
103
     */
104
    private $explain;
105
106
    /**
107
     * Returns a version for each search hit.
108
     *
109
     * @var bool
110
     */
111
    private $version;
112
113
    /**
114
     * Allows to configure different boost level per index when searching across more
115
     * than one indices. This is very handy when hits coming from one index matter more
116
     * than hits coming from another index (think social graph where each user has an index).
117
     *
118
     * @var array
119
     */
120
    private $indicesBoost;
121
122
    /**
123
     * Exclude documents which have a _score less than the minimum specified in min_score.
124
     *
125
     * @var int
126
     */
127
    private $minScore;
128
129
    /**
130
     * Pagination of results can be done by using the from and size but the cost becomes
131
     * prohibitive when the deep pagination is reached. The index.max_result_window which
132
     * defaults to 10,000 is a safeguard, search requests take heap memory and time
133
     * proportional to from + size. The Scroll api is recommended for efficient deep
134
     * scrolling but scroll contexts are costly and it is not recommended to use it for
135
     * real time user requests. The search_after parameter circumvents this problem by
136
     * providing a live cursor. The idea is to use the results from the previous page to
137
     * help the retrieval of the next page.
138
     *
139
     * @var array
140
     */
141
    private $searchAfter;
142
143
    /**
144
     * URI parameters alongside Request body search.
145
     *
146
     * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html
147
     *
148
     * @var array
149
     */
150
    private $uriParams = [];
151
152
    /**
153
     * While a search request returns a single “page” of results, the scroll API can be used to retrieve
154
     * large numbers of results (or even all results) from a single search request, in much the same way
155
     * as you would use a cursor on a traditional database. Scrolling is not intended for real time user
156
     * requests, but rather for processing large amounts of data, e.g. in order to reindex the contents
157
     * of one index into a new index with a different configuration.
158
     *
159
     * @var string
160
     */
161
    private $scroll;
162
163
    /**
164
     * @var OrderedSerializer
165
     */
166
    private static $serializer;
167
168
    /**
169
     * @var SearchEndpointInterface[]
170
     */
171
    private $endpoints = [];
172
173
    /**
174
     * Initializes serializer.
175
     */
176
    public function __construct()
177
    {
178
        if (static::$serializer === null) {
0 ignored issues
show
Bug introduced by
Since $serializer is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $serializer to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
179
            static::$serializer = new OrderedSerializer(
0 ignored issues
show
Bug introduced by
Since $serializer is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $serializer to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
180
                [
181
                    new CustomReferencedNormalizer(),
182
                    new CustomNormalizer(),
183
                ]
184
            );
185
        }
186
    }
187
188
    /**
189
     * Destroys search endpoint.
190
     *
191
     * @param string $type Endpoint type.
192
     */
193
    public function destroyEndpoint($type)
194
    {
195
        unset($this->endpoints[$type]);
196
    }
197
198
    /**
199
     * Adds query to the search.
200
     *
201
     * @param BuilderInterface $query
202
     * @param string           $boolType
203
     * @param string           $key
204
     *
205
     * @return $this
206
     */
207
    public function addQuery(BuilderInterface $query, $boolType = BoolQuery::MUST, $key = null)
208
    {
209
        $endpoint = $this->getEndpoint(QueryEndpoint::NAME);
210
        $endpoint->addToBool($query, $boolType, $key);
0 ignored issues
show
Documentation introduced by
$boolType is of type string, but the function expects a array|null.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Bug introduced by
It seems like $key defined by parameter $key on line 207 can also be of type string; however, ONGR\ElasticsearchDSL\Se...tInterface::addToBool() does only seem to accept array|null, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
211
212
        return $this;
213
    }
214
215
    /**
216
     * Returns endpoint instance.
217
     *
218
     * @param string $type Endpoint type.
219
     *
220
     * @return SearchEndpointInterface
221
     */
222
    private function getEndpoint($type)
223
    {
224
        if (!array_key_exists($type, $this->endpoints)) {
225
            $this->endpoints[$type] = SearchEndpointFactory::get($type);
226
        }
227
228
        return $this->endpoints[$type];
229
    }
230
231
    /**
232
     * Returns queries inside BoolQuery instance.
233
     *
234
     * @return BuilderInterface
235
     */
236
    public function getQueries()
237
    {
238
        $endpoint = $this->getEndpoint(QueryEndpoint::NAME);
239
240
        return $endpoint->getBool();
241
    }
242
243
    /**
244
     * Sets query endpoint parameters.
245
     *
246
     * @param array $parameters
247
     *
248
     * @return $this
249
     */
250
    public function setQueryParameters(array $parameters)
251
    {
252
        $this->setEndpointParameters(QueryEndpoint::NAME, $parameters);
253
254
        return $this;
255
    }
256
257
    /**
258
     * Sets parameters to the endpoint.
259
     *
260
     * @param string $endpointName
261
     * @param array  $parameters
262
     */
263
    public function setEndpointParameters($endpointName, array $parameters)
264
    {
265
        /** @var AbstractSearchEndpoint $endpoint */
266
        $endpoint = $this->getEndpoint($endpointName);
267
        $endpoint->setParameters($parameters);
268
    }
269
270
    /**
271
     * Adds a post filter to search.
272
     *
273
     * @param BuilderInterface $filter   Filter.
274
     * @param string           $boolType Example boolType values:
275
     *                                   - must
276
     *                                   - must_not
277
     *                                   - should.
278
     * @param string           $key
279
     *
280
     * @return $this.
0 ignored issues
show
Documentation introduced by
The doc-type $this. could not be parsed: Unknown type name "$this." at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
281
     */
282
    public function addPostFilter(BuilderInterface $filter, $boolType = BoolQuery::MUST, $key = null)
283
    {
284
        $this
285
            ->getEndpoint(PostFilterEndpoint::NAME)
286
            ->addToBool($filter, $boolType, $key);
0 ignored issues
show
Documentation introduced by
$boolType is of type string, but the function expects a array|null.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Bug introduced by
It seems like $key defined by parameter $key on line 282 can also be of type string; however, ONGR\ElasticsearchDSL\Se...tInterface::addToBool() does only seem to accept array|null, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
287
288
        return $this;
289
    }
290
291
    /**
292
     * Returns queries inside BoolFilter instance.
293
     *
294
     * @return BuilderInterface
295
     */
296
    public function getPostFilters()
297
    {
298
        $endpoint = $this->getEndpoint(PostFilterEndpoint::NAME);
299
300
        return $endpoint->getBool();
301
    }
302
303
    /**
304
     * Sets post filter endpoint parameters.
305
     *
306
     * @param array $parameters
307
     *
308
     * @return $this
309
     */
310
    public function setPostFilterParameters(array $parameters)
311
    {
312
        $this->setEndpointParameters(PostFilterEndpoint::NAME, $parameters);
313
314
        return $this;
315
    }
316
317
    /**
318
     * Adds aggregation into search.
319
     *
320
     * @param AbstractAggregation $aggregation
321
     *
322
     * @return $this
323
     */
324
    public function addAggregation(AbstractAggregation $aggregation)
325
    {
326
        $this->getEndpoint(AggregationsEndpoint::NAME)->add($aggregation, $aggregation->getName());
327
328
        return $this;
329
    }
330
331
    /**
332
     * Returns all aggregations.
333
     *
334
     * @return BuilderInterface[]
335
     */
336
    public function getAggregations()
337
    {
338
        return $this->getEndpoint(AggregationsEndpoint::NAME)->getAll();
339
    }
340
341
    /**
342
     * Adds inner hit into search.
343
     *
344
     * @param NestedInnerHit $innerHit
345
     *
346
     * @return $this
347
     */
348
    public function addInnerHit(NestedInnerHit $innerHit)
349
    {
350
        $this->getEndpoint(InnerHitsEndpoint::NAME)->add($innerHit, $innerHit->getName());
351
352
        return $this;
353
    }
354
355
    /**
356
     * Returns all inner hits.
357
     *
358
     * @return BuilderInterface[]
359
     */
360
    public function getInnerHits()
361
    {
362
        return $this->getEndpoint(InnerHitsEndpoint::NAME)->getAll();
363
    }
364
365
    /**
366
     * Adds sort to search.
367
     *
368
     * @param BuilderInterface $sort
369
     *
370
     * @return $this
371
     */
372
    public function addSort(BuilderInterface $sort)
373
    {
374
        $this->getEndpoint(SortEndpoint::NAME)->add($sort);
375
376
        return $this;
377
    }
378
379
    /**
380
     * Returns all set sorts.
381
     *
382
     * @return BuilderInterface[]
383
     */
384
    public function getSorts()
385
    {
386
        return $this->getEndpoint(SortEndpoint::NAME)->getAll();
387
    }
388
389
    /**
390
     * Allows to highlight search results on one or more fields.
391
     *
392
     * @param Highlight $highlight
393
     *
394
     * @return $this.
0 ignored issues
show
Documentation introduced by
The doc-type $this. could not be parsed: Unknown type name "$this." at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
395
     */
396
    public function addHighlight($highlight)
397
    {
398
        $this->getEndpoint(HighlightEndpoint::NAME)->add($highlight);
399
400
        return $this;
401
    }
402
403
    /**
404
     * Returns highlight builder.
405
     *
406
     * @return BuilderInterface
407
     */
408
    public function getHighlights()
409
    {
410
        /** @var HighlightEndpoint $highlightEndpoint */
411
        $highlightEndpoint = $this->getEndpoint(HighlightEndpoint::NAME);
412
413
        return $highlightEndpoint->getHighlight();
414
    }
415
416
    /**
417
    * Adds suggest into search.
418
    *
419
    * @param BuilderInterface $suggest
420
    *
421
    * @return $this
422
    */
423
    public function addSuggest(NamedBuilderInterface $suggest)
424
    {
425
        $this->getEndpoint(SuggestEndpoint::NAME)->add($suggest, $suggest->getName());
0 ignored issues
show
Documentation introduced by
$suggest->getName() is of type string, but the function expects a array|null.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
426
427
        return $this;
428
    }
429
430
    /**
431
    * Returns all suggests.
432
    *
433
    * @return BuilderInterface[]
434
    */
435
    public function getSuggests()
436
    {
437
        return $this->getEndpoint(SuggestEndpoint::NAME)->getAll();
438
    }
439
440
    /**
441
     * @return int
442
     */
443
    public function getFrom()
444
    {
445
        return $this->from;
446
    }
447
448
    /**
449
     * @param int $from
450
     * @return $this
451
     */
452
    public function setFrom($from)
453
    {
454
        $this->from = $from;
455
        return $this;
456
    }
457
458
    /**
459
     * @return bool
460
     */
461
    public function isTrackTotalHits()
462
    {
463
        return $this->trackTotalHits;
464
    }
465
466
    /**
467
     * @param bool $trackTotalHits
468
     * @return $this
469
     */
470
    public function setTrackTotalHits(bool $trackTotalHits)
471
    {
472
        $this->trackTotalHits = $trackTotalHits;
473
        return $this;
474
    }
475
476
    /**
477
     * @return int
478
     */
479
    public function getSize()
480
    {
481
        return $this->size;
482
    }
483
484
    /**
485
     * @param int $size
486
     * @return $this
487
     */
488
    public function setSize($size)
489
    {
490
        $this->size = $size;
491
        return $this;
492
    }
493
494
    /**
495
     * @return bool
496
     */
497
    public function isSource()
498
    {
499
        return $this->source;
500
    }
501
502
    /**
503
     * @param bool $source
504
     * @return $this
505
     */
506
    public function setSource($source)
507
    {
508
        $this->source = $source;
509
        return $this;
510
    }
511
512
    /**
513
     * @return array
514
     */
515
    public function getStoredFields()
516
    {
517
        return $this->storedFields;
518
    }
519
520
    /**
521
     * @param array $storedFields
522
     * @return $this
523
     */
524
    public function setStoredFields($storedFields)
525
    {
526
        $this->storedFields = $storedFields;
527
        return $this;
528
    }
529
530
    /**
531
     * @return array
532
     */
533
    public function getScriptFields()
534
    {
535
        return $this->scriptFields;
536
    }
537
538
    /**
539
     * @param array $scriptFields
540
     * @return $this
541
     */
542
    public function setScriptFields($scriptFields)
543
    {
544
        $this->scriptFields = $scriptFields;
545
        return $this;
546
    }
547
548
    /**
549
     * @return array
550
     */
551
    public function getDocValueFields()
552
    {
553
        return $this->docValueFields;
554
    }
555
556
    /**
557
     * @param array $docValueFields
558
     * @return $this
559
     */
560
    public function setDocValueFields($docValueFields)
561
    {
562
        $this->docValueFields = $docValueFields;
563
        return $this;
564
    }
565
566
    /**
567
     * @return bool
568
     */
569
    public function isExplain()
570
    {
571
        return $this->explain;
572
    }
573
574
    /**
575
     * @param bool $explain
576
     * @return $this
577
     */
578
    public function setExplain($explain)
579
    {
580
        $this->explain = $explain;
581
        return $this;
582
    }
583
584
    /**
585
     * @return bool
586
     */
587
    public function isVersion()
588
    {
589
        return $this->version;
590
    }
591
592
    /**
593
     * @param bool $version
594
     * @return $this
595
     */
596
    public function setVersion($version)
597
    {
598
        $this->version = $version;
599
        return $this;
600
    }
601
602
    /**
603
     * @return array
604
     */
605
    public function getIndicesBoost()
606
    {
607
        return $this->indicesBoost;
608
    }
609
610
    /**
611
     * @param array $indicesBoost
612
     * @return $this
613
     */
614
    public function setIndicesBoost($indicesBoost)
615
    {
616
        $this->indicesBoost = $indicesBoost;
617
        return $this;
618
    }
619
620
    /**
621
     * @return int
622
     */
623
    public function getMinScore()
624
    {
625
        return $this->minScore;
626
    }
627
628
    /**
629
     * @param int $minScore
630
     * @return $this
631
     */
632
    public function setMinScore($minScore)
633
    {
634
        $this->minScore = $minScore;
635
        return $this;
636
    }
637
638
    /**
639
     * @return array
640
     */
641
    public function getSearchAfter()
642
    {
643
        return $this->searchAfter;
644
    }
645
646
    /**
647
     * @param array $searchAfter
648
     * @return $this
649
     */
650
    public function setSearchAfter($searchAfter)
651
    {
652
        $this->searchAfter = $searchAfter;
653
        return $this;
654
    }
655
656
    /**
657
     * @return string
658
     */
659
    public function getScroll()
660
    {
661
        return $this->scroll;
662
    }
663
664
    /**
665
     * @param string $scroll
666
     * @return $this
667
     */
668
    public function setScroll($scroll = '5m')
669
    {
670
        $this->scroll = $scroll;
671
672
        $this->addUriParam('scroll', $this->scroll);
673
674
        return $this;
675
    }
676
677
    /**
678
     * @param string $name
679
     * @param string|array|bool $value
680
     *
681
     * @return $this
682
     */
683
    public function addUriParam($name, $value)
684
    {
685
        if (in_array($name, [
686
            'q',
687
            'df',
688
            'analyzer',
689
            'analyze_wildcard',
690
            'default_operator',
691
            'lenient',
692
            'explain',
693
            '_source',
694
            '_source_exclude',
695
            '_source_include',
696
            'stored_fields',
697
            'sort',
698
            'track_scores',
699
            'timeout',
700
            'terminate_after',
701
            'from',
702
            'size',
703
            'search_type',
704
            'scroll',
705
            'allow_no_indices',
706
            'ignore_unavailable',
707
            'typed_keys',
708
            'pre_filter_shard_size',
709
            'ignore_unavailable',
710
        ])) {
711
            $this->uriParams[$name] = $value;
712
        } else {
713
            throw new \InvalidArgumentException(sprintf('Parameter %s is not supported.', $value));
714
        }
715
716
        return $this;
717
    }
718
719
    /**
720
     * Returns query url parameters.
721
     *
722
     * @return array
723
     */
724
    public function getUriParams()
725
    {
726
        return $this->uriParams;
727
    }
728
729
    /**
730
     * {@inheritdoc}
731
     */
732
    public function toArray()
733
    {
734
        $output = array_filter(static::$serializer->normalize($this->endpoints));
0 ignored issues
show
Bug introduced by
Since $serializer is declared private, accessing it with static will lead to errors in possible sub-classes; consider using self, or increasing the visibility of $serializer to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return static::$someVariable;
    }
}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass { }

YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class SomeClass
{
    private static $someVariable;

    public static function getSomeVariable()
    {
        return self::$someVariable; // self works fine with private.
    }
}
Loading history...
735
736
        $params = [
737
            'from' => 'from',
738
            'size' => 'size',
739
            'source' => '_source',
740
            'storedFields' => 'stored_fields',
741
            'scriptFields' => 'script_fields',
742
            'docValueFields' => 'docvalue_fields',
743
            'explain' => 'explain',
744
            'version' => 'version',
745
            'indicesBoost' => 'indices_boost',
746
            'minScore' => 'min_score',
747
            'searchAfter' => 'search_after',
748
            'trackTotalHits' => 'track_total_hits',
749
        ];
750
751
        foreach ($params as $field => $param) {
752
            if ($this->$field !== null) {
753
                $output[$param] = $this->$field;
754
            }
755
        }
756
757
        return $output;
758
    }
759
}
760