From 1580be2b2d69110f0dbb32f841739235d5b4621a Mon Sep 17 00:00:00 2001 From: anodoor Date: Thu, 28 Mar 2019 14:52:14 +0100 Subject: [PATCH 1/5] add more complex sort option (geo_distance eg) --- src/Builders/FilterBuilder.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Builders/FilterBuilder.php b/src/Builders/FilterBuilder.php index f185eb7..9301631 100644 --- a/src/Builders/FilterBuilder.php +++ b/src/Builders/FilterBuilder.php @@ -401,6 +401,18 @@ public function orderBy($field, $direction = 'asc') return $this; } + /** + * Add complex sort array + * @param array $sort + * @return $this + */ + public function sort($sort) + { + $this->orders[] = $sort; + + return $this; + } + /** * Explain the request. * From 41fb278212afbb57aa8ce65976186f81bfd151f2 Mon Sep 17 00:00:00 2001 From: lefrancois Date: Thu, 28 Mar 2019 15:23:44 +0100 Subject: [PATCH 2/5] Update FilterBuilder.php --- src/Builders/FilterBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Builders/FilterBuilder.php b/src/Builders/FilterBuilder.php index 9301631..5c5e1a1 100644 --- a/src/Builders/FilterBuilder.php +++ b/src/Builders/FilterBuilder.php @@ -402,7 +402,7 @@ public function orderBy($field, $direction = 'asc') } /** - * Add complex sort array + * Add complex sort array. * @param array $sort * @return $this */ From f594ebffd262fefdad9facaef954042728089a90 Mon Sep 17 00:00:00 2001 From: lefrancois Date: Tue, 2 Apr 2019 16:58:20 +0200 Subject: [PATCH 3/5] Update ElasticEngine.php --- src/ElasticEngine.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ElasticEngine.php b/src/ElasticEngine.php index b373cb7..e6f2b89 100644 --- a/src/ElasticEngine.php +++ b/src/ElasticEngine.php @@ -324,6 +324,10 @@ public function map(Builder $builder, $results, $model) if (isset($hit['highlight'])) { $model->highlight = new Highlight($hit['highlight']); } + + if (isset($hit['sort'])) { + $model->sort = $hit['sort'][0]; + } return $model; } From 8dea32baf178d9ce3e919ec7f4686fa57cc03b07 Mon Sep 17 00:00:00 2001 From: anodoor Date: Fri, 28 Jun 2019 16:30:12 +0200 Subject: [PATCH 4/5] add function score --- src/Builders/FilterBuilder.php | 48 ++++++++++++++++++++++++++++++ src/ElasticEngine.php | 53 ++++++++++++++++++++++++++-------- 2 files changed, 89 insertions(+), 12 deletions(-) diff --git a/src/Builders/FilterBuilder.php b/src/Builders/FilterBuilder.php index 5c5e1a1..dbd83cb 100644 --- a/src/Builders/FilterBuilder.php +++ b/src/Builders/FilterBuilder.php @@ -16,6 +16,18 @@ class FilterBuilder extends Builder public $wheres = [ 'must' => [], 'must_not' => [], + 'should' => [], + ]; + + + /** + * The condition array. + * + * @var array + */ + public $functionScore = [ + 'query' => [], + 'functions' => [], ]; /** @@ -341,6 +353,42 @@ public function whereGeoBoundingBox($field, array $value) return $this; } + /** + * Add a whereShould condition. + * + * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-bounding-box-query.html Geo bounding box query + * + * @param string $field + * @param $value + * @return $this + */ + public function whereShould($field, $value) + { + $this->wheres['should'][] = [ + 'match' => [ + $field => $value + ], + ]; + + return $this; + } + + + /** + * Add a function scroe query + * + * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-bounding-box-query.html Geo bounding box query + * + * @param array $value + * @return $this + */ + public function whereFunctionScore($value) + { + $this->functionScore['functions'][] = $value; + + return $this; + } + /** * Add a whereGeoPolygon condition. * diff --git a/src/ElasticEngine.php b/src/ElasticEngine.php index e6f2b89..0400c98 100644 --- a/src/ElasticEngine.php +++ b/src/ElasticEngine.php @@ -106,13 +106,21 @@ public function buildSearchQueryPayloadCollection(Builder $builder, array $optio $payload = new TypePayload($builder->model); if (is_callable($rule)) { - $payload->setIfNotEmpty('body.query.bool', call_user_func($rule, $builder)); + if(count($builder->functionScore['functions']) === 0){ + $payload->setIfNotEmpty('body.query.bool', call_user_func($rule, $builder)); + }else{ + $payload->setIfNotEmpty('body.query', []); + } } else { /** @var SearchRule $ruleEntity */ $ruleEntity = new $rule($builder); if ($ruleEntity->isApplicable()) { - $payload->setIfNotEmpty('body.query.bool', $ruleEntity->buildQueryPayload()); + if(count($builder->functionScore['functions']) === 0){ + $payload->setIfNotEmpty('body.query.bool', $ruleEntity->buildQueryPayload()); + }else{ + $payload->setIfNotEmpty('body.query', []); + } if ($options['highlight'] ?? true) { $payload->setIfNotEmpty('body.highlight', $ruleEntity->buildHighlightPayload()); @@ -125,8 +133,13 @@ public function buildSearchQueryPayloadCollection(Builder $builder, array $optio $payloadCollection->push($payload); } } else { - $payload = (new TypePayload($builder->model)) - ->setIfNotEmpty('body.query.bool.must.match_all', new stdClass()); + if(count($builder->functionScore['functions']) === 0){ + $payload = (new TypePayload($builder->model)) + ->setIfNotEmpty('body.query.bool.must.match_all', new stdClass()); + }else{ + $payload = (new TypePayload($builder->model)) + ->setIfNotEmpty('body.query', []); + } $payloadCollection->push($payload); } @@ -141,16 +154,32 @@ public function buildSearchQueryPayloadCollection(Builder $builder, array $optio ->setIfNotNull('body.from', $builder->offset) ->setIfNotNull('body.size', $builder->limit); - foreach ($builder->wheres as $clause => $filters) { - $clauseKey = 'body.query.bool.filter.bool.'.$clause; + if(count($builder->functionScore['functions']) > 0){ + $payload->setIfNotEmpty('body.query.function_score', $builder->functionScore); + foreach ($builder->wheres as $clause => $filters) { + $clauseKey = 'body.query.function_score.query.bool.'.$clause; - $clauseValue = array_merge( - $payload->get($clauseKey, []), - $filters - ); + $clauseValue = array_merge( + $payload->get($clauseKey, []), + $filters + ); - $payload->setIfNotEmpty($clauseKey, $clauseValue); + $payload->setIfNotEmpty($clauseKey, $clauseValue); + } } + else{ + foreach ($builder->wheres as $clause => $filters) { + $clauseKey = 'body.query.bool.filter.bool.'.$clause; + + $clauseValue = array_merge( + $payload->get($clauseKey, []), + $filters + ); + + $payload->setIfNotEmpty($clauseKey, $clauseValue); + } + } + return $payload->get(); }); @@ -324,7 +353,7 @@ public function map(Builder $builder, $results, $model) if (isset($hit['highlight'])) { $model->highlight = new Highlight($hit['highlight']); } - + if (isset($hit['sort'])) { $model->sort = $hit['sort'][0]; } From 46435e1b1fbd020e7921f80bfae0fe09e6757870 Mon Sep 17 00:00:00 2001 From: anodoor Date: Wed, 31 Jul 2019 14:15:00 +0200 Subject: [PATCH 5/5] sort should be an array to get all results --- src/ElasticEngine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ElasticEngine.php b/src/ElasticEngine.php index 0400c98..008f267 100644 --- a/src/ElasticEngine.php +++ b/src/ElasticEngine.php @@ -355,7 +355,7 @@ public function map(Builder $builder, $results, $model) } if (isset($hit['sort'])) { - $model->sort = $hit['sort'][0]; + $model->sort = $hit['sort']; } return $model;