2

Solr で次のシナリオを処理するにはどうすればよいDataImportHandlerですか? 1 日 1 回、すべてのドキュメントを完全にインポートします (完全なインデックス作成には約 1 時間かかります)。すべてのドキュメントは、A と B という 2 つのクラスに分類されます。クラス A に属するドキュメントは 3% のみであり、これらのドキュメントは頻繁に変更されます。変更された時刻を使用して、deltaQuery を介して 10 分ごとにクラス A のドキュメントのインデックスを再作成します。ここまでは大丈夫。

ここで、クラス A のすべてのドキュメントを 1 時間ごとに再インデックスする必要もあります (別のテーブルに view_count 列があり、view_count を更新してもドキュメントの変更時刻は変わらないため)。これを行う方法?

更新 (短期的な解決策): 今のところ、デルタで変更された時刻をまったく使用せず、10 分ごとにクラス A のすべてのドキュメントのインデックスを再作成することにしました。クラス A のドキュメントをインデックス化するのに 3 分しかかからないので、今のところ問題ありません。ただし、任意の解決策が役立ちます。

4

2 に答える 2

1

DIH DB構成でdeltaQueryパラメーターを個別に照会するのではなく、ここにある提案に従うことを選択しました。これにより、異なるパラメーターをSolrに渡して完全なインポートを実行することにより、完全更新と部分更新の両方に同じ照会ロジックを使用できます。またはデルタインポート。

どちらの場合も、?command = full-importを渡しますが、完全インポートの場合はURLパラメーターとして&clean = trueを渡し、デルタの場合は&clean = falseを渡します。これは、から返されるレコードの数に影響します。クエリを実行するだけでなく、フラッシュして最初からやり直すかどうかをSolrに指示します。

于 2012-08-19T21:02:16.433 に答える
0

ExternalFileFieldビューカウントを保存し、関数クエリを使用してそのフィールドに基づいて結果を並べ替えることができることがわかりました。(SOでこれについて別の質問をしました:Solr 3.6のExternalFileField。)しかし、これらのフィールドはSolr結果セットでは返されないことがわかりました。つまり、フィールドの値を取得するためにDB呼び出しを行う必要がありました。やりたくない。

別の解決策を見つけました:Mike Klostermeyerの答えを理解しようとするとcommand=full-import、追加のクエリパラメータを取ることもできることがわかりましたentity<document>そこで、タグ内に2つのトップレベルエンティティを設定します。最初のエンティティdata-config.xmlはクラスAのドキュメントのみにインデックスを付け、2番目のエンティティはクラスBのドキュメントのみにインデックスを付けます。クラスAのドキュメントの場合、最終変更に基づいてデルタインポートを実行します。 5分ごとの時間と1時間ごとの完全なインポート(view_countを更新するため)。クラスBドキュメントの場合、毎日1回だけ完全インポートを実行し、デルタインポートは実行しません。

これにより、基本的に3つの異なる実行プランが異なる時間間隔で実行されます。

ただし、注意点も1つありますclean=false。エンティティのインポートを実行するたびにクエリパラメータを渡す必要があります。そうしないと、インデックス作成が完了した後、他のエンティティのドキュメントが削除されます。

このアプローチで私が気に入らない点の1つは、すべてのクエリとサブエンティティを1つのトップエンティティから別のエンティティにコピーして貼り付けることです。トップレベルエンティティのクエリの唯一の違いは、ドキュメントがクラスAにあるかクラスBにあるかです。

于 2012-08-20T19:58:50.250 に答える