Laravel 7ãMS0.13ã䜿çšããŠããŸã
次ã䜿çšããŠã¢ãã«ã®ã€ã³ããã¯ã¹ãäœæããããšããŠããŸãã
php artisan scout:import "App\Models\Product"
次ã«ãïŒlocal_productãç§ã®ã€ã³ããã¯ã¹ã§ãïŒïŒ
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
ãããŠç§ã¯[]
ãæã«å
¥ããŸã
ç§ãã¢ã«ãŽãªã¢ã§çŽ¢åŒãä»ããã°ãç§ã®ææžã¯ããã§å€§äžå€«ã§ãã
ãŸããç§ãæ ç»ã®ã€ã³ããã¯ã¹ãäœæããå ŽåïŒ
curl -X POST 'http://127.0.0.1:7700/indexes/movies/documents' --data @movies.json
æ ç»ã玢åŒä»ããããŠããŸãã
ããã«ã¡ã¯@elfeffe ã
ããã¯ãããå€ãã®æ å ±ãªãã§ããªããå©ããã®ã¯é£ããã§ãã
meilisearchã€ã³ã¹ã¿ã³ã¹ããã°ã«èšé²ãããšã次ã®ããã«ãªããŸãã
"POST /indexes/local_product/documents?primaryKey=id HTTP/1.1" 202 14
補åã¢ãã«ã§toSearchableArray()
ã䜿çšããŠããå Žåãã³ã³ãã³ãã衚瀺ããŠããã ããŸããããåããšã©ãŒãåçŸã§ããå¯èœæ§ããããŸãã
ç§ã¯MongoDbã䜿çšããŠããŸãã ããŒã¯_idã ãšæããŸã
ããã¯ã§ããŸããïŒ
toSearchableArrayã䜿çšããŠäžéšã®ãã£ãŒã«ãããã£ã«ã¿ãªã³ã°ããŸããããããã¯Algoliaã§ã€ã³ããã¯ã¹ãäœæããŸãã ãããŠãæåŸã®é
åããã³ãããŸããããã§åé¡ãããŸããã
ç§ã¯ä»ã³ã³ãã¥ãŒã¿ãŒãæã£ãŠããŸãããããªãã¯ç§ã«äœãè©ŠããŠæ¬²ããã§ããïŒ
ã©ãããæå³ãããããªã
meilisearchã€ã³ã¹ã¿ã³ã¹ããã°ã«èšé²ãããšã次ã®ããã«ãªããŸãã
äœãããŠã»ãããæããŠãã ãã
ãã£ãŠã¿ãã
curl \-X POST 'http://localhost:7700/indexes/local_product/documents' \--data '[{"id": 287947,"title": "Shazam","poster": "https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg","overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.","release_date": "2019-03-23"}]'
ç§ã¯åŸã{"updateId":31}
ããããç§ã¯ããŸãcurl -X GET 'http://localhost:7700/indexes/local_product/documents'
ãããŠãç§ã¯åŸã
[]
ãŸã
ããã«ã¡ã¯@elfeffe
æŽæ°ã¹ããŒã¿ã¹ã¯ãã€ã§ã確èªã§ããŸããã»ãšãã©ã®å ŽåãæŽæ°ã倱æããå Žåã«åããŠãMeiliSearchã¯ãšã©ãŒã®å 容ãéç¥ããŸãã
確èªã§ããŸãïŒæŽæ°ã¹ããŒã¿ã¹ãååŸããŸã
ãããŠæåŸã®äŸã§ã¯ãè©Šãããšãã§ããŸã
curl -X GET 'http://localhost:7700/indexes/local_product/updates/31'
ããã«ãããäœãèµ·ãã£ãŠãããã«ã€ããŠã®è©³çŽ°æ å ±ãåŸãããã¯ãã§ãã
ç§ã¯MongoDbã䜿çšããŠããŸãã ããŒã¯_idã ãšæããŸã
ããã¯ã§ããŸããïŒ
ã€ã³ããã¯ã¹local_product
ãäœæãããšãã«ãããŒãã©ã¡ãŒã¿ãæå®ããŸãããïŒ
php artisan scout:index local_product --key _id
toSearchableArrayã䜿çšããŠäžéšã®ãã£ãŒã«ãããã£ã«ã¿ãªã³ã°ããŸããããããã¯Algoliaã§ã€ã³ããã¯ã¹ãäœæããŸãã ãããŠãæåŸã®é åããã³ãããŸããããã§åé¡ãããŸããã
toSearchableArrayïŒïŒã«ã³ã¡ã³ãããŠè©Šãããšãã§ããŸããïŒããã¯ããã§ã¯åé¡ã§ã¯ãªããšæããŸãããè©Šãã®ã«è²»çšã¯ããããŸããã
toSearchableArrayïŒïŒãåé€ããŸãã
ããããç§ã¯ãã£ãŠã¿ãŸããïŒ
php artisan scout:index local_product --key _id
åäœããŸããã
ãã®åŸã
php artisan scout:index local_product --key id
äžç·ã«
/**
* Get the value used to index the model.
*
* <strong i="14">@return</strong> mixed
*/
public function getScoutKey()
{
return $this->id;
}
/**
* Get the key name used to index the model.
*
* <strong i="15">@return</strong> mixed
*/
public function getScoutKeyName()
{
return 'id';
}
äœããç§ããããšãcurl -X GET 'http://localhost:7700/indexes/local_product/documents'
1ã€ã®ããã¥ã¡ã³ããååŸãã1ã€ã䜿çšããŠã€ã³ããã¯ã¹ãäœæããŸã
curl \-X POST 'http://localhost:7700/indexes/local_product/documents' \--data '[{"id": 287947,"title": "Shazam","poster": "https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg","overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.","release_date": "2019-03-23"}]'
確èªã§ãããã°ã¯ãããŸããïŒ
ããŒã¿ãã€ã³ããŒããããšã次ã®ãããªãã®ãåŸãããŸãããïŒ
shok@pop-os:~/web/blog$ php artisan scout:import "App\Models\Post"
Imported [App\Models\Post] models up to ID: 100
All [App\Models\Post] records have been imported.
ãã°ã¯storage/logs/laravel.log
ã«ãããŸã
scout.php
ã§queue => trueãèšå®ããŸãããã.envã§SCOUT_QUEUE = trueãèšå®ããŸãããïŒ
ãã¥ãŒã«å¯ŸããŠtrueãšfalseã®äž¡æ¹ãè©ŠããŠã¿ãŸããã ãã€ãç§ã¯åŸã
IDïŒ5eea4b314c80095faf5be593ãŸã§ã®ã€ã³ããŒãããã[AppModelsProduct]ã¢ãã«
IDïŒ5eea4bd94c80095faf5be787ãŸã§ã®ã€ã³ããŒãããã[AppModelsProduct]ã¢ãã«
IDïŒ5eea4cc34c80095faf5be97bãŸã§ã®ã€ã³ããŒãããã[AppModelsProduct]ã¢ãã«
IDïŒ5eea4dfa4c80095faf5beb6fãŸã§ã®ã€ã³ããŒãããã[AppModelsProduct]ã¢ãã«
IDïŒ5eea4f6b4c80095faf5bed63ãŸã§ã®ã€ã³ããŒãããã[AppModelsProduct]ã¢ãã«
IDïŒ5eea51164c80095faf5bef57ãŸã§ã®ã€ã³ããŒãããã[AppModelsProduct]ã¢ãã«
IDïŒ5eea524e4c80095faf5bf099ãŸã§ã®ã€ã³ããŒãããã[AppModelsProduct]ã¢ãã«
ããããææžã¯ãããŸããã
Laravelã®ãã°ãã©ãã«ãããã¯ç¥ã£ãŠããŸããããšã©ãŒã¯ãããŸãããèŠããã®ã¯MSãã°ã§ãã
äœãèµ·ãã£ãŠããã®ãã確èªããæ¹æ³ã¯ãããŸããïŒ
ãã¹ãŠåãèšå®ã§ãAlgoliaã¯ç§ã®ããã¥ã¡ã³ãã®ã€ã³ããã¯ã¹ãäœæããŠããŸãã
ããããŸãããMeilisearchlaravelã¹ã«ãŠãã¯ãã¢ã«ãŽãªã¢ã®ãã®ã®ã³ããŒããŒã¹ãã®ãããªãšã³ãžã³ã«ãããŸããã ãããã£ãŠãåé¡ã¯ãªãã¯ãã§ãããmongodbã§å®è¡ããããšããããšããããŸãã...
@eskombro @curquizaã¯ãMSãã°ã«çããããšãã§ããŸãã
ãŠãŒã¶ãŒã¢ãã«ã¯MySQLã§ãããæ©èœãããããããã¯MongoDBã«é¢é£ããŠããŸãã
ã€ãŸããããã¯MongoDB / Meilââisearchã«é¢é£ããŠããŸããããã¯ãAlgoliaãMongoDBãšé£æºããŠããããã§ãã
MSããããã€ãã®ãã°ãååŸã§ããã°çŽ æŽããããšæããŸãããAlgoliaããµããŒãããŠããã®ã«ãMeilisearchããµããŒãããŠããªãã®ã¯æ²ããããšã§ãã
åé¡ãæãäžããããšã¯ã§ããŸãããlaravelã§mongoDBãã€ã³ã¹ããŒã«ããæ¹æ³ã«ã€ããŠããªãã®å©ããå¿ èŠã§ã
çŸåšã®ãšãããMeiliSearchãã°ã¯stdoutã«çŽæ¥åºåããããããMeiliSearchã€ã³ã¹ã¿ã³ã¹ãå®è¡ããŠããå Žæã«ãã£ãŠç°ãªããŸãã ã©ãã§èµ°ã£ãŠããŸããïŒ
MeiliSearchã§æ°žç¶ãã°ã«ã€ããŠèª¬æããããã®åé¡ãããã§éããŸããïŒ https ïŒ//github.com/meilisearch/MeiliSearch/issues/898
@elfeffe以åã®ã³ã¡ã³ãã§ææ¡ããããã«ãæŽæ°ã¹ããŒã¿ã¹ã確èªããŸãããïŒ ããã¥ã¡ã³ããMeilISearchã«æ£åžžã«éä¿¡ãããã¹ããŒã¿ã¹IDãååŸããå Žåããã®æŽæ°ã¹ããŒã¿ã¹å ã«ãMeilISearchãã€ã³ããã¯ã¹ãäœæããããšãããšãã«äœãåé¡ã§ãããã«é¢ããæ å ±ãèŠã€ããå¯èœæ§ããããŸãã ãããè©ŠããŠãã ããïŒ https ïŒ//github.com/meilisearch/meilisearch-laravel-scout/issues/36#issuecomment -668787383
ãããèŠãŠãã ãã
curl \-X POST 'http://localhost:7700/indexes/local_product/documents' \--data '[{"id": 287947,"title": "Shazam","poster": "https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg","overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.","release_date": "2019-03-23"}]'
ããã¯æ©èœããŸãã
curl \-X POST 'http://localhost:7700/indexes/local_product/documents' \--data '[{"id": 5eea4bd94c80095faf5be787,"title": "Shazam 2","poster": "https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg","overview": "A boy is given the ability to become an adult superhero in times of need with a single magic word.","release_date": "2019-03-23"}]'
ã5eea4bd94c80095faf5be787ãã¯MongoDB_idã§ã
ããã¯ãã®çŸãããè¿ããŸã
{"message"ïŒ "ç¡å¹ãªJSONïŒ1è¡11åã®ç¡å¹ãªçªå·"ã "errorCode"ïŒ "bad_request"ã "errorType"ïŒ "invalid_request_error"ã "errorLink"ïŒ " https://docs.meilisearch.com/errors #bad_request "}
JSONã¯æå¹ã ãšæããŸãããMSãšã«ã¹ã¿ã ããŒã«åé¡ããããŸãã
é·ããªã®ããæåãªã®ãããããšãäœãªã®ãããããŸããã
äœåºŠãè©ŠããåŸãæåãåé¡ã ãšæããŸãããMSã¯IDã®æåãåãå
¥ããŸããã ããããLaravelã§ã¯ããã«æåãå
¥ããããšãã§ããŸãã
ãããç§ãæãåé¡ã§ã
ã¯ããäºéåŒçšç¬Šã§å²ãã æååãšããŠéä¿¡ããå¿ èŠããããŸã
5eea4bd94c80095faf5be787
ã¯æå¹ãªçªå·ã§ã¯ãªãããã "id": 5eea4bd94c80095faf5be787
$ã§ã¯ãªã"id": "5eea4bd94c80095faf5be787"
ã§æ©èœããŸãð
ããããç§ã¯ããªãã®ã¹ã«ãŠãæ¡åŒµæ©èœããããéä¿¡ããæ¹æ³ãå¶åŸ¡ããŠããŸããð
ããã§ã
/**
* Get the value used to index the model.
*
* <strong i="6">@return</strong> mixed
*/
public function getScoutKey()
{
return (string)$this->_id;
}
ããã¯æ©èœããŸãããç§ã¯ãã®ãšã³ãžã³ãæååIDãåŠçããªããã°ãªããªããšæããŸã
toSearchableArrayïŒïŒã§ãåãããšãããŸã
return [ 'id' => (string) $this->_id]
or
return [ '_id' => (string) $this->_id]
ããªããéµãšããŠäœãèšå®ããã®ãããããŸãã
public function toSearchableArray()
{
$array = $this->toArray();
$array['id'] = (string)$array['_id'];
return $array;
}
ããã¯ããŸããã
æåŸã«äžã€ã ãã
Algoliaã¯ãã€ã³ããã¯ã¹ã®äœæãšãšãã«ããããèªåçã«åŠçããŸãã
ã€ãŸããAlgoliaã¯ååšããªãå Žåã«ã€ã³ããã¯ã¹ãäœæããå€æããã«æåã§IDã«ã€ã³ããã¯ã¹ãä»ããããšãã§ããŸãã
MSã«ã¯äž¡æ¹ã®æ©èœãå«ããå¿
èŠããããšæããŸãã
ã€ãŸããååšããªãå Žåãã¢ã«ãŽãªã¢ã¯ã€ã³ããã¯ã¹ãäœæããŸã
å®éãMeiliSearchAPIã¯ãŸã ãã®æ©èœãåŠçããŠããŸããã
å¥ã®è§£æ±ºçãšããŠãã»ãšãã©ã®SDKã¯get_or_create_index
ã¡ãœãããæäŸããŸãïŒPHP SDKãšåæ§ïŒð
ãŸããå€æããã«æåã§IDã«ã€ã³ããã¯ã¹ãä»ããããšãã§ããŸãã
ããªããæ±ããŠããåé¡ã¯ãJSONã®åŠ¥åœæ§ã«èµ·å ããŠããŸãã Algolia APIã§ããç¡å¹ãªJSONãåãå
¥ããŸãããåŒçšç¬Šãä»ããã«æåãå«ãæ°å€ïŒ "
ïŒãéä¿¡ãããšãç¡å¹ãªJSONãšèŠãªããã倱æããŸãã
Algoliaããã·ã¥ããŒããåç §ããŠãã ããã
ãã¶ããAlgoliaã®Laravel SDKã¯ãæåãå«ãæ°å€ãæååã«å€æããŸãããã®ããã倱æã¯ãããŸããã§ããð
MSã«ã¯äž¡æ¹ã®æ©èœãå«ããå¿ èŠããããšæããŸãã
ãããã£ãŠã meilisearch-laravel-scout
ã«ã¯ãåŒçšæ©èœããå«ããããšãã§ããŸãããMeiliSearchã¯æå¹ãªJSONãæ³å®ããŠãããããå«ããããšãã§ããŸããã§ããð
ã¯ããã©ã¡ãã®å Žåããç§ã¯ãã®ã¹ã«ãŠããšã³ãžã³ã«ã€ããŠè©±ããŠããŸãããããã§ã¯ã¹ã«ãŠãã®çµ±åã«åãçµãã§ããŸãã
SDKã¯ã€ã³ããã¯ã¹ãäœæããã¡ãœãããæäŸã§ããŸãããã€ã³ããã¯ã¹ãååšããªãå ŽåãScoutã¯å€±æããŸãã
æåä»ãã®Idãšåãããã«ãJSOnã®åœ¢åŒãæ£ãããªãããšã¯ç解ããŠããŸãããScoutãšã³ãžã³ã¯ã倱æããåã«ãããå¶åŸ¡ããŸãã
ã¢ã«ãŽãªã¢ã®ããã«ãããã¯æåã§å€±æããªãããã§ãã
OKOKããããŸããã§ããð
ãããã¯ãå®è£ ããã®ã«é©ããæ©èœã«ãªãå¯èœæ§ããããŸãã ð
ç·šéïŒãããmeilisearch-phpãŸãã¯meilisearch-laravel-scoutããã±ãŒãžã«å®è£ ãããã©ãããæ€èšããå¿ èŠããããŸãã
@curquiza
ç¶æ³ã«ãããŸãããã©ã¡ããè¯ãã§ãã
ã¹ã«ãŠãã§ãããå®è£ ããå ŽåãsymfonyïŒããã³ä»ã®ãã¬ãŒã ã¯ãŒã¯ã®å®è£ ïŒããããå®è£ ããå¿ èŠããããšæããŸãïŒãã§ã«ããã§ãããããããŸããïŒã ããã§ã代ããã«SDKã«ãããæã£ãŠããæ¹ãè¯ããããããŸãããïŒ
ã¹ã«ãŠããAlgoliaã«å®è£ ãããã©ããã¯ããããŸããããããã¯Algolia PHP SDKã§åŠçããããšæããŸããå°ãæéãããã°ãããã確èªããŸãã
@shokme ããã®éãã§ããlaravelãšscoutã®çµ±åã§ã¯ãªããPHPSDKã§å®è¡ããæ¹ãè³¢æãããããŸããã
調æ»ã«ã€ããŠãç¥ãããã ãããããã«å¿ããŠåé¡ã移åïŒãŸãã¯åäœæïŒããŸãã ð
ã ãããå
šäœã調æ»ããåŸã
jenssegers/laravel-mongodb
ã䜿çšããŠlaravelã«mongodbãã€ã³ã¹ããŒã«ããŸããã
ã€ã³ããã¯ã¹ãäœæããããšããå§ããŸããã
php artisan scout:index cars -k _id
ã¢ãã«ãäœæãã
<?php
namespace App;
use Jenssegers\Mongodb\Eloquent\Model;
use Laravel\Scout\Searchable;
class Car extends Model
{
use Searchable;
public function getScoutKey() // not required if this is already your primary key
{
return $this->_id;
}
public function getScoutKeyName() // not required if this is already your primary key
{
return '_id';
}
}
æ°ããè»ãäœæãã
$car = new App\Car();
$car->name = 'mustang';
$car->constructor = 'ford';
$car->type = 'muscle';
$car->horses = 280;
$car->save();
ã¢ãã«ã¯åé¡ãªãã¡ã€ãªãµãŒãã«éä¿¡ãããŸããã
{
"status": "processed",
"updateId": 1,
"type": {
"name": "DocumentsAddition",
"number": 1
},
"duration": 0.005275826,
"enqueuedAt": "2020-08-29T17:43:55.104917708Z",
"processedAt": "2020-08-29T17:43:55.121602037Z"
}
æ€çŽ¢ãè¡ããšãæ£ããçµæãåŸãããŸã
App\Car::search('mustang')->get();
`` `json
[
{{
"_id"ïŒ "5f4a93dbd9668370086c7752"ã
ãååãïŒãã ã¹ã¿ã³ã°ãã
ãã³ã³ã¹ãã©ã¯ã¿ãŒãïŒããã©ãŒããã
ãã¿ã€ããïŒãçèãã
ã銬ãïŒ280ã
"updated_at"ïŒ "2020-08-29T17ïŒ43ïŒ55.102000Z"ã
"created_at"ïŒ "2020-08-29T17ïŒ43ïŒ55.102000Z"
}
]
The only problem I have encounter while trying to reproduce the bug was by forgot to set `_id` has primaryKey
and the update status was returning:
```json
{
"status": "failed",
"updateId": 3,
"type": {
"name": "DocumentsAddition",
"number": 1
},
"error": "serializer error; Primary key is missing.",
"duration": 9.817e-6,
"enqueuedAt": "2020-08-29T17:21:00.098580201Z",
"processedAt": "2020-08-29T17:21:00.100495474Z"
}
ã§ããããæ£çŽãªãšããã $this->_id
@ elfeffeã§æååãè¿ãããªãçç±ãããããŸãã
@shokmeããããŸããã æ°æ¥åŸã«æ€çŽ¢ãåéããäœãæ°ãããã®ãèŠã€ãã£ãããç¥ããããŸãã
SDKã¯ãééããé¿ããããã«ãAlgoliaãšåãããã«ãæ£ããã€ã³ããã¯ã¹ãèªåçã«äœæããå¿
èŠããããŸãã
SDKã¯ãééããé¿ããããã«ãAlgoliaãšåãããã«ãæ£ããã€ã³ããã¯ã¹ãèªåçã«äœæããå¿ èŠããããŸãã
MeiliSearchã³ã¢ãšã³ãžã³ã§èšç»ãããŠããŸãïŒ ð
https://github.com/meilisearch/MeiliSearch/issues/918
æãåèã«ãªãã³ã¡ã³ã
ããã¯ããŸããã