ホームページ  >  記事  >  バックエンド開発  >  MySQL と PHP での ES の使用

MySQL と PHP での ES の使用

coldplay.xixi
coldplay.xixi転載
2020-09-01 17:36:384331ブラウズ

MySQL と PHP での ES の使用

ES の概要

スケーラブルなオープンソースの全文検索および分析エンジンで、迅速に保存および検索できます。準リアルタイムで大量のデータを分析します。
全文検索とは、記事内のすべての単語をスキャンし、各単語のインデックスを作成し、記事内の単語の番号と位置を示すコンピューターのインデックス作成プログラムを指します。ユーザーがクエリを実行すると、検索プログラムが構築されます。事前に確立されたインデックスに基づくインデックス インデックスを検索し、検索結果をユーザーの検索メソッドにフィードバックします。このプロセスは、辞書の検索語リストから単語を検索するプロセスに似ています。検索エンジン データベース内のデータの全文検索

なぜ ES は mysql より速いのか

Mysql には用語辞書層しかなく、ディスク上に b 形式で保存されます。 -ツリーソート方法 アップ。用語を取得するには、いくつかのランダム アクセス ディスク操作が必要です。 Lucene は、検索を高速化するために用語辞書に用語インデックスを追加します。用語インデックスはツリー形式でメモリにキャッシュされます。用語インデックスから対応する用語辞書のブロック位置を見つけた後、ディスクに移動して用語を見つけます。これにより、ディスクへのランダム アクセスの数が大幅に削減されます。さらに、用語インデックスは FST (有限状態トランスデューサー) の形式でメモリに保存されるため、メモリが非常に節約されます。用語辞書はブロック単位でディスクに保存されます。ブロックは共通のプレフィックスを使用して圧縮されます。たとえば、すべての単語が Ab で始まる場合、Ab は省略できます。このように、用語辞書は B ツリーよりも多くのディスク領域を節約できます。

同期データベース

MySQL データ ストレージを使用し、MySQL のトランザクション機能を使用してデータの一貫性を維持し、データの収集とクエリに ElasticSearch を使用します。データベース 同期スキームは特に重要です。

プロセス

まず商品をデータベースに追加します。商品の追加が成功すると、ESに商品が登録されます。ESへの登録に失敗した場合は、失敗した商品IDが登録されます。 Redis キャッシュ キューに失敗したプロダクト ID が追加されます。ログ ファイルを入力します (Redis がハングした場合は、ログから異常なプロダクト ID を取得し、それを ES に入力できます)。タスク タスクは、次の間隔で Redis キャッシュ キューを更新します。キャッシュキューからプロダクトIDを取得した場合は、そのプロダクトIDを元にデータベースからプロダクトIDを取得し、プロダクトデータを取得してESに入力します。

logstash-input-jdbc プラグインを使用してデータベース、インストール、構成を同期します。.conf ファイルを作成し、同期するデータベースと実行する .sql SQL ステートメントを構成します。 、最後に「A jdbc driver is located in thisfolder to connect to the mysql Database」を入力します。

#[関連する学習の推奨事項:

mysql チュートリアル ]

考えられる問題

elasticsearch データの重複と増分同期

デフォルト設定では、tracking_column の値は @timestamp です。 elasticsearch に存在する _id 値は、logstash が elasticsearch に保存されている時刻です。この値の主な機能は、mysql の主キーに似ています。これは一意ですが、タイムスタンプは実際には常に変化しているため、次の値を使用します。毎回クエリする select ステートメント すべてのデータは elasticsearch に保存されるため、データの重複が発生します。

解決策

クエリ対象のテーブルで主キーまたは自動インクリメント フィールドを見つけ、それを _id の値に設定します。_id 値は一意であるため、 _id が繰り返されると、データは繰り返されません

頻繁なデータ同期は mysql データベースのパフォーマンスに影響します

jdbc.sql ファイルに書き込む mysql ステートメントはハードコーディングされています。そのため毎回、クエリを実行する必要のないデータベースが多数あり、特に select * from table; を実行するたびに、mysql データベースに多大な負荷がかかります。

解決策:

(1 ) ビジネス ニーズに応じて、スケジュールされた同期時間は適切に変更できます。ここでは比較的高いリアルタイム要件があるため、10 分のスケジュールを設定しました => “*/10 * * * *”

(2) mysql クエリの範囲を設定する 大量のクエリがデータベースに影響を与えるのを防ぐために、select * from WHERE autoid > :sql_last_value;

elasticsearch ストレージ容量は増加し続けます

elasticsearch データのセキュリティを確保するため、データを受信した後、 select * from WHERE autoid > :sql_last_value; を設定し、まずデータをメモリとトランスログに書き込み、次にインデックスを作成してディスクに書き込みます。突然の停電や再起動があった場合、トランスログで復旧できますが、各クエリには重複データが多く存在するため、それらの重複データがelasticsearchインデックスに書き込まれずに蓄積され、 elasticsearch の容量は引き続き増加します。

解決策:

クエリの公式 Web サイトには、定期的に更新され、古いログは自動的にクリーンアップされるため、処理は必要ありませんと記載されています。

増分同期と mysql 範囲クエリの結果、以前のログと同期できなくなります。 mysql データベースが変更されたときのデータ。

mysql の小規模なクエリの問題を毎回解決し、データベースの負荷の問題も解決しますが、古いデータの変更を同期できないという問題が発生します。

解決策:

