<?php /* * This file is part of the ONGR package. * * (c) NFQ Technologies UAB <info@nfq.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace ONGR\ElasticsearchBundle\DSL\Query; use ONGR\ElasticsearchBundle\DSL\BuilderInterface; use ONGR\ElasticsearchBundle\DSL\DslTypeAwareTrait; use ONGR\ElasticsearchBundle\DSL\ParametersTrait; /** * Elasticsearch function_score query class. */ class FunctionScoreQuery implements BuilderInterface { use ParametersTrait; use DslTypeAwareTrait; /** * Query of filter. * * In Function score could be used query or filter. Use setDslType() to change type. * * @var BuilderInterface */ private $query; /** * @var array[] */ private $functions; /** * @param BuilderInterface $query * @param array $parameters */ public function __construct(BuilderInterface $query, array $parameters = []) { $this->query = $query; $this->setParameters($parameters); $this->setDslType('query'); } /** * {@inheritdoc} */ public function getType() { 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} */ public function toArray() { $query = [ strtolower($this->getDslType()) => [ $this->query->getType() => $this->query->toArray(), ], 'functions' => $this->functions, ]; $output = $this->processArray($query); return $output; } }