From 01530f207ba72b3d196967cf4ab4a7dd76d5c86d Mon Sep 17 00:00:00 2001 From: Alex Kovtunov <582969@gmail.com> Date: Thu, 15 Aug 2019 14:18:29 +0400 Subject: [PATCH 1/7] aggregation --- src/Builders/FilterBuilder.php | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/Builders/FilterBuilder.php b/src/Builders/FilterBuilder.php index 792378a..3b522aa 100644 --- a/src/Builders/FilterBuilder.php +++ b/src/Builders/FilterBuilder.php @@ -46,6 +46,15 @@ class FilterBuilder extends Builder */ public $select = []; + /** + * @var array + */ + public $aggregates = []; + /** + * @var array + */ + public $aggregateRules = []; + /** * FilterBuilder constructor. * @@ -560,4 +569,41 @@ public function onlyTrashed() $this->wheres['must'][] = ['term' => ['__soft_deleted' => 1]]; }); } + + /** + * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/returning-only-agg-results.html + * + * @param int $size + * @return $this + */ + public function aggregate($size = 0) + { + $this->take($size); + $payloadCollection = []; + $aggregateRules = $this->aggregateRules ?: $this->model->getAggregateRules(); + foreach ($aggregateRules as $rule) { + if (is_callable($rule)) { + $payloadCollection[] = call_user_func($rule); + } else { + $ruleEntity = new $rule; + if ($aggregatePayload = $ruleEntity->buildAggregatePayload()) { + $payloadCollection[] = $aggregatePayload; + } + } + } + $this->aggregates = array_reduce($payloadCollection, 'array_merge', []); + return $this->engine()->search($this); + } + + /** + * Adds rule to the aggregate rules of the builder. + * + * @param $rule + * @return $this + */ + public function aggregateRule($rule) + { + $this->aggregateRules[] = $rule; + return $this; + } } From a2418e180b923bb178b69a0b2f4b66a4ccb009d8 Mon Sep 17 00:00:00 2001 From: Alex Kovtunov <582969@gmail.com> Date: Thu, 15 Aug 2019 14:48:39 +0400 Subject: [PATCH 2/7] AggregateRule --- src/AggregateRule.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/AggregateRule.php diff --git a/src/AggregateRule.php b/src/AggregateRule.php new file mode 100644 index 0000000..4e0ac90 --- /dev/null +++ b/src/AggregateRule.php @@ -0,0 +1,18 @@ + Date: Thu, 15 Aug 2019 17:08:29 +0400 Subject: [PATCH 3/7] add getAggregateRules() --- src/Searchable.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Searchable.php b/src/Searchable.php index c52064d..c832fc8 100644 --- a/src/Searchable.php +++ b/src/Searchable.php @@ -97,6 +97,14 @@ public function getSearchRules() $this->searchRules : [SearchRule::class]; } + /** + * @return array + */ + public function getAggregateRules() + { + return isset($this->aggregateRules) && count($this->aggregateRules) > 0 ? $this->aggregateRules : [AggregateRule::class]; + } + /** * Execute the search. * From 6c7fa08b498e167f5ba07faf0248c305857c4b4a Mon Sep 17 00:00:00 2001 From: Alex Kovtunov <582969@gmail.com> Date: Thu, 15 Aug 2019 18:33:54 +0400 Subject: [PATCH 4/7] fix buildSearchQueryPayloadCollection: add body.aggs on result --- src/ElasticEngine.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ElasticEngine.php b/src/ElasticEngine.php index 235e6a7..e2404f9 100644 --- a/src/ElasticEngine.php +++ b/src/ElasticEngine.php @@ -136,6 +136,7 @@ public function buildSearchQueryPayloadCollection(Builder $builder, array $optio ->setIfNotEmpty('body._source', $builder->select) ->setIfNotEmpty('body.collapse.field', $builder->collapse) ->setIfNotEmpty('body.sort', $builder->orders) + ->setIfNotEmpty('body.aggs', $builder->aggregates) ->setIfNotEmpty('body.explain', $options['explain'] ?? null) ->setIfNotEmpty('body.profile', $options['profile'] ?? null) ->setIfNotNull('body.from', $builder->offset) From 4fcc3319785f1bc52fa56150c8efdf1e148c4178 Mon Sep 17 00:00:00 2001 From: Alex Kovtunov <582969@gmail.com> Date: Wed, 4 Sep 2019 18:12:00 +0400 Subject: [PATCH 5/7] fix code style --- src/AggregateRule.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/AggregateRule.php b/src/AggregateRule.php index 4e0ac90..331199b 100644 --- a/src/AggregateRule.php +++ b/src/AggregateRule.php @@ -1,18 +1,10 @@ Date: Thu, 24 Oct 2019 19:07:23 +0500 Subject: [PATCH 6/7] custom scout key --- src/ElasticEngine.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ElasticEngine.php b/src/ElasticEngine.php index e2404f9..4ad348d 100644 --- a/src/ElasticEngine.php +++ b/src/ElasticEngine.php @@ -306,7 +306,10 @@ public function map(Builder $builder, $results, $model) $columns[] = $scoutKeyName; } - $ids = $this->mapIds($results)->all(); + $ids = []; + foreach ($results['hits']['hits'] as $hit) { + $ids[] = $hit['_source'][$scoutKeyName]; + } $query = $model::usesSoftDelete() ? $model->withTrashed() : $model->newQuery(); @@ -316,8 +319,8 @@ public function map(Builder $builder, $results, $model) ->keyBy($scoutKeyName); return Collection::make($results['hits']['hits']) - ->map(function ($hit) use ($models) { - $id = $hit['_id']; + ->map(function ($hit) use ($models, $scoutKeyName) { + $id = $hit['_source'][$scoutKeyName]; if (isset($models[$id])) { $model = $models[$id]; From b3c50d60dc34df79f9a57e178228de6535e04929 Mon Sep 17 00:00:00 2001 From: Alex Kovtunov <582969@gmail.com> Date: Thu, 30 Jan 2020 22:31:57 +0400 Subject: [PATCH 7/7] use document_refresh on delete --- src/Indexers/SingleIndexer.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Indexers/SingleIndexer.php b/src/Indexers/SingleIndexer.php index e17fdeb..40091a9 100644 --- a/src/Indexers/SingleIndexer.php +++ b/src/Indexers/SingleIndexer.php @@ -52,10 +52,13 @@ public function delete(Collection $models) { $models->each(function ($model) { $payload = (new DocumentPayload($model)) - ->set('client.ignore', 404) - ->get(); + ->set('client.ignore', 404); - ElasticClient::delete($payload); + if ($documentRefresh = config('scout_elastic.document_refresh')) { + $payload->set('refresh', $documentRefresh); + } + + ElasticClient::delete($payload->get()); }); } }