JavaScript で Elasticsearch を正しく使う方法、パート II

運用のベスト プラクティスを確認し、サーバーレス環境で Elasticsearch Node.js クライアントを実行する方法を説明します。

Elasticsearch を実際に体験してみましょう。サンプルノートブックを詳しく調べたり、Elastic の無料クラウドトライアルを開始したり、今すぐローカルマシンで Elastic を試したりできます。

これは、JavaScript での Elasticsearch シリーズの第 2 部です。最初の部分では、環境を正しくセットアップし、Node.js クライアントを構成し、データをインデックスして検索する方法を学びました。この第 2 部では、実稼働のベスト プラクティスを実装し、サーバーレス環境で Elasticsearch Node.jsクライアントを実行する方法を学習します。

以下を確認します:

ここで 例付きのソースコードを確認できます

制作のベストプラクティス

エラー処理

Node.js の Elasticsearch クライアントの便利な機能は、Elasticsearch で発生する可能性のあるエラーのオブジェクトを公開し、さまざまな方法で検証して処理できることです。

すべてを表示するには、次のコマンドを実行します。

検索の例に戻り、起こりうるエラーのいくつかを処理してみましょう。

ResponseError 特に、回答が4xxまたは5xx場合に発生します。これは、要求が正しくないか、サーバーが利用できないことを意味します。

このタイプのエラーは、テキストタイプのフィールドで用語クエリを実行するなど、間違ったクエリを生成することでテストできます。

デフォルトエラー:

カスタマイズされたエラー:

各タイプのエラーを特定の方法でキャプチャして処理することもできます。たとえば、 TimeoutErrorに再試行ロジックを追加できます。

テスト

テストはアプリの安定性を保証する上で重要です。Elasticsearch から分離された方法でコードをテストするには、クラスターを作成するときにライブラリelasticsearch-js-mock を使用できます。

このライブラリを使用すると、実際のクライアントと非常によく似たクライアントをインスタンス化できますが、クライアントの HTTP レイヤーのみをモックのレイヤーに置き換え、残りは元のレイヤーと同じにすることで、構成に応答します。

自動テスト用に、モック ライブラリとAVAをインストールします。

npm install @elastic/elasticsearch-mock

npm install --save-dev ava

テストを実行するためにpackage.jsonファイルを構成します。次のようになっていることを確認してください:

それでは、 test.jsファイルを作成し、モッククライアントをインストールしましょう。

次に、セマンティック検索のモックを追加します。

これで、コードのテストを作成し、Elasticsearch 部分が常に同じ結果を返すことを確認できるようになりました。

テストを実行してみましょう。

npm run test

完了です!これからは、外部要因ではなくコードに100%重点を置いてアプリをテストできます。

サーバーレス環境

Elastic Serverlessでクライアントを実行する

クラウドまたはオンプレミスでの Elasticsearch の実行について説明しましたが、Node.js クライアントはElastic Cloud Serverlessへの接続もサポートしています。

Elastic Cloud Serverless を使用すると、Elastic がインフラストラクチャを内部で処理するためインフラストラクチャについて心配する必要がないプロジェクトを作成でき、インデックスを作成するデータとそのデータにアクセスする期間のみを考慮すれば済みます。

使用の観点から見ると、Serverless はコンピューティングとストレージを切り離し、検索インデックス作成の両方に自動スケーリング機能を提供します。これにより、実際に必要なリソースのみを増やすことができます。

クライアントは、Serverless に接続するために次の調整を行います。

  • スニッフィングをオフにし、スニッフィング関連のオプションを無視します
  • 最初のノードを除いて、config で渡されたすべてのノードを無視し、ノードのフィルタリングと選択のオプションも無視します。
  • 圧縮と `TLSv1_2_method` を有効にします(Elastic Cloud 用に構成した場合と同じ)
  • すべてのリクエストに `elastic-api-version` HTTP ヘッダーを追加します
  • デフォルトでは `WeightedConnectionPool` ではなく `CloudConnectionPool` を使用します
  • 標準の MIME タイプを優先して、ベンダーの `content-type` および `accept` ヘッダーをオフにします。

サーバーレス プロジェクトを接続するには、パラメーター serverMode: serverless を使用する必要があります。

Function-as-a-Service 環境でクライアントを実行する

この例では Node.js サーバーを使用しましたが、AWS lambda、GCP Run などの機能を備えた Function-as-a-Service 環境を使用して接続することもできます。

もう 1 つの例は、同じくサーバーレスである Vercel などのサービスに接続することです。これを実行する方法の完全な例を確認できますが、検索エンドポイントの最も重要な部分は次のようになります。

このエンドポイントは /api フォルダーにあり、サーバー側から実行されるため、クライアントは検索用語に対応する「テキスト」パラメータのみを制御できます。

Function-as-a-Service を使用する意味は、24 時間 365 日稼働するサーバーとは異なり、関数は関数を実行するマシンのみを起動し、関数が終了するとマシンは休止モードになり、消費するリソースが少なくなることです。

この構成は、アプリケーションがあまり多くのリクエストを受け取らない場合には便利ですが、そうでない場合はコストが高くなる可能性があります。また、関数のライフサイクルと実行時間 (場合によっては数秒しかないこともあります) も考慮する必要があります。

まとめ

この記事では、実稼働環境で非常に重要なエラーの処理方法を学びました。また、Elasticsearch サービスをモックしながらアプリケーションをテストする方法についても説明しました。これにより、クラスターの状態に関係なく信頼性の高いテストが提供され、コードに集中できるようになります。

最後に、Elastic Cloud Serverless と Vercel アプリケーションの両方をプロビジョニングして、完全にサーバーレスなスタックを立ち上げる方法を示しました。

関連記事

最先端の検索体験を構築する準備はできましたか?

十分に高度な検索は 1 人の努力だけでは実現できません。Elasticsearch は、データ サイエンティスト、ML オペレーター、エンジニアなど、あなたと同じように検索に情熱を傾ける多くの人々によって支えられています。ぜひつながり、協力して、希望する結果が得られる魔法の検索エクスペリエンスを構築しましょう。

はじめましょう