[{"data":1,"prerenderedAt":692},["ShallowReactive",2],{"docs-cloud/frameworks/strapi":3},{"id":4,"title":5,"body":6,"description":682,"extension":683,"meta":684,"navigation":220,"path":685,"seo":686,"seoDescription":687,"seoTitle":688,"sitemap":689,"stem":690,"__hash__":691},"docs/docs/cloud/frameworks/strapi.md","Strapi",{"type":7,"value":8,"toc":674},"minimark",[9,13,25,38,43,79,83,104,133,295,301,305,322,325,329,337,340,424,615,631,635,643,647,670],[10,11,5],"h1",{"id":12},"strapi",[14,15,16,17,24],"p",{},"The official ",[18,19,23],"a",{"href":20,"rel":21},"https://github.com/meilisearch/strapi-plugin-meilisearch",[22],"nofollow","strapi-plugin-meilisearch","\nkeeps your Strapi content types in sync with a Meilisearch index. Point it at\nyour CelerSearch instance and Strapi handles the indexing.",[14,26,27,28,32,33,37],{},"The current plugin supports ",[29,30,31],"strong",{},"Strapi 5",". For Strapi 4, use the plugin's\n",[34,35,36],"code",{},"v0.12"," branch and its README.",[39,40,42],"h2",{"id":41},"_1-install","1. Install",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-bash shiki shiki-themes github-light github-dark","npm install strapi-plugin-meilisearch\nnpm run build\n","bash","",[34,51,52,68],{"__ignoreMap":49},[53,54,57,61,65],"span",{"class":55,"line":56},"line",1,[53,58,60],{"class":59},"sScJk","npm",[53,62,64],{"class":63},"sZZnC"," install",[53,66,67],{"class":63}," strapi-plugin-meilisearch\n",[53,69,71,73,76],{"class":55,"line":70},2,[53,72,60],{"class":59},[53,74,75],{"class":63}," run",[53,77,78],{"class":63}," build\n",[39,80,82],{"id":81},"_2-configure","2. Configure",[14,84,85,86,89,90,93,94,97,98,103],{},"Copy the ",[29,87,88],{},"Endpoint URL"," and ",[29,91,92],{},"API key"," from your instance's ",[29,95,96],{},"Connection\ndetails"," at ",[18,99,102],{"href":100,"rel":101},"https://app.celersearch.com",[22],"app.celersearch.com",", and add them\nto your Strapi environment:",[44,105,108],{"className":46,"code":106,"filename":107,"language":48,"meta":49,"style":49},"CELERSEARCH_URL=https://your-endpoint-url\nCELERSEARCH_API_KEY=your-api-key\n",".env",[34,109,110,123],{"__ignoreMap":49},[53,111,112,116,120],{"class":55,"line":56},[53,113,115],{"class":114},"sVt8B","CELERSEARCH_URL",[53,117,119],{"class":118},"szBVR","=",[53,121,122],{"class":63},"https://your-endpoint-url\n",[53,124,125,128,130],{"class":55,"line":70},[53,126,127],{"class":114},"CELERSEARCH_API_KEY",[53,129,119],{"class":118},[53,131,132],{"class":63},"your-api-key\n",[44,134,139],{"className":135,"code":136,"filename":137,"language":138,"meta":49,"style":49},"language-js shiki shiki-themes github-light github-dark","module.exports = ({ env }) => ({\n  meilisearch: {\n    config: {\n      host: env('CELERSEARCH_URL'),\n      apiKey: env('CELERSEARCH_API_KEY'),\n\n      // Optional per-content-type options\n      restaurant: {\n        indexName: 'restaurants',\n        settings: {\n          filterableAttributes: ['categories'],\n        },\n      },\n    },\n  },\n})\n","config/plugins.js","js",[34,140,141,172,177,183,200,215,222,229,235,247,253,265,271,277,283,289],{"__ignoreMap":49},[53,142,143,147,150,153,156,159,163,166,169],{"class":55,"line":56},[53,144,146],{"class":145},"sj4cs","module",[53,148,149],{"class":114},".",[53,151,152],{"class":145},"exports",[53,154,155],{"class":118}," =",[53,157,158],{"class":114}," ({ ",[53,160,162],{"class":161},"s4XuR","env",[53,164,165],{"class":114}," }) ",[53,167,168],{"class":118},"=>",[53,170,171],{"class":114}," ({\n",[53,173,174],{"class":55,"line":70},[53,175,176],{"class":114},"  meilisearch: {\n",[53,178,180],{"class":55,"line":179},3,[53,181,182],{"class":114},"    config: {\n",[53,184,186,189,191,194,197],{"class":55,"line":185},4,[53,187,188],{"class":114},"      host: ",[53,190,162],{"class":59},[53,192,193],{"class":114},"(",[53,195,196],{"class":63},"'CELERSEARCH_URL'",[53,198,199],{"class":114},"),\n",[53,201,203,206,208,210,213],{"class":55,"line":202},5,[53,204,205],{"class":114},"      apiKey: ",[53,207,162],{"class":59},[53,209,193],{"class":114},[53,211,212],{"class":63},"'CELERSEARCH_API_KEY'",[53,214,199],{"class":114},[53,216,218],{"class":55,"line":217},6,[53,219,221],{"emptyLinePlaceholder":220},true,"\n",[53,223,225],{"class":55,"line":224},7,[53,226,228],{"class":227},"sJ8bj","      // Optional per-content-type options\n",[53,230,232],{"class":55,"line":231},8,[53,233,234],{"class":114},"      restaurant: {\n",[53,236,238,241,244],{"class":55,"line":237},9,[53,239,240],{"class":114},"        indexName: ",[53,242,243],{"class":63},"'restaurants'",[53,245,246],{"class":114},",\n",[53,248,250],{"class":55,"line":249},10,[53,251,252],{"class":114},"        settings: {\n",[53,254,256,259,262],{"class":55,"line":255},11,[53,257,258],{"class":114},"          filterableAttributes: [",[53,260,261],{"class":63},"'categories'",[53,263,264],{"class":114},"],\n",[53,266,268],{"class":55,"line":267},12,[53,269,270],{"class":114},"        },\n",[53,272,274],{"class":55,"line":273},13,[53,275,276],{"class":114},"      },\n",[53,278,280],{"class":55,"line":279},14,[53,281,282],{"class":114},"    },\n",[53,284,286],{"class":55,"line":285},15,[53,287,288],{"class":114},"  },\n",[53,290,292],{"class":55,"line":291},16,[53,293,294],{"class":114},"})\n",[14,296,297,298,300],{},"You can also enter the host and key on the plugin's settings tab in the admin\npanel. Values in ",[34,299,137],{}," take precedence.",[39,302,304],{"id":303},"_3-index-your-content-types","3. Index your content types",[306,307,308,319],"ol",{},[309,310,311,312,315,316,149],"li",{},"In the Strapi admin, open ",[29,313,314],{},"Meilisearch"," under ",[29,317,318],{},"Plugins",[309,320,321],{},"Tick the content types you want searchable. Indexing starts right away.",[14,323,324],{},"From then on, the plugin updates the index as entries are created, updated,\npublished and deleted.",[39,326,328],{"id":327},"_4-search-from-your-frontend","4. Search from your frontend",[14,330,331,332,336],{},"The plugin's docs suggest searching from the browser with a public search key.\nOn CelerSearch, the instance API key has full access and custom keys can't\nconnect yet (see\n",[18,333,335],{"href":334},"/docs/cloud/connect-any-app#search-from-the-browser","Connect Any App","), so\nsend searches through your backend instead.",[14,338,339],{},"For example, a Strapi custom route can search with the official SDK:",[44,341,344],{"className":135,"code":342,"filename":343,"language":138,"meta":49,"style":49},"module.exports = {\n  routes: [\n    {\n      method: 'GET',\n      path: '/search',\n      handler: 'search.find',\n      config: { auth: false },\n    },\n  ],\n}\n","src/api/search/routes/search.js",[34,345,346,359,364,369,379,389,399,410,414,419],{"__ignoreMap":49},[53,347,348,350,352,354,356],{"class":55,"line":56},[53,349,146],{"class":145},[53,351,149],{"class":114},[53,353,152],{"class":145},[53,355,155],{"class":118},[53,357,358],{"class":114}," {\n",[53,360,361],{"class":55,"line":70},[53,362,363],{"class":114},"  routes: [\n",[53,365,366],{"class":55,"line":179},[53,367,368],{"class":114},"    {\n",[53,370,371,374,377],{"class":55,"line":185},[53,372,373],{"class":114},"      method: ",[53,375,376],{"class":63},"'GET'",[53,378,246],{"class":114},[53,380,381,384,387],{"class":55,"line":202},[53,382,383],{"class":114},"      path: ",[53,385,386],{"class":63},"'/search'",[53,388,246],{"class":114},[53,390,391,394,397],{"class":55,"line":217},[53,392,393],{"class":114},"      handler: ",[53,395,396],{"class":63},"'search.find'",[53,398,246],{"class":114},[53,400,401,404,407],{"class":55,"line":224},[53,402,403],{"class":114},"      config: { auth: ",[53,405,406],{"class":145},"false",[53,408,409],{"class":114}," },\n",[53,411,412],{"class":55,"line":231},[53,413,282],{"class":114},[53,415,416],{"class":55,"line":237},[53,417,418],{"class":114},"  ],\n",[53,420,421],{"class":55,"line":249},[53,422,423],{"class":114},"}\n",[44,425,428],{"className":135,"code":426,"filename":427,"language":138,"meta":49,"style":49},"const { Meilisearch } = require('meilisearch')\n\nconst client = new Meilisearch({\n  host: process.env.CELERSEARCH_URL,\n  apiKey: process.env.CELERSEARCH_API_KEY,\n})\n\nmodule.exports = {\n  async find(ctx) {\n    const { hits } = await client.index('restaurants').search(String(ctx.query.q ?? ''), {\n      limit: 20,\n    })\n    ctx.body = hits\n  },\n}\n","src/api/search/controllers/search.js",[34,429,430,456,460,478,487,496,500,504,516,532,582,592,597,607,611],{"__ignoreMap":49},[53,431,432,435,438,440,443,445,448,450,453],{"class":55,"line":56},[53,433,434],{"class":118},"const",[53,436,437],{"class":114}," { ",[53,439,314],{"class":145},[53,441,442],{"class":114}," } ",[53,444,119],{"class":118},[53,446,447],{"class":59}," require",[53,449,193],{"class":114},[53,451,452],{"class":63},"'meilisearch'",[53,454,455],{"class":114},")\n",[53,457,458],{"class":55,"line":70},[53,459,221],{"emptyLinePlaceholder":220},[53,461,462,464,467,469,472,475],{"class":55,"line":179},[53,463,434],{"class":118},[53,465,466],{"class":145}," client",[53,468,155],{"class":118},[53,470,471],{"class":118}," new",[53,473,474],{"class":59}," Meilisearch",[53,476,477],{"class":114},"({\n",[53,479,480,483,485],{"class":55,"line":185},[53,481,482],{"class":114},"  host: process.env.",[53,484,115],{"class":145},[53,486,246],{"class":114},[53,488,489,492,494],{"class":55,"line":202},[53,490,491],{"class":114},"  apiKey: process.env.",[53,493,127],{"class":145},[53,495,246],{"class":114},[53,497,498],{"class":55,"line":217},[53,499,294],{"class":114},[53,501,502],{"class":55,"line":224},[53,503,221],{"emptyLinePlaceholder":220},[53,505,506,508,510,512,514],{"class":55,"line":231},[53,507,146],{"class":145},[53,509,149],{"class":114},[53,511,152],{"class":145},[53,513,155],{"class":118},[53,515,358],{"class":114},[53,517,518,521,524,526,529],{"class":55,"line":237},[53,519,520],{"class":118},"  async",[53,522,523],{"class":59}," find",[53,525,193],{"class":114},[53,527,528],{"class":161},"ctx",[53,530,531],{"class":114},") {\n",[53,533,534,537,539,542,544,546,549,552,555,557,559,562,565,567,570,573,576,579],{"class":55,"line":249},[53,535,536],{"class":118},"    const",[53,538,437],{"class":114},[53,540,541],{"class":145},"hits",[53,543,442],{"class":114},[53,545,119],{"class":118},[53,547,548],{"class":118}," await",[53,550,551],{"class":114}," client.",[53,553,554],{"class":59},"index",[53,556,193],{"class":114},[53,558,243],{"class":63},[53,560,561],{"class":114},").",[53,563,564],{"class":59},"search",[53,566,193],{"class":114},[53,568,569],{"class":59},"String",[53,571,572],{"class":114},"(ctx.query.q ",[53,574,575],{"class":118},"??",[53,577,578],{"class":63}," ''",[53,580,581],{"class":114},"), {\n",[53,583,584,587,590],{"class":55,"line":255},[53,585,586],{"class":114},"      limit: ",[53,588,589],{"class":145},"20",[53,591,246],{"class":114},[53,593,594],{"class":55,"line":267},[53,595,596],{"class":114},"    })\n",[53,598,599,602,604],{"class":55,"line":273},[53,600,601],{"class":114},"    ctx.body ",[53,603,119],{"class":118},[53,605,606],{"class":114}," hits\n",[53,608,609],{"class":55,"line":279},[53,610,288],{"class":114},[53,612,613],{"class":55,"line":285},[53,614,423],{"class":114},[14,616,617,618,621,622,625,626,630],{},"Install the SDK with ",[34,619,620],{},"npm install meilisearch",". Your frontend then calls\n",[34,623,624],{},"GET /api/search?q=…",". If your frontend is a Next.js app, the\n",[18,627,629],{"href":628},"/docs/cloud/frameworks/nextjs","Next.js guide"," shows the same idea with React\nInstantSearch.",[39,632,634],{"id":633},"plans-and-limits","Plans and limits",[14,636,637,638,642],{},"Each indexed entry is one document toward your plan's\n",[18,639,641],{"href":640},"/docs/cloud/plans","document limit",". Searches are always unlimited. At the\nlimit, new writes are refused until you delete documents or move to a larger\nplan.",[39,644,646],{"id":645},"next-steps","Next steps",[648,649,650,656,663],"ul",{},[309,651,652,655],{},[18,653,335],{"href":654},"/docs/cloud/connect-any-app",": connection details and platform responses",[309,657,658,662],{},[18,659,661],{"href":660},"/docs/cloud/migrate","Migrate to CelerSearch",": move an existing index from another Meilisearch",[309,664,665,669],{},[18,666,668],{"href":667},"/pricing","Pricing",": plans by document count",[671,672,673],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":49,"searchDepth":70,"depth":70,"links":675},[676,677,678,679,680,681],{"id":41,"depth":70,"text":42},{"id":81,"depth":70,"text":82},{"id":303,"depth":70,"text":304},{"id":327,"depth":70,"text":328},{"id":633,"depth":70,"text":634},{"id":645,"depth":70,"text":646},"Index your Strapi content in a managed CelerSearch instance with the official Meilisearch plugin, then search it from your frontend through a small backend endpoint.","md",{},"/docs/cloud/frameworks/strapi",{"title":5,"description":682},"Connect strapi-plugin-meilisearch to a managed Meilisearch instance. Configure the plugin, index content types, and search them securely from your frontend.","Strapi Search with Managed Meilisearch",{"loc":685},"docs/cloud/frameworks/strapi","uMUHdFqFFS86Lr2up-JdIzy1apaV8Fiteqo9CHmxVmc",1792316274563]