スケーラブルなオープンソースの全文検索および分析エンジンで、迅速に保存および検索できます。準リアルタイムで大量のデータを分析します。
全文検索とは、記事内のすべての単語をスキャンし、各単語のインデックスを作成し、記事内の単語の番号と位置を示すコンピューターのインデックス作成プログラムを指します。ユーザーがクエリを実行すると、検索プログラムが構築されます。事前に確立されたインデックスに基づくインデックス インデックスを検索し、検索結果をユーザーの検索メソッドにフィードバックします。このプロセスは、辞書の検索語リストから単語を検索するプロセスに似ています。検索エンジン データベース内のデータの全文検索
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 チュートリアル ]
考えられる問題(2) mysql クエリの範囲を設定する 大量のクエリがデータベースに影響を与えるのを防ぐために、select * from WHERE autoid > :sql_last_value;
elasticsearch ストレージ容量は増加し続けます
クエリの公式 Web サイトには、定期的に更新され、古いログは自動的にクリーンアップされるため、処理は必要ありませんと記載されています。
増分同期と mysql 範囲クエリの結果、以前のログと同期できなくなります。 mysql データベースが変更されたときのデータ。
mysql の小規模なクエリの問題を毎回解決し、データベースの負荷の問題も解決しますが、古いデータの変更を同期できないという問題が発生します。
解決策:
ビジネスに応じて変更可能 データベースが頻繁に変更される場合は、完全な更新のみを行うことができますが、データベースを高頻度かつ広範囲にスキャンしてインデックスを作成することは、インデックスをまったく作成しないよりも悪影響を及ぼします (インデックスを作成するため)主にデータの量が多く、頻繁に変更されず、データベースのパフォーマンスを消費する状況のためにインデックスを作成します。ここではデータの変更は少なく、同期中に ES
php をわずかに調整したため、変更は一般に最近のデータです。phpコンポーザーインストールコンポーザーrequire elasticsearch/elasticsearch
es ファイル autoload.php ファイルを導入し、IP アドレスを設定します
インデックスを作成します。インデックスは MySQL のインデックスではなく、リレーショナル データ (以下、MySQL と呼びます) のデータベースに対応します。
データベースがあるだけでは十分ではなく、テーブルを作成する必要があります。ES も同様で、ES の型は MySQL のテーブルに対応します。 type は個別に定義されるのではなく、本文で定義されるフィールドと一緒に定義されます。もちろん、ik ワード セグメンテーションは本文フィールドでも使用できます。
検索を実装するには EsClient->search () を使用します。 ;
同義語と同義語の使用
[関連する学習の推奨事項: php プログラミング (ビデオ)]
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 ピンイン同義語のトークナイザーの構成: ここではピンインと同義語が使用されます
一般的なクエリ プロセスは次のとおりです。
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 クエリは無駄でした。ページングが後ろになるほど、実行効率は低くなります。ページング オフセット値が大きいほど、ページング クエリの実行にかかる時間が長くなります。
のコラムに注目してください!
以上がMySQL と PHP での ES の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。