ビジネスに応じて変更可能 データベースが頻繁に変更される場合は、完全な更新のみを行うことができますが、データベースを高頻度かつ広範囲にスキャンしてインデックスを作成することは、インデックスをまったく作成しないよりも悪影響を及ぼします (インデックスを作成するため)主にデータの量が多く、頻繁に変更されず、データベースのパフォーマンスを消費する状況のためにインデックスを作成します。ここではデータの変更は少なく、同期中に ES

php を使用して mysql の範囲

php をわずかに調整したため、変更は一般に最近のデータです。phpコンポーザーインストールコンポーザーrequire elasticsearch/elasticsearch
es ファイル autoload.php ファイルを導入し、IP アドレスを設定します
インデックスを作成します。インデックスは MySQL のインデックスではなく、リレーショナル データ (以下、MySQL と呼びます) のデータベースに対応します。
データベースがあるだけでは十分ではなく、テーブルを作成する必要があります。ES も同様で、ES の型は MySQL のテーブルに対応します。 type は個別に定義されるのではなく、本文で定義されるフィールドと一緒に定義されます。もちろん、ik ワード セグメンテーションは本文フィールドでも使用できます。
検索を実装するには EsClient->search () を使用します。 ;
同義語と同義語の使用

[関連する学習の推奨事項: php プログラミング (ビデオ)]

単語セグメンターを構成します: IK を構成します

es の ik バージョン パッケージをダウンロードします
es ディレクトリの下のプラグインに ik ディレクトリを作成しますをクリックし、ダウンロードした ik zip パッケージ内のすべてのファイルを解凍します。
es の config ディレクトリに移動し、elasticsearch.yml を編集し、空白スペースにindex.analysis.analyzer.default.type: "ik" を追加します。
ピンイン単語セグメンター設定: コンパイル済みのものを使用します: elasticsearch-analysis-pinyin-1.3.0
elasticsearch の plugins ディレクトリに、新しい Analysis-pinyin フォルダーを作成し、圧縮パッケージを解凍し、jar パッケージを置きます。内部の分析ピンインフォルダーに移動します。
elasticsearch.yml で Pinyin トークナイザーのフィルターを構成する

同義語トークナイザーの構成

elasticsearch.yml で同義語トークナイザーのフィルターを構成する
Configure同義語データベースを作成し、elasticsearch の config ディレクトリに新しい sysnonym.txt を作成します。
主に名前、タイプ、トークン セグメンテーションのコンポーネント、およびセグメント化されたディメンションの処理を含む、ik ピンイン同義語のトークナイザーの構成: ここではピンインと同義語が使用されます

#ES キーワードハイライト#ES クエリ時にクエリの後のフィールド データに html タグ フィールドを追加することで、Web インターフェイス上で表示されるときにドキュメントを色またはフォントで書式設定できます。 は、ハイライトで強調表示されたフィールドを変更します。この部分には、name 属性と一致するテキスト フラグメントが含まれており、HTML タグでカプセル化されます

ES クエリ ページングElasticsearch のデータは、実行時にシャードに保存されます。検索では、各シャードが個別に検索され、データが統合されて返されます。

一般的なクエリ プロセスは次のとおりです。

1) クライアント リクエストは特定のノードに送信されます

2) ノードはそれを各シャードに転送し、各シャードの最初の 10 項目をクエリします

3) 結果がノードに返され、データが統合され、最初の 10 項目が抽出されます。
4) 要求元のクライアントに返されます。
項目 10 ~ 20 のデータをクエリすると、ディープ ページング (from-size) とスナップショット ページング (スクロール) の 2 つの方法。#​​##Depth ページング (from-size)

from はターゲット データのオフセット値を定義し、size はターゲット データの数を定義します。現在返されているイベント。デフォルトの from は 0、size は 10 です。つまり、すべてのクエリはデフォルトで最初の 10 個のデータのみを返します。最初の 20 個のデータをクエリし、最初の 10 個を切り捨てて、10 ~ 20 個のデータのみを返します。最初の 10 クエリは無駄でした。ページングが後ろになるほど、実行効率は低くなります。ページング オフセット値が大きいほど、ページング クエリの実行にかかる時間が長くなります。

スナップショット ページング (スクロール)

from と size のページングと比較して、次を使用します。スクロールは従来のデータ カーソルをシミュレートし、現在読み取られている文書情報の位置を記録できます。このページングの使用法は、リアルタイムでデータをクエリすることではなく、一度に大量のデータ (またはすべてのデータ) をクエリすることです。このスクロールは、現在のインデックス セグメントのスナップショット情報を維持することと同等であるため、このスナップショット情報は、このスクロール クエリを実行するときのスナップショットになります。このクエリの後の新しいインデックス付きデータは、このスナップショットではクエリされません。ただし、from や size と比較すると、すべてのデータをクエリして不要な部分を削除するのではなく、次の読み取りを迅速に続行できるように読み取り位置を記録します。 ###プロセス:###
  • 呼び出し:index/type/_search?pretty&scroll=2m、スクロール値を返します
  • scroll_id を直接使用してクエリします。
  • スクロールをクリアします。スクロールを設置する際にスクロールの生存時間を設定しますが、使用後にスクロールを閉じることができればリソースを早期に解放でき、ESの負担を軽減できます。
  • #プログラミング学習について詳しく知りたい方は、
php training
のコラムに注目してください!

以上がMySQL と PHP での ES の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。