ECプラットフォームからコンテンツ管理システム(CMS)に至るまで、ウェブアプリケーションは膨大な量のデータを生成・処理しています。このデータから関連情報を効率的に抽出することは、シームレスなユーザー体験の提供において極めて重要です。つまり、単語単位でクエリを照合する従来の検索機能では不十分。全文検索が必要になります。

全文検索は、ドキュメントやデータベースの全内容を調べ、特定の単語やフレーズに基づいて大規模なデータセットから関連情報を取得します。出現頻度や多言語コンテンツなどの要素を考慮して、より正確で包括的な検索結果を得ることができます。

そして、Meilisearchはこの分野を牽引する存在。全文検索機能をフル活用し、開発者とエンドユーザーの両方を考慮して設計された強力なツールを提供しています。

今回は、MeilisearchをNode.jsアプリケーションに統合する方法を見ていきます。

Meilisearchとは

Meilisearchは、エンドユーザーに光の速さで検索結果を返すオープンソースの検索エンジンです。入力ミスに強く、あらゆるプロジェクトに対応するデフォルト設定ですぐに利用を始めることができます。

また、検索結果の関連性を調整する機能が多数揃っており、カスタマイズ性にも優れています。特に注目の機能はランキングルールで、要件に応じて編集することができます。

直感的なRESTful APIを提供しているため、事実上あらゆるビジネスサイトにシームレスに統合可能です。自社でホスティングすることもできますが、公式クラウドホスティングであるMeilisearch Cloudを利用する手も。今回は、Meilisearch Cloudを利用した例をご紹介します。

前提条件

Meilisearchの統合には、以下が必要になります。

Meilisearchの設定方法

  1. Meilisearch Cloudにアクセスし、アカウントを作成するかログイン(メールアドレスの確認をお忘れなく)。
  2. Create a project」をクリックし、Meilisearchインスタンスを実行するサーバー(サイトのデータセットを追加する場所)を作成。
  3. Project name」にプロジェクト名(今回は「book-app」)を追加し、任意の地域を選択して、「Create」をクリック。プロジェクトの作成後、「Settings」をクリックすると、データセットにアクセスするためのURL、Meilisearchインスタンスを保護するためのAPIキーなど、プロジェクトの詳細情報が表示されます。
    book-appプロジェクトの概要ページ
    book-appプロジェクトの概要ページ

    APIキーは3種類あり、それぞれ異なる認証レベルが設定されています。

    • Master key:すべてのルートのロックを解除し、APIキーの作成と削除のためのエンドポイントにアクセスできる唯一のキー。保護された環境からAPIキーを管理するには、このキーのみを使用してください。
    • Default Search API Key検索ルートへのアクセスのみ。クライアント側のコードで使用することができます。
    • Default Admin API Key:APIキーの作成と削除を行う/keysを除くすべてのAPIルートにアクセス可能。保護された環境からのみ使用することができます。

Meilisearchでインデックスを作成する方法

インデックスは、検索可能なデータを保存・整理するコアコンポーネントです。1つ以上のフィールドを含むオブジェクトであるドキュメントのコンテナとして機能します。

Meilisearchの各インデックスは独立しており、それぞれカスタマイズ可能。別の検索ランキングルールやフィルタリングオプションを設定することができます。

インデックスの作成とドキュメントの追加

  1. ナビゲーションバーで、プロジェクトの「Index」タブをクリック。
  2. Create an index」をクリックし、インデックス名(今回は「書籍」)を入力したら、「Create index」をクリック。
  3. ドキュメントのインポート方法を選択。今回はGoogle Book API(書籍検索 API)から13冊の書籍を含むJSONファイルをインポート。
  4. File upload」をクリックしてJSONファイルをアップロードし、「Import documents」をクリック。

ドキュメントの更新と削除

現在、Meilisearch Cloudにはドキュメントを修正・削除する方法がありませんが、代替としてREST APIルートまたはSDKを使用することができます。以下のコードは、REST APIのエンドポイントを使用して、ドキュメントを更新または削除する方法です。今回は例としてcURLでルートを操作しますが、PostmanのようなAPIプラットフォームを使用することもできます。

  1. ドキュメントを更新するには、以下のルートでPUTリクエストを送信します。
    /indexes/{index_uid}/documents

    上記のindex_uidは、プロジェクトのインデックス名になります。

    強調表示されたインデックス名
    強調表示されたインデックス名

  2. ドキュメントのリストがすでに存在する場合、このルートで追加または更新することができます。ドキュメントを更新するには、その主キーを追加する必要があります。古いドキュメントは、新しいドキュメントのフィールドに基づいて部分的に更新され、このドキュメントに含まれていないフィールドはそのまま残ります。以下は、書籍インデックスにあるドキュメントのタイトルを「子ども向けJavaScript」から「子ども向けJavaScriptコーディング」に変更し、出版社フィールドを追加する例です。
    curl \
        -X PUT '/indexes/books/documents' \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer ' \
            --data-binary '[
            {
                "id": "71nDBQAAQBAJ",
                "title": "子ども向けJavaScriptコーディング",
                "publisher": "No Starch Press"
            }
        ]'
  3. <your-project-url><your-admin-api-key>を「Project overview」ページの対応する値に置き換えます。
    "taskUid": 26, "indexUid": "books", "status": "enqueued", "type": "documentAdditionOrUpdate", "equeuedAt": "2023-05-26T07:52:24.127920065Z"
  4. Meilisearchには、ドキュメントの削除用に3つのルート(エンドポイント)があります。
    /indexes/{index_uid}/documents // すべてのドキュメントを削除
    /indexes/{index_uid}/documents/{document_id} // 1つのドキュメントを削除
    /indexes/{index_uid}/documents/delete-batch // 選択したドキュメントを削除 

    document_idは、Meilisearch Cloudまたはデータベースからドキュメントを取得した後、books.jsonファイルから元のデータを取得します。

