Skip to content

Commit 8820e07

Browse files
authored
Merge pull request #172 from helitik/script-fields-query-support
Add script fields query support
2 parents 6935d9e + 1765c71 commit 8820e07

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ The builder supports various search parameters and provides a number of useful h
167167
* [trackScores](docs/available-methods.md#trackscores)
168168
* [trackTotalHits](docs/available-methods.md#tracktotalhits)
169169
* [when](docs/available-methods.md#when)
170+
* [scriptFields](docs/available-methods.md#scriptfields)
170171

171172
### Search Results
172173

docs/available-methods.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,3 +564,16 @@ $searchResult = Book::searchQuery($query)
564564
})
565565
->execute();
566566
```
567+
568+
### scriptFields
569+
570+
This method allows you to [write scripts](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-using.html):
571+
572+
```php
573+
$searchResult = Book::searchQuery($query)
574+
->scriptFields('title_length', [
575+
'lang' => 'painless',
576+
'source' => "doc['title'].value.length()",
577+
])
578+
->execute();
579+
```

src/Builders/SearchParametersBuilder.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class SearchParametersBuilder
6363
private ?bool $explain;
6464
private ?int $terminateAfter;
6565
private ?bool $requestCache;
66+
private array $scriptFields;
6667

6768
public function __construct(Model $model)
6869
{
@@ -321,6 +322,21 @@ public function requestCache(bool $requestCache): self
321322
return $this;
322323
}
323324

325+
public function scriptFieldsRaw(array $scriptFields): self
326+
{
327+
$this->scriptFields = $scriptFields;
328+
return $this;
329+
}
330+
331+
public function scriptFields(string $script, array $parameters): self
332+
{
333+
if (!isset($this->scriptFields)) {
334+
$this->scriptFields = [];
335+
}
336+
$this->scriptFields[$script] = ['script' => $parameters];
337+
return $this;
338+
}
339+
324340
public function buildSearchParameters(): SearchParameters
325341
{
326342
$searchParameters = new SearchParameters();
@@ -419,6 +435,10 @@ public function buildSearchParameters(): SearchParameters
419435
$searchParameters->requestCache($this->requestCache);
420436
}
421437

438+
if (isset($this->scriptFields)) {
439+
$searchParameters->scriptFields($this->scriptFields);
440+
}
441+
422442
return $searchParameters;
423443
}
424444

tests/Integration/Builders/SearchParametersBuilderTest.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,4 +652,51 @@ public function test_search_parameters_with_request_cache_can_be_built(): void
652652

653653
$this->assertEquals($expected, $actual);
654654
}
655+
656+
public function test_search_parameters_with_raw_script_fields_can_be_built(): void
657+
{
658+
$rawScriptFields = [
659+
'title_length' => [
660+
'script' => [
661+
'lang' => 'painless',
662+
'source' => "doc['title'].value.length()",
663+
],
664+
],
665+
];
666+
667+
$expected = (new SearchParameters())
668+
->indices([(new Book())->searchableAs()])
669+
->scriptFields($rawScriptFields);
670+
671+
$actual = (new SearchParametersBuilder(new Book()))
672+
->scriptFieldsRaw($rawScriptFields)
673+
->buildSearchParameters();
674+
675+
$this->assertEquals($expected, $actual);
676+
}
677+
678+
public function test_search_parameters_with_script_fields_can_be_built(): void
679+
{
680+
$scriptFields = [
681+
'title_length' => [
682+
'script' => [
683+
'lang' => 'painless',
684+
'source' => "doc['title'].value.length()",
685+
],
686+
],
687+
];
688+
689+
$expected = (new SearchParameters())
690+
->indices([(new Book())->searchableAs()])
691+
->scriptFields($scriptFields);
692+
693+
$actual = (new SearchParametersBuilder(new Book()))
694+
->scriptFields('title_length', [
695+
'lang' => 'painless',
696+
'source' => "doc['title'].value.length()",
697+
])
698+
->buildSearchParameters();
699+
700+
$this->assertEquals($expected, $actual);
701+
}
655702
}

0 commit comments

Comments
 (0)