์ ๋ Laravel 7, MS 0.13์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ค์์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ์ธ๋ฑ์ฑํ๋ ค๊ณ ํฉ๋๋ค.
php artisan scout:import "App\Models\Product"
๊ทธ๋ฐ ๋ค์ (local_product๋ ๋ด ์์ธ์
๋๋ค):
curl -X GET 'http://localhost:7700/indexes/local_product/documents'
๊ทธ๋ฆฌ๊ณ []
๋ฅผ ๋ฐ์ต๋๋ค.
Algolia์์ ์์ธ์ ์์ฑํ๋ฉด ๋ด ๋ฌธ์๋ ๊ด์ฐฎ์ต๋๋ค.
๋ํ ๋ด๊ฐ ํ๋ ์ํ๋ฅผ ์์ธํํ๋ ๊ฒฝ์ฐ:
curl -X POST 'http://127.0.0.1:7700/indexes/movies/documents' --data @movies.json
์ํ๋ ์์ธ๋ฉ๋๋ค.
์๋ ํ์ธ์ @elffeff ๋
์ด๊ฒ์ ๋ ๋ง์ ์ ๋ณด ์์ด๋ ๋น์ ์ ๋๊ธฐ ์ด๋ ต์ต๋๋ค.
meilisearch ์ธ์คํด์ค๋ฅผ ๊ธฐ๋กํ๋ฉด ๋ค์์ ์ป์ ์ ์์ต๋๋ค.
"POST /indexes/local_product/documents?primaryKey=id HTTP/1.1" 202 14
์ ํ ๋ชจ๋ธ์ toSearchableArray()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ด์ฉ์ ํ์ํ ์ ์์ผ๋ฏ๋ก ๋์ผํ ์ค๋ฅ๋ฅผ ์ฌํํ ์ ์์ต๋๋ค.
์ ๋ ๋ชฝ๊ณ ๋๋น๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํค๋ _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'
๊ทธ๋ฆฌ๊ณ ๋๋ ์ป๋๋ค
[]
๋ค์
์๋ ํ์ธ์ @elffeff
ํญ์ ์ ๋ฐ์ดํธ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ MeiliSearch๋ ์ ๋ฐ์ดํธ๊ฐ ์คํจํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฌด์์ธ์ง ์๋ ค์ค๋๋ค.
๋ค์์ ํ์ธํ ์ ์์ต๋๋ค. ์ ๋ฐ์ดํธ ์ํ ๊ฐ์ ธ์ค๊ธฐ
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ์์ ๊ฒฝ์ฐ ์๋ํด ๋ณผ ์ ์์ต๋๋ค.
curl -X GET 'http://localhost:7700/indexes/local_product/updates/31'
๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ ๋ ๋ชฝ๊ณ ๋๋น๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํค๋ _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'
๋๋ ๋จ์ง ํ๋์ ๋ฌธ์๋ฅผ ์ป์์ต๋๋ค. ํ๋๋ ๋ค์์ ์ฌ์ฉํ์ฌ ์์ธํ๋์์ต๋๋ค.
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๋ฅผ ๋ชจ๋ ์๋ํ์ต๋๋ค. ํญ์ ๋๋ ์ป๋๋ค
๊ฐ์ ธ์จ [AppModelsProduct] ๋ชจ๋ธ ์ต๋ ID: 5eea4b314c80095faf5be593
๊ฐ์ ธ์จ [AppModelsProduct] ๋ชจ๋ธ ์ต๋ ID: 5eea4bd94c80095faf5be787
๊ฐ์ ธ์จ [AppModelsProduct] ๋ชจ๋ธ ์ต๋ ID: 5eea4cc34c80095faf5be97b
๊ฐ์ ธ์จ [AppModelsProduct] ๋ชจ๋ธ ์ต๋ ID: 5eea4dfa4c80095faf5beb6f
๊ฐ์ ธ์จ [AppModelsProduct] ๋ชจ๋ธ ์ต๋ ID: 5eea4f6b4c80095faf5bed63
๊ฐ์ ธ์จ [AppModelsProduct] ๋ชจ๋ธ ์ต๋ ID: 5eea51164c80095faf5bef57
๊ฐ์ ธ์จ [AppModelsProduct] ๋ชจ๋ธ ์ต๋ ID: 5eea524e4c80095faf5bf099
๊ทธ๋ฌ๋ ๋ฌธ์๊ฐ ์์ต๋๋ค.
laravel์ ๋ก๊ทธ๊ฐ ์๋ ์์น๋ฅผ ์๊ณ ์์ง๋ง ์ค๋ฅ๊ฐ ์์ต๋๋ค. ๋ณด๊ณ ์ถ์ ๊ฒ์ MS ๋ก๊ทธ์
๋๋ค.
๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ณผ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ชจ๋ ๋์ผํ ์ค์ ์ผ๋ก Algolia๋ ๋ด ๋ฌธ์๋ฅผ ์์ธํํฉ๋๋ค.
์ข์, Meilisearch laravel scout๋ Algolia์ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ๊ฐ์ ์์ง์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ๋ฌธ์ ๊ฐ๋์ด์๋ ์๋์ง๋ง mongodb๋ก ์คํํ๋ ค๊ณ ์๋ํ ์ ์ด ์์ต๋๋ค ...
@eskombro @curquiza ๊ฐ MS ๋ก๊ทธ์ ๋ํด ๋ต๋ณํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ฌ์ฉ์ ๋ชจ๋ธ์ด MySQL์ด๊ณ ์๋ํ๊ธฐ ๋๋ฌธ์ MongoDB์ ๊ด๋ จ์ด ์์ต๋๋ค.
Algolia๋ MongoDB์๋ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ MongoDB/Meilisearch์ ๊ด๋ จ์ด ์์ต๋๋ค.
MS์์ ์ผ๋ถ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. Algolia๊ฐ ์ง์ํ์ง๋ง Meilisearch๋ ์ง์ํ์ง ์๋๋ค๋ฉด ์ํ๊น์ต๋๋ค.
๋ฌธ์ ๋ฅผ ํํค์น ์๋ ์์ง๋ง laravel๊ณผ ํจ๊ป mongoDB๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ทํ์ ๋์์ด ํ์ํฉ๋๋ค.
ํ์ฌ MeiliSearch ๋ก๊ทธ๋ stdout์ ์ง์ ์ธ์๋๋ฏ๋ก MeiliSearch ์ธ์คํด์ค๋ฅผ ์คํํ๋ ์์น์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ด๋์์ ์คํ๋๊ณ ์์ต๋๊น?
์ฌ๊ธฐ์์ MeiliSearch์ ์๊ตฌ ๋ก๊ทธ์ ๋ํด ๋ ผ์ํ๊ธฐ ์ํ ๋ฌธ์ ๋ฅผ ์ด์์ต๋๋ค. https://github.com/meilisearch/MeiliSearch/issues/898
@elffeff ์ด์ ๋๊ธ์์ ์ ์ํ ๋๋ก ์ ๋ฐ์ดํธ ์ํ๋ฅผ ํ์ธํ์ต๋๊น? ๋ฌธ์๊ฐ 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"
์ ํจ๊ป ์๋ํฉ๋๋ค ๐
ํ์ง๋ง Scout ํ์ฅ ํ๋ก๊ทธ๋จ์ด ๋ณด๋ด๋ ๋ฐฉ์์ ์ ์ดํ์ง ์์ต๋๋ค. ๐
์ด๋ ๊ฒ ํด๋
/**
* 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์๋ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ด ๋ชจ๋ ํฌํจ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด ๋ง์, Algolia๋ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ฅผ ์์ฑํฉ๋๋ค.
์ค์ ๋ก MeiliSearch API๋ ์์ง ์ด ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค.
๋์ ์๋ฃจ์
์ผ๋ก ๋๋ถ๋ถ์ SDK๋ get_or_create_index
๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค(PHP SDK๊ฐ ํ๋ ๊ฒ์ฒ๋ผ) ๐
๋ณํ ์์ด ๋ฌธ์๋ก ID๋ฅผ ์ธ๋ฑ์ฑํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ JSON ์ ํจ์ฑ์์ ๋น๋กฏ๋์์ต๋๋ค. Algolia API๋ ์ ํจํ์ง ์์ JSON์ ํ์ฉํ์ง ์์ต๋๋ค. ์ซ์๋ฅผ ์ธ์ฉํ์ง ์๊ณ ๋ฌธ์๊ฐ ํฌํจ๋ ์ซ์๋ฅผ ๋ณด๋ด๋ ๊ฒ( "
)์ ์ ํจํ์ง ์์ JSON์ผ๋ก ๊ฐ์ฃผ๋์ด ์คํจํฉ๋๋ค.
Algolia ๋์๋ณด๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
Algolia์ Laravel SDK๋ ๋ฌธ์๊ฐ ํฌํจ๋ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ฏ๋ก ์คํจ๊ฐ ์์์ ๊ฒ์ ๋๋ค ๐
MS์๋ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ด ๋ชจ๋ ํฌํจ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ meilisearch-laravel-scout
์๋ "์ธ์ฉ ๊ธฐ๋ฅ"์ด ํฌํจ๋ ์ ์์ง๋ง MeiliSearch๋ ์ ํจํ JSON์ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์ ํฌํจํ ์ ์์ต๋๋ค ๐
์, ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ด Scout Engine์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ผ๋ฉฐ ์ฌ๊ธฐ์์ Scout ํตํฉ์ ์์ต๋๋ค.
SDK๋ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์์ง๋ง ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด Scout๊ฐ ์คํจํฉ๋๋ค.
๋ฌธ์๊ฐ ์๋ Id์ ๋์ผํ๊ฒ JSOn์ ํ์์ด ์๋ชป๋์์์ ์ดํดํ์ง๋ง Scout ์์ง์ ์คํจํ๊ธฐ ์ ์ ์ด๋ฅผ ์ ์ดํฉ๋๋ค.
Algolia์ ๊ฒฝ์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฌธ์๋ก ์คํจํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์์ด ์์์ด ์ดํด๊ฐ ์ ์๋์ด ๐
๊ทธ๋ฐ ๋ค์ ๊ตฌํํ๊ธฐ์ ์ข์ ๊ธฐ๋ฅ์ด ๋ ์ ์์ต๋๋ค! ๐
ํธ์ง: meilisearch-php ๋๋ meilisearch-laravel-scout ํจํค์ง์์ ๊ตฌํํ๋์ง ์๊ฐํด์ผ ํฉ๋๋ค.
@curquiza
๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ๋ ๋ค ์ข์ต๋๋ค.
scout์์ ๊ตฌํํ๋ค๋ฉด symfony(๋ฐ ๊ธฐํ ํ๋ ์์ํฌ ๊ตฌํ)๋ ๊ตฌํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(์ด๋ฏธ ๊ทธ๋ด ์๋ ์์). ๋ฐ๋ผ์ ๋์ SDK์ ์๋ ๊ฒ์ด ๋ ๋์ ์ ์์ต๋๊น?
์ค์นด์ฐํธ๊ฐ Algolia์ฉ์ผ๋ก ๊ตฌํํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ด๊ฒ์ด Algolia PHP SDK์์ ์ฒ๋ฆฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฝ๊ฐ์ ์ฌ์ ์๊ฐ์ด ์์ ๋ ์ด๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค.
@shokme , ๋ง์ต๋๋ค. laravel-scout ํตํฉ๋ณด๋ค๋ PHP SDK์์ ์ํํ๋ ๊ฒ์ด ๋ ํ๋ช
ํ ์ ์์ต๋๋ค.
์กฐ์ฌ์ ๋ํด ์๋ ค์ฃผ์๋ฉด ๊ทธ์ ๋ฐ๋ผ ๋ฌธ์ ๋ฅผ ์ด๋(๋๋ ๋ค์ ์์ฑ)ํ๊ฒ ์ต๋๋ค! ๐
๊ทธ๋์ ๋ชจ๋ ๊ฒ์ ์กฐ์ฌํ ํ.
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();
๋ชจ๋ธ์ ๋ฌธ์ ์์ด meilisearch๋ก ๋ณด๋ด์ก์ต๋๋ค!
{
"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
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ํฉ๋๋ค