Skip to content

Commit 5c1b5eb

Browse files
mmachatschekdriesvintsbrunoocasalitaylorotwell
authored
[10.x] Meilisearch v1 support (#678)
* Make meilisearch v1 ready fix import Upgrade to meilisearch-php v1 Update EngineManager.php Fix deleteAllIndexes method Fix deleteAllIndexes pagination Update wrong usage of filters instead of filter Update src/EngineManager.php Co-authored-by: Bruno Casali <[email protected]> address review issue by @pyrou Fetch all indexes before adding delete task Update deleteallindexes implementation increase number fix case change * Apply suggestions from code review * Upgrade guide * Update UPGRADE.md Co-authored-by: Bruno Casali <[email protected]> * Update UPGRADE.md * Update UPGRADE.md --------- Co-authored-by: Dries Vints <[email protected]> Co-authored-by: Dries Vints <[email protected]> Co-authored-by: Bruno Casali <[email protected]> Co-authored-by: Taylor Otwell <[email protected]>
1 parent d7262da commit 5c1b5eb

File tree

12 files changed

+183
-156
lines changed

12 files changed

+183
-156
lines changed

.github/ISSUE_TEMPLATE/1_Bug_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ about: "Report something that's broken. Please ensure your Laravel version is st
77
<!-- Fill out the FULL versions with patch versions -->
88

99
- Scout Version: #.#.#
10-
- Scout Driver: Algolia / MeiliSearch / Database / Collection
10+
- Scout Driver: Algolia / Meilisearch / Database / Collection
1111
- Laravel Version: #.#.#
1212
- PHP Version: #.#.#
1313
- Database Driver & Version:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
Laravel Scout provides a simple, driver-based solution for adding full-text search to your Eloquent models. Once Scout is installed and configured, it will automatically sync your model changes to your search indexes. Currently, Scout supports:
1313

1414
- [Algolia](https://www.algolia.com/)
15-
- [MeiliSearch](https://github.com/meilisearch/meilisearch)
15+
- [Meilisearch](https://github.com/meilisearch/meilisearch)
1616

1717
## Official Documentation
1818

UPGRADE.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,18 @@ PR: https://github.com/laravel/scout/pull/657
2929

3030
Due to the `getScoutKeyName` change discussed above, the `getUnqualifiedScoutKeyName` method was removed as it is no longer necessary.
3131

32+
### Meilisearch 1.0
33+
34+
Scout 10.x requires Meilisearch PHP 1.0 as its minimum supported SDK version; therefore, you should upgrade your dependency via your application's `composer.json` file:
35+
36+
```json
37+
"meilisearch/meilisearch-php": "^1.0",
38+
```
39+
40+
In this SDK update, all namespace and class references to "MeiliSearch" have been updated to "Meilisearch". Please review your code for any reference to the old capitalization and update those references accordingly.
41+
42+
In addition, please consult the full [Meilisearch PHP v1.0 changelog](https://github.com/meilisearch/meilisearch-php/releases/tag/v1.0.0) for further details.
43+
3244
## Upgrading To 9.0 From 8.x
3345

3446
### Minimum Laravel Version

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"illuminate/support": "^9.0|^10.0"
2525
},
2626
"require-dev": {
27-
"meilisearch/meilisearch-php": "^0.23",
27+
"meilisearch/meilisearch-php": "^1.0",
2828
"mockery/mockery": "^1.0",
2929
"php-http/guzzle7-adapter": "^1.0",
3030
"orchestra/testbench": "^7.0|^8.0",
@@ -52,7 +52,7 @@
5252
},
5353
"suggest": {
5454
"algolia/algoliasearch-client-php": "Required to use the Algolia engine (^3.2).",
55-
"meilisearch/meilisearch-php": "Required to use the MeiliSearch engine (^0.23)."
55+
"meilisearch/meilisearch-php": "Required to use the Meilisearch engine (^1.0)."
5656
},
5757
"config": {
5858
"sort-packages": true,

config/scout.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,12 @@
118118

119119
/*
120120
|--------------------------------------------------------------------------
121-
| MeiliSearch Configuration
121+
| Meilisearch Configuration
122122
|--------------------------------------------------------------------------
123123
|
124-
| Here you may configure your MeiliSearch settings. MeiliSearch is an open
124+
| Here you may configure your Meilisearch settings. Meilisearch is an open
125125
| source search engine with minimal configuration. Below, you can state
126-
| the host and key information for your own MeiliSearch installation.
126+
| the host and key information for your own Meilisearch installation.
127127
|
128128
| See: https://docs.meilisearch.com/guides/advanced_guides/configuration.html
129129
|

src/Console/SyncIndexSettingsCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class SyncIndexSettingsCommand extends Command
2222
*
2323
* @var string
2424
*/
25-
protected $description = 'Sync your configured index settings with your search engine (MeiliSearch)';
25+
protected $description = 'Sync your configured index settings with your search engine (Meilisearch)';
2626

2727
/**
2828
* Execute the console command.

src/EngineManager.php

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
use Laravel\Scout\Engines\AlgoliaEngine;
1111
use Laravel\Scout\Engines\CollectionEngine;
1212
use Laravel\Scout\Engines\DatabaseEngine;
13-
use Laravel\Scout\Engines\MeiliSearchEngine;
13+
use Laravel\Scout\Engines\MeilisearchEngine;
1414
use Laravel\Scout\Engines\NullEngine;
15-
use MeiliSearch\Client as MeiliSearch;
15+
use Meilisearch\Client as MeilisearchClient;
16+
use Meilisearch\Meilisearch;
1617

1718
class EngineManager extends Manager
1819
{
@@ -74,10 +75,10 @@ protected function ensureAlgoliaClientIsInstalled()
7475
}
7576

7677
if (class_exists('AlgoliaSearch\Client')) {
77-
throw new Exception('Please upgrade your Algolia client to version: ^2.2.');
78+
throw new Exception('Please upgrade your Algolia client to version: ^3.2.');
7879
}
7980

80-
throw new Exception('Please install the Algolia client: algolia/algoliasearch-client-php.');
81+
throw new Exception('Please install the suggested Algolia client: algolia/algoliasearch-client-php.');
8182
}
8283

8384
/**
@@ -107,38 +108,34 @@ protected function defaultAlgoliaHeaders()
107108
}
108109

109110
/**
110-
* Create an MeiliSearch engine instance.
111+
* Create a Meilisearch engine instance.
111112
*
112-
* @return \Laravel\Scout\Engines\MeiliSearchEngine
113+
* @return \Laravel\Scout\Engines\MeilisearchEngine
113114
*/
114115
public function createMeilisearchDriver()
115116
{
116-
$this->ensureMeiliSearchClientIsInstalled();
117-
118-
return new MeiliSearchEngine(
119-
$this->container->make(
120-
class_exists(MeiliSearch::class)
121-
? MeiliSearch::class
122-
: \Meilisearch\Client::class
123-
),
117+
$this->ensureMeilisearchClientIsInstalled();
118+
119+
return new MeilisearchEngine(
120+
$this->container->make(MeilisearchClient::class),
124121
config('scout.soft_delete', false)
125122
);
126123
}
127124

128125
/**
129-
* Ensure the MeiliSearch client is installed.
126+
* Ensure the Meilisearch client is installed.
130127
*
131128
* @return void
132129
*
133130
* @throws \Exception
134131
*/
135-
protected function ensureMeiliSearchClientIsInstalled()
132+
protected function ensureMeilisearchClientIsInstalled()
136133
{
137-
if (class_exists(MeiliSearch::class) || class_exists(\Meilisearch\Client::class)) {
134+
if (class_exists(Meilisearch::class) && version_compare(Meilisearch::VERSION, '1.0.0') >= 0) {
138135
return;
139136
}
140137

141-
throw new Exception('Please install the MeiliSearch client: meilisearch/meilisearch-php.');
138+
throw new Exception('Please install the suggested Meilisearch client: meilisearch/meilisearch-php.');
142139
}
143140

144141
/**
Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55
use Illuminate\Support\LazyCollection;
66
use Laravel\Scout\Builder;
77
use Laravel\Scout\Jobs\RemoveableScoutCollection;
8-
use MeiliSearch\MeiliSearch;
9-
use MeiliSearch\Search\SearchResult;
8+
use Meilisearch\Client as MeilisearchClient;
9+
use Meilisearch\Contracts\IndexesQuery;
10+
use Meilisearch\Meilisearch;
11+
use Meilisearch\Search\SearchResult;
1012

11-
class MeiliSearchEngine extends Engine
13+
class MeilisearchEngine extends Engine
1214
{
1315
/**
14-
* The MeiliSearch client.
16+
* The Meilisearch client.
1517
*
16-
* @var \MeiliSearch\Client|\Meilisearch\Client
18+
* @var \Meilisearch\Client
1719
*/
1820
protected $meilisearch;
1921

@@ -25,13 +27,13 @@ class MeiliSearchEngine extends Engine
2527
protected $softDelete;
2628

2729
/**
28-
* Create a new MeiliSearchEngine instance.
30+
* Create a new MeilisearchEngine instance.
2931
*
30-
* @param \MeiliSearch\Client|\Meilisearch\Client $meilisearch
32+
* @param \Meilisearch\Client $meilisearch
3133
* @param bool $softDelete
3234
* @return void
3335
*/
34-
public function __construct($meilisearch, $softDelete = false)
36+
public function __construct(MeilisearchClient $meilisearch, $softDelete = false)
3537
{
3638
$this->meilisearch = $meilisearch;
3739
$this->softDelete = $softDelete;
@@ -43,7 +45,7 @@ public function __construct($meilisearch, $softDelete = false)
4345
* @param \Illuminate\Database\Eloquent\Collection $models
4446
* @return void
4547
*
46-
* @throws \MeiliSearch\Exceptions\ApiException|\Meilisearch\Exceptions\ApiException
48+
* @throws \Meilisearch\Exceptions\ApiException
4749
*/
4850
public function update($models)
4951
{
@@ -103,25 +105,27 @@ public function delete($models)
103105
public function search(Builder $builder)
104106
{
105107
return $this->performSearch($builder, array_filter([
106-
'filters' => $this->filters($builder),
107-
'limit' => $builder->limit,
108+
'filter' => $this->filters($builder),
109+
'hitsPerPage' => $builder->limit,
108110
'sort' => $this->buildSortFromOrderByClauses($builder),
109111
]));
110112
}
111113

112114
/**
113115
* Perform the given search on the engine.
114116
*
117+
* page/hitsPerPage ensures that the search is exhaustive.
118+
*
115119
* @param int $perPage
116120
* @param int $page
117121
* @return mixed
118122
*/
119123
public function paginate(Builder $builder, $perPage, $page)
120124
{
121125
return $this->performSearch($builder, array_filter([
122-
'filters' => $this->filters($builder),
123-
'limit' => (int) $perPage,
124-
'offset' => ($page - 1) * $perPage,
126+
'filter' => $this->filters($builder),
127+
'hitsPerPage' => (int) $perPage,
128+
'page' => $page,
125129
'sort' => $this->buildSortFromOrderByClauses($builder),
126130
]));
127131
}
@@ -137,19 +141,6 @@ protected function performSearch(Builder $builder, array $searchParams = [])
137141
{
138142
$meilisearch = $this->meilisearch->index($builder->index ?: $builder->model->searchableAs());
139143

140-
$meilisearchVersionClassName = class_exists(MeiliSearch::class)
141-
? MeiliSearch::class
142-
: \Meilisearch\Meilisearch::class;
143-
144-
// meilisearch-php 0.19.0 is compatible with meilisearch server 0.21.0...
145-
if (version_compare($meilisearchVersionClassName::VERSION, '0.19.0') >= 0 && isset($searchParams['filters'])) {
146-
$searchParams['filter'] = $searchParams['filters'];
147-
148-
unset($searchParams['filters']);
149-
}
150-
151-
$searchParams = array_merge($builder->options, $searchParams);
152-
153144
if ($builder->callback) {
154145
$result = call_user_func(
155146
$builder->callback,
@@ -323,7 +314,7 @@ public function lazyMap(Builder $builder, $results, $model)
323314
*/
324315
public function getTotalCount($results)
325316
{
326-
return $results['nbHits'];
317+
return $results['totalHits'];
327318
}
328319

329320
/**
@@ -346,7 +337,7 @@ public function flush($model)
346337
* @param array $options
347338
* @return mixed
348339
*
349-
* @throws \MeiliSearch\Exceptions\ApiException|\Meilisearch\Exceptions\ApiException
340+
* @throws \Meilisearch\Exceptions\ApiException
350341
*/
351342
public function createIndex($name, array $options = [])
352343
{
@@ -360,7 +351,7 @@ public function createIndex($name, array $options = [])
360351
* @param array $options
361352
* @return array
362353
*
363-
* @throws \MeiliSearch\Exceptions\ApiException|\Meilisearch\Exceptions\ApiException
354+
* @throws \Meilisearch\Exceptions\ApiException
364355
*/
365356
public function updateIndexSettings($name, array $options = [])
366357
{
@@ -373,7 +364,7 @@ public function updateIndexSettings($name, array $options = [])
373364
* @param string $name
374365
* @return mixed
375366
*
376-
* @throws \MeiliSearch\Exceptions\ApiException|\Meilisearch\Exceptions\ApiException
367+
* @throws \Meilisearch\Exceptions\ApiException
377368
*/
378369
public function deleteIndex($name)
379370
{
@@ -387,7 +378,19 @@ public function deleteIndex($name)
387378
*/
388379
public function deleteAllIndexes()
389380
{
390-
return $this->meilisearch->deleteAllIndexes();
381+
$tasks = [];
382+
$limit = 1000000;
383+
384+
$query = new IndexesQuery();
385+
$query->setLimit($limit);
386+
387+
$indexes = $this->meilisearch->getIndexes($query);
388+
389+
foreach ($indexes->getResults() as $index) {
390+
$tasks[] = $index->delete();
391+
}
392+
393+
return $tasks;
391394
}
392395

393396
/**
@@ -402,7 +405,7 @@ protected function usesSoftDelete($model)
402405
}
403406

404407
/**
405-
* Dynamically call the MeiliSearch client instance.
408+
* Dynamically call the Meilisearch client instance.
406409
*
407410
* @param string $method
408411
* @param array $parameters

src/ScoutServiceProvider.php

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
use Laravel\Scout\Console\ImportCommand;
1010
use Laravel\Scout\Console\IndexCommand;
1111
use Laravel\Scout\Console\SyncIndexSettingsCommand;
12-
use MeiliSearch\Client as MeiliSearchClient;
13-
use MeiliSearch\MeiliSearch;
12+
use Meilisearch\Client as Meilisearch;
1413

1514
class ScoutServiceProvider extends ServiceProvider
1615
{
@@ -23,27 +22,15 @@ public function register()
2322
{
2423
$this->mergeConfigFrom(__DIR__.'/../config/scout.php', 'scout');
2524

26-
if (class_exists(MeiliSearchClient::class) || class_exists(\Meilisearch\Client::class)) {
27-
$meilisearchClientClassName = class_exists(MeiliSearchClient::class)
28-
? MeiliSearchClient::class
29-
: \Meilisearch\Client::class;
30-
$this->app->singleton($meilisearchClientClassName, function ($app) use ($meilisearchClientClassName) {
25+
if (class_exists(Meilisearch::class)) {
26+
$this->app->singleton(Meilisearch::class, function ($app) {
3127
$config = $app['config']->get('scout.meilisearch');
3228

33-
$meilisearchVersionClassName = class_exists(MeiliSearch::class)
34-
? MeiliSearch::class
35-
: \Meilisearch\Meilisearch::class;
36-
if (version_compare($meilisearchVersionClassName::VERSION, '0.24.2') >= 0) {
37-
return new MeiliSearchClient(
38-
$config['host'],
39-
$config['key'],
40-
null,
41-
null,
42-
[sprintf('Meilisearch Laravel Scout (v%s)', Scout::VERSION)],
43-
);
44-
}
45-
46-
return new $meilisearchClientClassName($config['host'], $config['key']);
29+
return new Meilisearch(
30+
$config['host'],
31+
$config['key'],
32+
clientAgents: [sprintf('Meilisearch Laravel Scout (v%s)', Scout::VERSION)],
33+
);
4734
});
4835
}
4936

0 commit comments

Comments
 (0)