2017-10-06 6 views
0

すべてのユーザーが挿入できるMySQLテーブルがあります。テーブル内のフィールドの1つは、行が一致するsolrドキュメントの総数です。total resultsとしてください。MySQLとSolrの整合性、いずれかに挿入

REST APIコードでは、挿入時にsolrクライアントを使用して、新しい行が一致するドキュメントの総数を検索します。フィールドを更新してから、完成したリソースを返します。十分に簡単ですが、私は何とかこのアップデートを自動的にMySQL経由で起動することを好むでしょう。

大きな問題は、新しい文書をsolrに挿入したり、古い文書をsolrから削除する際に、REST APIコードと同じロジックを持つシェルスクリプトを実行して、total resultsの更新を実行するより良い計画がないことです各行。

私のオプションは、私はそれを見るように、これらは次のとおりです。

1)、一つ一つのSolrするdata_import後にすべての行を更新します。この表には約1.5Mの行があるので、しばらく時間がかかります。

2.)データベース内のフィールドを完全に取り除き、リソースが取得されるたびにすべてtotal resultsの和をsolrから取得します。 (これは私のケースでは非常に悪い考えです。ユーザーがGET/api/resourceをリストとして使用してこのテーブルから20K行を検索するためです)

3.)特定のMySQLテーブル行solrドキュメントはこれらの行に影響を与え、更新を制限します。これは、基本的に検索プロセスを逆にすることを含む。

解決策1と3は、基本的に私がsolr data_importを管理するスクリプトと、MySQLローのtotal resultsフィールドの更新を1つのプロセスとして記述する必要があります。私はそれをすることができますが、私はこれらの問題をどのように最善に管理するかについていくつかの洞察を用いることができます。

どのようにして一貫性を維持しますか?

+0

Alfrescoがどのように「最終的な」および「トランザクション的な」一貫性の問題を扱うかを調べると、多分それが役立つでしょう。 – Lista

答えて

0

Luwakは、この問題を解決する(つまり、クエリを保存し、インデックスされたドキュメントが一致したときにトリガーする)ように設計されています。ドキュメントが保存されたクエリと一致したときのヒット数を更新します。ドキュメントを削除するときは、同じ操作を行いますが、代わりに実際の数を減らします。

これは特定のLuceneベースのソリューションなので、を直接に既存のインフラストラクチャに接続しません。

もう1つの方法は、同じことを手動で行うことです。すなわち、各格納された検索について - 検索が単純ブールマッチの場合、これらの用語タイプの検索は、フィールドタイプのSolrの分析機能を使用して検索をトークンに分解し、索引付けされたときにドキュメントで同じ処理を行います。 Solrによって生成されたトークン(Solrまたは別のSQLテーブルの別のストアにある)と一致する各クエリを検索し、その数を更新します。ドキュメントのサイズにもよりますが、実装するのは難しくありませんが不可能ではありません。

Elasticsearchはパーコレーションのもとでこの機能を備えていますが、これは1.5Mのストアドクエリについて話しているときに問題になることもあります。 Solrの場合は、ドキュメントをメモリのみのインデックスにインデックスし、それに対してすべてのクエリを実行して一致するクエリを検索します。

関連する問題