以下は、上記で更新した書籍を削除する例です。

curl \
    -H 'Authorization: Bearer ' \
    -X DELETE '/indexes/books/documents/71nDBQAAQBAJ'

リクエストを送信すると、以下のようなレスポンスが返ってきます。

"taskUid": 10, "indexUid": "books", "status": "enqueued", "type": "documentDeletion", "equeuedAt": "2023-05-26T07:20:11.1291066"

ウェブサービスにMeiliSearchを追加する方法

  1. まずはターミナルで以下のコマンドを実行し、GitHub からスタータープロジェクトを複製します。
    git clone https://github.com/Tammibriggs/meilisearch-app.git
    cd meilisearch​-app
    npm install

    package.jsonファイルを確認すると、startコマンドがあります。npm startを実行し、Node.jsプロジェクトをlocalhost port3000で稼働します。ブラウザで「http://localhost:3000/」にアクセスすると、以下のページが表示されます。

    Meilisearchのスターターアプリのデモ
    Meilisearchのスターターアプリのデモ

  2. アプリが起動したら、Meilisearchを追加します。検索フォームが送信されると、Meilisearchからの結果を返すようにすることができます。ターミナルで以下のコマンドを実行し、Meilisearchをインストールしてください。
    npm install meilisearch
  3. 機密情報を読み込むため、.env ファイルからdotenvのnpmパッケージをインストールします。ターミナルで以下のコマンドを実行してください。
    npm install dotenv
  4. プロジェクトのルートフォルダに.envファイルを作成し、以下を追加します。
    YOUR_PROJECT_URL= '<your-project-url>'
    YOUR_SEARCH_API_KEY= '<your-admin-api-key>'

    <your-project-url><your-admin-api-key>は、対応する値に置き換えます。

  5. meilisearchdotenvパッケージをserver.jsファイルにインポートして、dotenvを設定します。
    import {MeiliSearch} from 'meilisearch'
    import dotenv from 'dotenv';
    dotenv.config();
  6. Meilisearchを初期化して、books-appプロジェクトで作業を行えるようにします。server.jsファイルに移動して、searchValue変数定義の後、以下のコードを貼り付けます。
    const client = new MeiliSearch({ host: process.env.YOUR_PROJECT_URL, apiKey: process.env.YOUR_SEARCH_API_KEY })
  7. 重要になるのが、フォームを送信する際にURLに添付された検索値を使用し、Meilisearchで書籍インデックスを検索する機能。この機能を有効にするには、client変数定義の後、以下のコードを貼り付けます。
    const index = client.index('books')  
    const searchResults = !!searchValue && await index.search(searchValue)

    このコードが書籍インデックスへの参照を生成し、それからsearchValueを定義した場合は、search()を使用して書籍インデックスから検索値に一致するドキュメントを検索します。

  8. 検索結果を表示するため、render()を以下のように編集します。
    res.render('index', {
        books: searchResults ? searchResults.hits : [],
        searchValue
    })

    以上で、書籍インデックスの検索を行う準備が整いました。

    検索フォームを使用した書籍インデックスの検索
    検索フォームを使用した書籍インデックスの検索

  9. 上記コードを追加すると、server.jsファイルは次のようになります。
    import express from 'express';
    import { MeiliSearch } from 'meilisearch';
    import dotenv from 'dotenv';
    dotenv.config();
    
    const app = express();
    const PORT = process.env.PORT || 3000;
    
    app.set('view engine', 'ejs');
    app.use(express.static('public'));
    
    app.get('/', async (req, res) => {
    	const searchValue = req.query.search;
    	const client = new MeiliSearch({
    		host: process.env.YOUR_PROJECT_URL,
    		apiKey: process.env.YOUR_SEARCH_API_KEY,
    	});
    	const index = client.index('books');
    	const searchResults = !!searchValue && (await index.search(searchValue));
    
    	res.render('index', {
    		books: searchResults ? searchResults.hits : [],
    		searchValue,
    	});
    });
    
    app.listen(PORT, () => {
    	console.log(`listening at http://localhost:${PORT}`);
    });

今回ご紹介したプロジェクトのコードの全貌はこちらでご覧いただけます。

まとめ

Meilisearchは、サイトの検索機能とユーザーエクスペリエンスを向上させる優れた検索エンジンです。圧倒的なスピード、関連性に焦点を当てた検索アルゴリズム、そしてシームレスな統合プロセスにより、サイトの検索機能を最適化することができます。

Kinstaのアプリケーションホスティングは、Meilisearchを搭載したアプリのパフォーマンスをシームレスに改善します。堅牢なインフラストラクチャと合理化されたサーバー環境により、迅速な検索機能が保証され、ユーザーエクスペリエンスも向上。スケーラブルでMeilisearchの要求にも柔軟に対応し、信頼性が高く効率的な検索操作をお約束します。

プロジェクトにどの検索エンジンを採用されていますか?以下のコメント欄でお聞かせください。

Jeremy Holcombe Kinsta

Kinstaのコンテンツ&マーケティングエディター、WordPress開発者、コンテンツライター。WordPress以外の趣味は、ビーチでのんびりすること、ゴルフ、映画。高身長が特徴。