MSSQLに従ってElasticsearchとLogstashを使用して検索を構成した方法

次のような状況で、閉鎖された企業ソーシャルネットワークでどのように検索を実行したかの詳細を共有します。







•データはMSSQLテーブルの異なる列に保存されます。

•それらの前に検索がなかった、

•そしてそこからそれらを転送するのは高価です-システム全体がMSSQLに結び付けられています。 サードパーティのサービスを使用しても、情報セキュリティ上の理由から機能しません。







私たちにとって適切な検索の基準はこれです。ユーザーがタイプミスでリクエストを入力したか、グループ名を不正確に示したとしても、彼はそれを見つけました。







また、将来的には、ハッシュタグを個別の単語として検索し、同義語を検索し、結果をランキングし、その場で中間結果を発行する必要がありました。











ElasticSearchを選ぶ理由







標準ツール(非標準ツールでも)MSSQLはこの検索を許可しませんでした。 MSSQLにはフルテキスト検索があるという事実にもかかわらず、将来このソリューションは問題につながる可能性があります。 まず、クライアントにはSQL Serverの最新バージョンがなく、そのバージョンでの検索は新しいバージョンと同様に機能しません。 次に、タイプミス、ハッシュタグ、ランキングを手動で実装する必要があります。







リストを検索することしかできないため、SharePointも放棄しました。 別のリストを作成して最新の状態に保つことは、複雑すぎることが判明しています。 リストは、特に大容量の場合、信頼性と作業速度に違いはありません。 はい。SharePointの全文検索は、MSSQLよりも品質が劣ります。







セキュリティ上の理由から、サードパーティのサービスを使用することはできませんでした。 したがって、選択はElasticSearchに委ねられました。







Elasticsearchでデータのインデックスを作成する方法は?







Elasticsearchでデータにインデックスを付け、最新の状態に保つ必要がありました。 データに変更が発生すると、Elastic Indexはそれらを自動的に上書きしますが、すべてを上書きするのではなく、新しいものだけを上書きします。







JDBCドライバーで動作するソリューションを探す必要があることが明らかになりました。 これは、ElasticからMSSQLのデータにアクセスする唯一の明白な方法です。







最初に手に入れたのはElastic-JDBCでした。 ただし、このソリューションの最新の更新は2016年8月に始まり、ElasticSearch 2.3.4で動作します。 明らかに、すぐに古いバージョンにソリューションを結び付けるのは間違った方法です。 Elasticを直接操作するための他の既製のソリューションは見つかりませんでした。







Logstashを介したデータのダウンロード







現在、Logstashは通常、データをElasticSearchにロードする役割を担っています。 彼にとって、既成のソリューション-JDBC Inputプラグインが見つかりました。 解決策が見つかったようで、正しくインストールして構成することだけが残っていますが、わずかな困難が生じました。 以下でそれらについて説明します。







Logstashのセットアップ:経験とヒント







Logstashの横にある指示に従ってダウンロードします。 セットアップはプラグインページで詳細に説明されていますが、いくつかの微妙な点があります。







設定ファイルは次のようになります。







input { jdbc { jdbc_driver_library => "etc/logstash/bin/sqljdbc42.jar" jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver" jdbc_connection_string => "connection string" jdbc_user => "user" jdbc_password => "password" statement => "SELECT id, name, timestamp FROM [TableName] WHERE timestamp > :sql_last_value" schedule => "* * * * *" tracking_column => "timestamp" tracking_column_type => "timestamp" use_column_value => true } }
      
      





非標準のポイントから、声明に気づくことができます。 ここで、インデックスを作成する列を示します。 Sql_last_valueは、各反復で上書きされる特別な値です。 プラグインは、ブート時に検出できる最大値を取ります。 数値またはタイムスタンプのいずれかです。 つまり、idに関連付けて新しいレコードのみにインデックスを付けるか、DateTime列に関連付けて最後の更新の時刻を追跡できます。 後で変更または追加されたエントリにはインデックスが作成されます。 1つの入力ではなく、ロードする必要がある数のテーブルを指定できます。







ElasticのIDがデータベースのIDと一致するように、出力を構成することをお勧めします。 これにより、データが重複する可能性がなくなります。







発生した問題







Logstashはログを処理するように構成されており、ログを削除する理由を理解していません。 ログを削除するのは正しい考えの誰ですか? そのような機能は単に存在しませんでした。 したがって、削除を自分の手で登録し、データベースからの削除を追跡し、Elasticsearchから削除する必要がありました。

変更と追加はこの方法で実装されました。MSSQLデータベースにタイムスタンプ列(最後の変更の日付)を追加しました。 何かが変更されると、この日付と時刻は現在のものに変更されます。 そして、このドライバーは最新の変更を追跡します-毎分データベースをチェックし、最後の変更のtimestempを保存します。







良いアドバイス







この機能を実装するためのいくつかのヒント。 CodeFirstベースがある場合、インターフェースを追加します。







 internal interface IDateModified { DateTime TimeStamp { get; set; } }
      
      





ElasticSearchで後でインデックスを作成するすべてのテーブルにこのインターフェイスを実装します。 DbFirstがある場合は、ttファイルを編集してインターフェイスを追加できます。

さらに、コンテキストを維持しながら、目的のテーブルの変更を非常に簡単に追跡できます。







 var trackables = context.ChangeTracker.Entries<IDateModified>().Where(t => t.State == EntityState.Modified || t.State == EntityState.Added); foreach (var item in trackables) { item.Entity.TimeStampForElastic = DateTime.UtcNow; }
      
      





EntityState.Deletedを追跡し、データベースと同時にElasticから削除することもできます。







合計







したがって、MSSQLからその場で最新のデータを取得することが可能であり、リクエストする場合、まずElasticに連絡し、そこから検索条件に一致する必要なIDを取得してから、データベース内にあるかどうかを確認し、それらを非常に迅速に取得します。







ElasticSearchで検索インデックスを設定することに関する膨大な数の記事があります。 この記事を見て、全文検索の可能性をここで説明します。 私も望んでいましたが、Elasticsearchにすべてのデータを保存する機能がありませんでした。 Elasticsearchでは、データは完全には届きませんが、検索する必要があるデータのみが届きます。







検索に関与するデータを設定で指定しました。ニュース、グループ、ハッシュタグ、グループ名、説明で検索し、参加者の数は無視します。







MSSQLを使用して検索を設定する方法は次のとおりです。 将来的には、ソーシャルネットワークの投稿に検索を追加したいと考えています。







PSボーナスとして、使用したロシアの形態プラグインへのリンクをキャッチします。








All Articles