diff --git a/Query/FunctionScoreQuery.php b/Query/FunctionScoreQuery.php index ac22395c9774bc7e9226b9bfb3720cf37e60172f..d09cf6574cb5b97cc99fb3dc6d925e5ab5355407 100644 --- a/Query/FunctionScoreQuery.php +++ b/Query/FunctionScoreQuery.php @@ -24,6 +24,10 @@ class FunctionScoreQuery implements BuilderInterface use DslTypeAwareTrait; /** + * Query of filter. + * + * In Function score could be used query or filter. Use setDslType() to change type. + * * @var BuilderInterface */ private $query; @@ -35,13 +39,11 @@ class FunctionScoreQuery implements BuilderInterface /** * @param BuilderInterface $query - * @param array $functions * @param array $parameters */ - public function __construct(BuilderInterface $query, array $functions, array $parameters = []) + public function __construct(BuilderInterface $query, array $parameters = []) { $this->query = $query; - $this->functions = $functions; $this->setParameters($parameters); $this->setDslType('query'); } @@ -54,6 +56,167 @@ class FunctionScoreQuery implements BuilderInterface return 'function_score'; } + /** + * Modifier to apply filter to the function score function. + * + * @param array $function + * @param BuilderInterface $filter + */ + private function applyFilter(array &$function, BuilderInterface $filter = null) + { + if ($filter) { + $function['filter'] = [ + $filter->getType() => $filter->toArray(), + ]; + } + } + + /** + * Creates field_value_factor function. + * + * @param string $field + * @param float $factor + * @param string $modifier + * @param BuilderInterface $filter + * + * @return $this + */ + public function addFieldValueFactorFunction($field, $factor, $modifier, BuilderInterface $filter = null) + { + $function = [ + 'field_value_factor' => [ + 'field' => $field, + 'factor' => $factor, + 'modifier' => $modifier, + ], + ]; + + $this->applyFilter($function, $filter); + + $this->functions[] = $function; + + return $this; + } + + /** + * Add decay function to function score. Weight and filter are optional. + * + * @param string $type + * @param string $field + * @param array $function + * @param array $options + * @param BuilderInterface $filter + * + * @return $this + */ + public function addDecayFunction( + $type, + $field, + array $function, + array $options = [], + BuilderInterface $filter = null + ) { + $function = [ + $type => [ + $field => $function, + ], + $options + ]; + + $this->applyFilter($function, $filter); + + $this->functions[] = $function; + + return $this; + } + + /** + * Adds function to function score without decay function. Influence search score only for specific filter. + * + * @param float $weight + * @param BuilderInterface $filter + * + * @return $this + */ + public function addWeightFunction($weight, BuilderInterface $filter = null) + { + $function = [ + 'weight' => $weight, + ]; + + $this->applyFilter($function, $filter); + + $this->functions[] = $function; + + return $this; + } + + /** + * Adds random score function. Seed is optional. + * + * @param mixed $seed + * @param BuilderInterface $filter + * + * @return $this + */ + public function addRandomFunction($seed = null, BuilderInterface $filter = null) + { + $function = [ + 'random_score' => $seed ? [ 'seed' => $seed ] : [], + ]; + + $this->applyFilter($function, $filter); + + $this->functions[] = $function; + + return $this; + } + + /** + * Adds script score function. + * + * @param string $script + * @param array $params + * @param array $options + * @param BuilderInterface $filter + * + * @return $this + */ + public function addScriptScoreFunction( + $script, + array $params = [], + array $options = [], + BuilderInterface $filter = null + ) { + $function = [ + 'script_score' => [ + 'script' => $script, + 'params' => $params, + $options + ], + ]; + + $this->applyFilter($function, $filter); + + $this->functions[] = $function; + + return $this; + } + + /** + * Adds custom simple function. You can add to the array whatever you want. + * + * @param array $function + * + * @return $this + */ + public function addSimpleFunction(array $function) + { + $this->functions[] = $function; + + return $this; + } + /** * {@inheritdoc} */ @@ -63,7 +226,7 @@ class FunctionScoreQuery implements BuilderInterface strtolower($this->getDslType()) => [ $this->query->getType() => $this->query->toArray(), ], - 'functions' => [$this->functions], + 'functions' => $this->functions, ]; $output = $this->processArray($query);