データベース
 Computer >> コンピューター >  >> プログラミング >> データベース

Elasticsearchクエリが遅いのはなぜですか?

2018年5月29日にObjectRocket.com/blogで最初に公開されました。

Rackspace Technologyが頻繁に受け取るElasticsearch®のサポートリクエストの1つは、「応答時間のサポートをお願いします」です。または「クエリに時間がかかります。どうすればよいですか?」

Elasticsearchクエリが遅いのはなぜですか?

2つのアプローチ

これらのタイプの質問を受け取るときはいつでも、2つの主要な領域を調べることから始めます。

  • 運用面 –現在のシステムリソースとデフォルトのElasticsearchオプションを確認します。
  • 開発側 -クエリ、その構造、および検索しているデータのマッピングを確認します。

Elasticsearchの最適化に関する一連のブログ投稿の最初の記事では、これら2つの領域の後者に焦点を当てます。遅いクエリを取得し、ドメイン固有言語(DSL)クエリ言語について説明し、Elasticsearchクエリの改善に役立つオプションを検討します。

クエリはどれくらい遅いですか?

最初のステップは、クラスターにクエリを送信するのにかかる時間を確認することです。Elasticsearchのドキュメントでは、遅いログをオンにする方法が明確ではないため、この投稿でいくつかの例を示します。

まず、Elasticsearchには2つのバージョンの低速ログがあります。低速ログのインデックス作成と低速ログの検索です。解決しようとしている問題には低速クエリが含まれるため、低速ログの検索に重点を置いています。ただし、これがドキュメントのインデックス作成または追加中のパフォーマンスの問題に関するものである場合は、インデックスの遅いログを確認します。

Elasticsearchのすべてのバージョンはデフォルトで低速ログをオフにするため、クラスター設定とインデックス設定の両方をいくつか更新する必要があります。次の例ではElasticsearch 6.2を扱いますが、以前のバージョンに関する情報はここにあります。$ES_versionを次のように置き換えます。作業中のバージョン(バージョン5.5など)。

  • PUTを送信します _clusterへのリクエスト オンにする低速ログのレベルを定義するAPI:警告、情報、デバッグ、トレース(ログレベルの詳細)

    curl -XPUT http:// localhost:$ ES_PORT / _cluster / settings -H‘Content-Type:application / json’ -d’

      {
    

    “transient”:{“ logger.index.search.slowlog”:“ DEBUG”、“ logger.index.indexing.slowlog”:“ DEBUG”}}'

Elasticsearchはインデックスレベルですべての低速ロギングを有効にするため、インデックスにリクエストを送信できます _settings それをオンにするAPI。インデックスを毎月、四半期ごとなどにローテーションする場合も、インデックステンプレートに追加する必要があります。

  • ヒットしたい遅いログ時間のしきい値に一致するように、API呼び出しをインデックス設定に調整します。値をゼロに設定してインスタンスのプロファイルを作成し、送信されたすべてのクエリを収集するか、-1を設定して低速ログをオフにすることができます。

  • _clustersettingsで使用したのと同じログレベル設定を使用します。この例では、DEBUGES_PORT 永続的な環境変数です。

    curl -XPUT http:// localhost:$ ES_PORT / * / _ settings?pretty -H'Content-Type:application / json' -d'{“ index.search.slowlog.threshold.query.debug”:“-1” 、「index.search.slowlog。 threshold.fetch.debug”:“ -1”、}’

次に、ログを収集する必要があります。低速ログはシャードごとに生成され、データノードごとに収集されます。 5つのプライマリシャード(デフォルト値)を保持するデータノードが1つしかない場合、遅いログに1つのクエリに対して5つのエントリが表示されます。 Elasticsearchでの検索は各シャード内で行われるため、シャードごとに1つ表示されます。低速ログは、データノードごとに次のデフォルトの場所に保存されます: / var / log / elasticsearch /$ClusterID_index_slowlog_queryおよび/var/ log / elasticsearch / $ ClusterID_index_slowlog_fetch ご覧のとおり、検索の遅いログは、検索のフェーズ(フェッチとクエリ)に基づいて、別々のログファイルに再び分割されます。

ログに結果が表示されたので、エントリをプルして分解できます。

[2018-05-21T12:35:53,352][DEBUG ][index.search.slowlog.query] [DwOfjJF] [blogpost-slowlogs][4] took[1s],    took_millis[0], types[], stats[], search_type[QUERY_THEN_FETCH], total_shards[5], source[{"query":{"match":{"name":    {"query":"hello world", "operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions" :true, "lenient":false,"zero_terms_query": "NONE","boost":1.0}}},"sort":[{"price": {"order":"desc"}}]}],

ここに、次のように表示されます:

  • 日付のタイムスタンプ
  • ログレベル
  • スローログタイプ
  • ノード名
  • インデックス
  • シャード番号
  • 時間がかかりました
  • クエリの本文(_source>)

時間がかかりすぎると特定したクエリを取得したら、次のツールを使用してクエリを分類できます。

_ profile API

_profile APIは、検索に関する情報のページを提供し、各シャードで発生したことを各検索コンポーネントの個々のタイミングに分類します。検索が詳細になるほど、_profile出力はより詳細になります。

