2

こんにちは、Solr wiki を読んでここを検索しましたが、私のユースケースの解決策が見つかりませんでした:

さまざまな種類の契約を持つ顧客データを 1 つのドキュメントにインデックス化しています。したがって、各顧客は、1 つ以上の異なる契約を含む Solr ドキュメントになります。

各契約のフィールドは、インポートによって動的に追加されます (例: contract_type_1_s、contract_type_2_s、...; contract_change_date_1_dt、contract_change_date_2_dt、...)。したがって、' 2 ' のフィールドはすべて契約番号 2 に関連しています。これにより、ユーザーはタイプ 1 の契約を持ち、タイプ 2 の契約を持たない顧客などを検索できます。

私のユースケースは、クエリに一致したコントラクトのフィールドのみを返すことです。

次に例を示します。

<doc>
  <field name="id">100</field>
  <field name="customer_name">paul</field>
  <field name="contract_type_1_s">inhouse</field>
  <field name="contract_change_date_1_dt">2012-09-01T00:00:00Z</field>
</doc>
<doc>
  <field name="id">101</field>
  <field name="customer_name">fred</field>
  <field name="contract_type_1_s">inhouse</field>
  <field name="contract_change_date_1_dt">2012-09-01T00:00:00Z</field>
  <field name="contract_type_2_s">external</field>
  <field name="contract_change_date_2_dt">2012-09-01T00:00:00Z</field>
</doc>
<doc>
  <field name="id">102</field>
  <field name="customer_name">karl</field>
  <field name="contract_type_1_s">external</field>
  <field name="contract_change_date_1_dt">2012-09-01T00:00:00Z</field>
  <field name="contract_type_2_s">inhouse</field>
  <field name="contract_change_date_2_dt">2012-09-01T00:00:00Z</field>
</doc>

ここでユーザーが契約タイプが「外部」の顧客を検索すると、IDが101102のドキュメントが結果に含まれます。ここで、クエリに一致した契約のさまざまなフィールドを返したいと思います。

この例では、ドキュメント102の場合はcontract_change_date_1_dt、ドキュメント101の場合はcontract_change_date_2_dtである必要があります。これは、契約番号 1 がドキュメント 102 の外部であり、契約番号 2 がドキュメント 101 の外部であるためです。

組み込みコンポーネントでこの動作を達成する方法はありますか?


ハイライトコンポーネントを使用してクエリに一致したフィールドを見つけることができることを知っています。

私は次の解決策に行き着きましたが、Solr を拡張する必要があります。

  1. 必要なフィールドを識別するために QParser を記述し、それらを fl-param に追加します。
  2. 結果をクライアントに返す前にハイライトクエリを実行する
  3. 結果のすべてのドキュメントを繰り返し処理し、ドキュメントごとのクエリに一致したフィールドを結果リストに追加します

問題が明確になったことを願っています。これをアーカイブするための良い方法である提案は、本当に感謝しています。

挨拶ルネ

4

2 に答える 2

1

私は今、すべてを管理しました。

レスポンスライターを変更してはいけません:-)

ドキュメントごとに解決したすべてのフィールドを保存し、それらを応答に追加する必要がありました。

rb.rsp.setReturnFields(globalResultFields);

あいさつルネ

于 2012-08-09T07:16:34.833 に答える
1

誰かが同様のものが必要な場合;-)

次の方法でカスタム結果リストを作成できました。

カスタム QueryComponent (標準 QueryComponent を拡張) を作成して、クエリで使用されるフィールドを格納します。prepare-method で、保存されたフィールドで強調表示を有効にします。

// Making params modifieable
ModifiableSolrParams modifiableParams = new ModifiableSolrParams(params);
req.setParams(modifiableParams);
modifiableParams.set(HighlightParams.FIELDS, queryFieldList);
modifiableParams.set(HighlightParams.HIGHLIGHT, "true");
modifiableParams.set(HighlightParams.FIELD_MATCH, "true");
modifiableParams.set(HighlightParams.SIMPLE_PRE, "");
modifiableParams.set(HighlightParams.SIMPLE_POST, "");

カスタム HighlightComponent (標準の HighlightComponent を拡張) を作成して、std から結果を構築します。結果。process-method で、ハイライト情報を取得し、必要な情報を抽出します。

NamedList<Object> rspValues = rb.rsp.getValues();
NamedList<Object> nlHl = (NamedList<Object>) rspValues.get("highlighting");
this.hlDocsAndFields = extractHighlightingInfo(nlHl);

そのために、コントラクトごとに一致をカウントできるカスタム リストを作成しました (強調表示された結果に含まれる contract_X_s のフィールド数)。

これはうまくいきます。

私は今、応答を作成するときにドキュメントフィールドを自分で解決する応答ライターに固執しました:-(

応答ライターの変更/カスタマイズに関する提案はありますか?

挨拶ルネ

于 2012-08-08T13:31:50.073 に答える