2

Solr と SolrNet を使い始めたばかりです。現在のプロジェクトをやりすぎる前に、正しい方向に進んでいることを確認したいと思います。これが私が達成しようとしていることです:

基本要件:

  1. 複数のエンティティ (車、船、飛行機、自転車など) を検索する検索ソリューションを提供します。ここでこれらを作成しました。各エンティティは、非対称データを含む可変数のフィールドを持つことができます。
  2. 各エンティティにファセットを提供します。
  3. 各エンティティにフィルターを提供します。

ワークフロー:

  1. ユーザーが用語で検索します。
  2. 各エンティティに 1 つずつ、合計 4 つのリンクが表示され、その横にエンティティごとのヒット数を示す数値が表示されます。
  3. ユーザーがリンクをクリックすると、そのエンティティのファセットと検索結果を含むページが表示されます。

その要件を考慮して、これまでに行ったことは次のとおりです。

  1. 単一のインデックスを作成しましたが、car_name、car_model、car_company、ship_name、ship_model、ship_company、ship_age、ship_size などのエンティティごとに特定のフィールドがありました。
  2. インデックスにエンティティの 1 つに設定されているフィールド entity_type があります。
  3. ID はすべてのエンティティで一意です。
  4. DisMax 検索ハンドラー solrconfig.xml があり、そこに (すべてのエンティティから) 検索する必要があるすべてのフィールドを配置します。

私の DisMax 検索ハンドラーは次のようになります。

<requestHandler name="DisMax" class="solr.SearchHandler">
    <lst name="defaults">
        <str name="echoParams">explicit</str>
        <str name="defType">edismax</str>
        <str name="qf">
            car_name car_company car_model ship_name ship_company ship_model ship_sailing_route plane_name plane_company plane_model bicycle_name bicycle_company bicycle_model
        </str>
        <str name="q.alt">*:*</str>
        <str name="rows">10</str>
        <str name="fl">*,score</str>
        <str name="facet">on</str>
        <str name="facet.field">car_comapny</str>
        <str name="facet.field">car_model</str>
        <str name="facet.field">ship_name</str>
        <str name="facet.field">ship_company</str>
        <str name="facet.field">ship_sailing_route</str>
        ...
    </lst>
</requestHandler>

そして最後に、ここに私の質問があります:

  1. この単一のインデックス ルートは正しいアプローチですか、それともエンティティごとに個別のインデックスを作成する必要がありますか? 説明してください。
  2. それらが別々のインデックスである必要がある場合、特定の用語を検索するにはどうすればよいですか? そして重要なことに、SolrNet を使用してそれを行うにはどうすればよいでしょうか?
  3. SolrNet を使用してすべてのエンティティを検索し、結果を取得する方法はありますか? または、同じ検索語を使用して、各エンティティのクエリを個別に (並行して) 実行する必要がありますか?
  4. ご覧のとおり、DisMax ハンドラーでファセットとして使用できるすべてのフィールドのリストがありますが、これは正しいアプローチですか? そうでない場合、何ですか?

プロジェクトを進めていくうちに、さらに多くの質問が出てくると思いますが、今のところはこれで十分です。

4

1 に答える 1

3

タイプごとに多くのアイテムを用意する場合は、分割するのが賢明かもしれません (パフォーマンスのためだけです)。また、スキーマに取り込んでいるものの類似点と相違点にも依存します。
たとえば、自転車、車、船にはすべて会社、名前、モデルなどの共通点があるため、名前、モデル、会社のフィールドと、「vehicle_type」という別のフィールドを使用できます。変数フィールド (オプションと呼びます) がほんの数個である場合は、動的フィールドを使用できるため、厳格なスキーマは必要ありません。

異なるインデックス (およびスキーマ) を使用する場合、クエリはすべての異なるフィールドとスキーマを認識している必要があります。これを行うにはマルチコアインスタンスが必要であり、(AFAIK)一度に複数のコアにクエリを送信できないことは言うまでもありません。

それは、実行したいクエリによって異なります。「vairo」という名前の車両を検索したいが、ユーザーが自転車か車か何かを指定していないとします。次のようなすべての異なるコアに検索を分散する必要があります

/solr/bicicles/select?q=bicicle_name:vairo
/solr/cars/select?q=car_name:vairo
/solr/ships/select?q=ship_name:vairo

次に、結果をマージします。すべてを 1 つのインデックスに入れると、単純に検索できますq=name:vairo。次に、通常は「vehicle_type」でファセットし、その名前の自転車が 1000 台あり、他の乗り物がほとんどないことをユーザーに伝えます。ユーザーが "ok, gimme only the bicicles" と指定した場合、以前と同じようにクエリを保持しますが、&fq=vehicle_type:bicicleを追加します。

これは、フィルターに応じてどのインデックスにクエリを実行する必要があるかというロジックを処理するよりもはるかに便利です。また、複数の応答からの結果をマージすることも簡単ではありません。

当社では、すべてのカテゴリに単一の solr を使用しています。明らかに、それらのすべてには、他のものには存在しないオプションがあります(不動産と車両を考えてください)。動的フィールドで処理されるものもあれば、通常のフィールドで処理されるものもあります。ドキュメントに何かを送信しなければ、SOLR は問題ありません。

例えば:

squared_meters
rooms
vehicle_type
vehicle_doors

すべてを 1 つのインデックスに。ご想像のとおり、ドキュメントのインデックスを作成すると、半分以下のフィールドが空になる可能性があります (車または家のいずれか)。SOLR は、クエリ時とインデックス時の両方でまったく問題ありません。

要約すると、次のようになります。

  • 実行するクエリの種類を検討してください。バイクまたは車のいずれかを検索する場合、異なるインデックスは問題ありません
  • 持っている書類の数を考えてみましょう。それらが数百万になる場合、このロジックの分割は、パフォーマンスを向上させるために実行できる最善の方法ですが、より多くのクエリを実行する必要があります!
于 2012-04-14T16:56:00.477 に答える