microCMS

Serverless Functions + microCMSで全文検索APIを作成する

植田博樹

この記事は公開後、1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

この記事はmicroCMS Advent Calendar 2021 2日目の記事です。

Jamstackアーキテクチャーで構成している場合、検索機能は悩みの種だと思います。最近だとAlgoliaという検索機能をAPIとして提供しているSaaSも存在していて、Jamstackアーキテクチャーと相性がいいです。

ですが、もしヘッドレスCMSにmicroCMSを利用している場合、qパラメータを使うことで全文検索を実現することができます。

qパラメータについて

qパラメータはコンテンツの全文検索を行えるパラメータです。使い方としては、クエリストリングとして?q=を付与します。検索対象となるフィールドは、テキストフィールド、テキストエリア、リッチエディタです。日本語などのマルチバイト文字列の検索を行う際はURLエンコードして値を渡す必要があります。

qパラメータに関してはドキュメントも合わせてご覧ください。

microCMSブログでは、サイト内検索としてすでにqパラメータを利用した検索機能が導入されています。ぜひお試してください。

Serverless Functionsを利用する意図

クライアントで直接APIキーを含んでリクエストする場合APIキーの流失に繋がる可能性があります。microCMSではAPIキーに多様な権限管理ができるので、適切な権限を付与していれば重大なセキュリティリスクはありません。ですが、出来るだけAPIキーの流失を防ぐためにサーバーサイドで実行するべきだと考えます。

そこで、Vercelの機能であるServerless Functionsを中間処理として使って、サーバーサイドでmicroCMSのデータを取得してみましょう。

Serverless Functionsはサーバー管理不要でサーバーサイドのコードを実行できる技術です。 類似サービスとして、AWS Lambad FunctionsやGoogle Cloud Functionsが挙げられます。

Next.jsではAPI RoutesというServerless Functionsと同等のAPIがあります。しかし、これは内包されたAPIなので、Next.js以外でサーバレスでコードを実行したい場合はServerless Functionsが便利です。

microCMS側の準備

まずは、microCMS側でAPIを準備しましょう。ここでは例として、API名をコンテンツ、エンドポイントをcontentとします。

そして、APIの型はリスト形式を選択しましょう。


qパラメータの検索対象であるテキストフィールドとリッチエディタを定義します。


APIの作成が完了したら、適当なコンテンツを入稿してみましょう。


microCMSでは、管理画面から実際のレスポンスを確認できるAPIプレビュー機能があります。コンテンツの一覧から、右上のAPIプレビューをクリックしてみましょう。

Paramsという項目があるので、qパラメータをKeyに指定して、Valueに検索対象となる文言を入れてみましょう。

こちらはレスポンス例です。検索対象のコンテンツを絞り込むことができました。これを念頭において、Serverless Functionsで全文検索用のAPIを実装していきましょう。

{
    "contents": [
        {
            "id": "ty8t5673l",
            "createdAt": "2021-12-01T04:49:01.762Z",
            "updatedAt": "2021-12-01T04:49:01.762Z",
            "publishedAt": "2021-12-01T04:49:01.762Z",
            "revisedAt": "2021-12-01T04:49:01.762Z",
            "title": "これはテスト記事です!",
            "body": "<p>ここに内容を記述</p>"
        }
    ],
    "totalCount": 1,
    "offset": 0,
    "limit": 10
}


Serverless Functionsのセットアップ

Serverless Functiosをローカルで開発するには、Vercelのアカウントを作成し、グローバル環境にVercelをインストールする必要があります。そして、vercel loginを実行してアカウント認証も済ませておきましょう。

$ npm install -g vercel
$ vercel login

準備が整ったので、Serverless Functionsを実行する環境を作成しましょう。

$ mkdir  serverless-test && cd serverless-test

Serverless Functionsのコード例は以下になります。apiフォルダを作成して、hello.jsファイルを作成しましょう。?name=hogehogeとしてnameに値を渡すと、Hello hogehoge!という文言がレスポンスとして返却される関数を作成します。

//api/hello.js
export default function handler(req, res) {
  const { name } = req.query;
  res.end(`Hello ${name}!`);
}

vercel devコマンドを実行してcurlもしくはブラウザで、http://localhost:3000/api/hello?name=hogehogeにアクセスすると、Hello hogehoge!という文字列がブラウザに表示されます。

$ vercel dev

Serverless Functionsで全文検索APIを実装する

Serverless Functionsの実行環境が整ったので全文検索APIを作成します。 まずは、microCMSのデータを取得するためSDKをインストールしてください。

$ npm init -y //package.jsonがないので作成する
$ npm install microcms-js-sdk

libsフォルダの中にclient.jsを作成します。ここではclientコードの初期化を行います。service-domainapi-keyはご自身のものを準備してください。

import { createClient } from "microcms-js-sdk";

export const client = createClient({
  serviceDomain: 'service-domain', 
  apiKey: 'api-key',
});

apiフォルダの中にsearch.jsというファイルを作成して以下のコードを追加してください。queriesに取得した値を渡します。これで実装は完了です。

//api/search.js
const { client } = require('../libs/client');

export default async function handler(req, res) {
  const { q } = req.query;
  const result = await client
  .get({
    endpoint: 'content',
    queries: { q: q },
  })
  res.json(result);
}

curlやブラウザ等で以下のURLにアクセスして確認してみましょう。

http://localhost:3000/api/search?q=これはテスト

実際のレスポンスは同じjsonですが、サーバーサイドでデータを取得できました。セキュリティ的に気になる方はcors等でアクセスを制限しましょう。corsでの制限方法はVercelのドキュメントを参照してください。

今回作成したコードをVercelにデプロイしていきましょう。

$ vercel deploy

Vercelにアクセスするとプロジェクトが作成できていることが確認できます。

最後に

以上、Serverless FunctionsとmicroCMSのqパラメータを用いた全文検索APIの作成でした。Serverless Functionsを用いたAPIキーの隠蔽は、POSTリクエスト等のWrite系 APIで重要になってきます。ぜひ今回の記事を参考にして実装してみてください。


-----

microCMSは日々改善を進めています。
ご意見・ご要望は管理画面右下のチャット、公式Twitterお問い合わせからお気軽にご連絡ください!
引き続きmicroCMSをよろしくお願いいたします!

まずは、無料で試してみましょう。

APIベースの日本製ヘッドレスCMS「microCMS」を使えば、 ものの数分でAPIの作成ができます。

microCMSを無料で始める

microCMSについてお問い合わせ

初期費用無料・14日間の無料トライアル付き。ご不明な点はお気軽にお問い合わせください。

お問い合わせ

microCMS公式アカウント

microCMSは各公式アカウントで最新情報をお届けしています。
フォローよろしくお願いします。

  • X
  • Discord
  • github

ABOUT ME

植田博樹
プロダクト開発と犬が好き。Jamstack アーキテクチャーやサーバレス技術に興味があります。