8

SOLR を使用して、複数の値から構成されるメタデータを含むドキュメントを保存します。通常、ラベル付きの ID。簡単な例は、都市の名前とその都市の一意の ID です。ドイツのベルリンと米国のベルリンのように、異なる都市が同じ名前を持つ可能性があるため、id が必要です。その文字列を検索したいので、名前は明らかに必要です。

ファセットを使用する場合、「ベルリン」というラベルを持つ 2 つのファセットを取得したいと考えています。検索を (他のメタ データ フィールドを使用して) ドイツのドキュメントに限定すると、ドイツのベルリンのファセットは 1 つしか得られないと予想されます。IDとラベルを2つの別々のSOLRフィールドに保存すると、明らかにこれは機能しません。

これは珍しい要件ではないと思いますが、有用な情報を見つけることができませんでした。私の現在のアプローチは次のとおりです。

  • 完全なカスタム フィールド タイプを Java で実装します。現在、私は SOLR 開発者ではなく、単なる SOLR ユーザーであるため、見積もりが難しいです。

  • ID とラベルを 1 つの文字列 ("123:Berlin" や "456:Berlin" など) に入れ、値を分割するカスタム アナライザーを使用して schema.xml でカスタム フィールド タイプを定義します。私には合理的に聞こえますが、ファセットで機能するかどうかは 100% 確信が持てません。

  • サブフィールドへの参照をいくつか見つけましたが、古いページだけで、有用なドキュメントを見つけることができませんでした。

SOLRでこれを解決するよく知られた方法はありますか?

4

4 に答える 4

3

ピボット ファセットが機能します。

次のフィールドがあるとします。cityId, cityName, country

クエリ パラメーターを使用して、city-id、city-name に対してピボット ファセットを実行します。

facet.pivot=cityId,cityName

最初のレベルでは、標準ファセットと同様に、各都市 ID を取得します。しかし、第 2 レベルでは、各都市の名前が表示されます。pivot各都市 ID には名前が 1 つしかないため、次のファセット レベル ( XMLの要素の下) から各都市 ID の名前を簡単に読み取ることができます。

<lst name="facet_pivot">
    <arr name="cityId,city">
        <lst>
            <str name="field">cityId</str>
            <str name="value">1</str>
            <int name="count">1</int>
            <arr name="pivot">
                <lst>
                    <str name="field">city</str>
                    <str name="value">berlin</str>
                    <int name="count">1</int>
                </lst>
            </arr>
        </lst>
        <lst>
            <str name="field">cityId</str>
            <str name="value">2</str>
            <int name="count">1</int>
            <arr name="pivot">
                <lst>
                    <str name="field">city</str>
                    <str name="value">berlin</str>
                    <int name="count">1</int>
                </lst>
            </arr>
        </lst>
        <lst>
            <str name="field">cityId</str>
            <str name="value">3</str>
            <int name="count">1</int>
            <arr name="pivot">
                <lst>
                    <str name="field">city</str>
                    <str name="value">melbourne</str>
                    <int name="count">1</int>
                </lst>
            </arr>
        </lst>
    </arr>
</lst>

pivot基本的に、ID が一意である場合、第 2 レベルで1 つの値のみを持つことが保証されます。

オプションで、「Berlins」をグループ化する場合は、ファセット ピボットの順序を逆にして、次のようにします。

facet.pivot=cityName,cityId

第 1 レベルで「ベルリン」を取得し、第 2 レベルで複数の ID を取得できます (ボーナスとして、第 3 レベルを追加して、第 3 レベルcountryから各都市の国を読み取ることができます)。

于 2013-05-23T06:30:16.237 に答える
1

すぐに使えるソリューションはないようです。

  1. #2は、クライアント側の変更で正常に機能するはずです。
  2. 単一の文字列フィールドとして id_name を使用してデータにインデックスを付けることができます。インデックス作成時に変更する必要があります。DIH を使用している場合は、トランスフォーマーを使用する方が簡単です。
  3. これで、ID ごとに一意のファセットが作成され、クライアント側でいつでもファセットを分割して表示できます。

階層ファセットを提供できるファセット ピボットも確認​​できます。

于 2013-05-21T05:10:32.603 に答える
0

copyFieldかなり単純な提案: "123:Berlin" のような値に対して、インデックス時に 2 つのフィールドを使用します。

クライアント側でファセットと解析/クリーニングを行うための1 つのnotindexedおよびstring フィールドと、ex: の単純な正規表現アナライザーではなく、コピー 1 を使用する検索。storedindexedstoredPatternReplaceCharFilterFactory

2番目のソリューションですでに指摘したように、カスタムアナライザーや新しいタイプのフィールドは必要ありません

于 2013-05-28T14:45:29.543 に答える
0

それはうまくいくはずです。などのフィルタ クエリを追加するとfq=country_name:Germany、ドイツの都市のみのファセットが返されます。以下の例をご覧ください。

スキーマに 4 つのフィールドがあるとします。

ID、都市名、国名、州名

サンプルデータ:

ID: 1

都市名:ベルリン

country_name:ドイツ

state_name: Some_State1


ID: 2

都市名:ベルリン

country_name:米国

state_name: Some_State2


ID: 3

都市名:ダブリン

country_name:アイルランド

state_name: Some_State3


ID: 4

都市名:ダブリン

country_name:米国

州名:カリフォルニア


ID: 5

都市名:ダブリン

country_name:米国

州名:バージニア州


ダブリンという名前のすべての都市のファセットを取得する場合:

/select/?q=*:*&facet=true&facet.field=country_name&facet.field=city_name&fq=city_name:Dublin

結果として、ファセット Dublin のカウントは 3 になります。


ダブリンという名前のすべての都市のファセットを取得し、国を米国に制限する場合、クエリは次のようになります。

/select/?q=*:*&facet=true&facet.field=country_name&facet.field=city_name&fq=city_name:Dublin&fq=country_name:USA

結果として、ファセット ダブリンの数は 2 になります。これは、米国に 2 つのダブリンがあり、1 つはカリフォルニアにあり、もう 1 つはバージニアにあるためです。

注: &fq=country_name:USAを追加しました

于 2013-05-21T00:46:05.590 に答える