Kibanaプロファイリングツール

Kibana®ツールは、 _profileと連携します API。これにより、個々の検索コンポーネントとそれらが完了するまでにかかる時間が視覚的にわかりやすく表示されます。繰り返しになりますが、これにより、クエリの問題領域を特定できます。

Elasticsearchの2つのフェーズ:クエリしてからフェッチ

ここで、遅いクエリを特定し、プロファイラーで実行しました。個々のコンポーネントの時間結果を確認しても、検索は高速になりませんでした。それで?クエリがどのように機能するかを理解し、次の2つのフェーズを経て、Elasticsearchから最高の結果を得る方法で、速度と関連性の両方の観点からクエリを再設計できます。

クエリフェーズ
  • コーディネーターノードはクエリを受け入れます。
  • コーディネーターは、検索されている1つまたは複数のインデックスを識別します。
  • コーディネーターは、インデックスのシャードを含むノードのリストを作成します(プライマリとレプリカの両方が混在しています)。
  • コーディネーターはクエリをノードに送信します。
  • ノード上のシャードがクエリを処理します。
  • クエリは(デフォルトで)上位10のドキュメントにスコアリングされます。
  • リストはコーディネーターノードに返送されます。
フェッチフェーズ
  • フェッチフェーズはコーディネーターノードから始まります。コーディネーターノードは、各シャードから送信された50(5シャードx 10)の結果から上位10のドキュメントを決定します。
  • コーディネーターは、上位10個のドキュメントのリクエストをシャードに送信します(これは、スコアの高いドキュメントを含む1つのシャードである場合もあれば、複数のシャードに分散している場合もあります)。

リストが返された後、マスターはクエリ応答の_hitsセクションにドキュメントを表示します。

結果スコア

結果のスコアはElasticsearchの鍵となります。通常、検索エンジンを使用する場合は、最も正確な結果が必要です。たとえば、果物であるキウイを検索している場合、結果にキウイの靴磨きを含めたくありません。Elasticsearchは、指定したパラメータに基づいてクエリ結果をスコアリングします。クエリの関連性については、まったく別のブログ投稿で説明しています。 、ここで言及することが重要です。高速検索を行っても結果が探しているものではない場合、検索全体が時間の無駄でした。では、検索をどのように高速化しますか?

フィルター

検索のパフォーマンスを向上させる1つの方法は、フィルターを使用することです。フィルター処理されたクエリは、親友になることができます。検索でのフィルターはドキュメントスコアの結果に影響を与えないため、最初にフィルターをかけることが重要です。そのため、検索フィールドを減らすために使用するリソースはごくわずかです。

ブール一致を処理するフィルター処理されたクエリを使用すると、Xを含むすべてのドキュメントを検索してから、Yを含むかどうかをスコアリングできます。また、フィルターをキャッシュすることもできます。

Elasticsearchクエリを高速化する方法はフィルターだけではありません。今後のブログで、クエリのパフォーマンスを向上させるために使用できるメソッドについて詳しく説明します。

概要

いくつかの簡単な手順でクエリを最適化できます:

  • 低速ロギングを有効にして、実行時間の長いクエリを識別できるようにします
  • _profiling APIを介して識別された検索を実行し、個々のコンポーネントのタイミングを確認します
  • フィルター、フィルター、フィルター

Elasticsearchの管理について質問がありますか?無料トライアルでも、すべてのインスタンスでElasticsearchの深い専門知識を持つデータベース管理者へのアクセスが含まれています。開発に焦点を合わせ始め、Elasticsearch管理を処理しましょう。

Elasticsearch 6 with Kibanaの無料トライアルを試してみませんか?開始して、ご不明な点がありましたらお知らせください。

コメントや質問をするには、[フィードバック]タブを使用します。 セールスチャットをクリックすることもできます 今すぐチャットして会話を始めましょう。


  1. Mac の応答が遅いのはなぜですか?

    Windows であろうと Mac であろうと、他のすべてのコンピューターは、毎日の使用とキャッシュの蓄積によって速度が低下します。最終的にコンピュータの速度が低下し、Mac のパフォーマンスが低下します。気になる方、直し方が知りたい方。 Mac を高速化するためのヒントとコツをいくつかご紹介します。 Mac の動作が遅い問題を解決するためにそれらを試してみたい場合は、読み進めてください! 1.ハードディスクに空き容量がありません コンピューターのハード ドライブがいっぱいになっている場合、これがコンピューターの動作が遅くなる確かな理由である可能性があります。コンピュータのハードディスクの内

  2. 自宅のインターネットが遅い理由と、速度を上げるにはどうすればよいですか?

    遅いインターネット速度に不快感を覚え、購入したプランにだまされたと感じていますか?オンラインの速度テストを使用してチェックし、カタツムリのような姿勢を確認しましたか?心配する必要はありません。複数の理由が考えられます。また、インターネット サービス プロバイダーだけが常にデフォルトであるとは限りません。 Windows または Mac でさまざまなアクセラレータを使用して改善できますが、より深く掘り下げて状況を理解することをお勧めします。わずかな不具合が大きな問題を引き起こすこともあります。下にスクロールして、各ポイントでシナリオを学習してください。 1.ルーターは正しく設定されています