結果のグループ化

結果のグループ化は、共通のフィールド値を持つドキュメントをグループにまとめ、各グループの上位ドキュメントを返します。

たとえば、家電量販店のeコマースサイトで「DVD」を検索した場合、「テレビとビデオ」、「映画」、「コンピュータ」などの3つのカテゴリが、カテゴリごとに3つの結果で返される場合があります。この場合、クエリ用語「DVD」は3つすべてのカテゴリに表示されるため、Solrはユーザーの関連性を高めるためにそれらをまとめてグループ化します。

代わりに折りたたみと展開を使用することをお勧めします

Solrの結果の折りたたみと展開機能はより新しく、ほとんどの場合、結果のグループ化と重複します。 beiden einzigartige Funktionen und unterschiedliche Leistungsmerkmale.とはいえ、ほとんどの場合、結果のグループ化よりも折りたたみと展開の方が好ましいです.

結果のグループ化は、ファセットとは異なります。概念的には似ていますが、ファセットはすべての関連する結果を返し、ユーザーはファセットカテゴリに基づいて結果を絞り込むことができます。たとえば、靴小売店のeコマースサイトで「靴」を検索すると、Solrはそのクエリ用語のすべての結果と、「サイズ」、「色」、「ブランド」などの選択可能なファセットを返します。

ただし、グループ化とファセットを組み合わせることができます。グループ化されたファセットは、facet.fieldfacet.rangeをサポートしていますが、現在、日付とピボットファセットはサポートしていません。ファセット数は、最初のパラメータに基づいて計算され、他のgroup.fieldパラメータは無視されます。group.field

グループ化されたファセットは、グループ化されていないファセットとは異なり、次の例に示すように、(すべてのファセットの合計)==(そのプロパティを持つ製品の合計)です。

オブジェクト1

  • 名前:Phaser 4620a

  • ppm:62

  • 製品範囲:6

オブジェクト2

  • 名前:Phaser 4620i

  • ppm:65

  • 製品範囲:6

オブジェクト3

  • 名前:ML6512

  • ppm:62

  • 製品範囲:7

Solrにこれらのドキュメントを「製品範囲」でグループ化するように依頼した場合、グループの合計数は2になりますが、ppmのファセットは62の場合は2、65の場合は1になります。

グループ化パラメータ

結果のグループ化では、次のリクエストパラメータを使用します。これらのリクエストパラメータは、1つのリクエストにいくつでも含めることができます。

group

オプション

デフォルト:false

trueの場合、クエリ結果はグループ化されます。

group.field

オプション

デフォルト:なし

結果をグループ化するためのフィールドの名前。フィールドは単一値でなければならず、インデックスが付けられているか、または値ソースを持ち、関数クエリ(例: )で機能するフィールドタイプでなければなりません。また、 、 などの文字列ベースのフィールドでなければなりません。ExternalFileFieldStrFieldTextField

group.func

オプション

デフォルト:なし

関数クエリの固有値に基づいてグループ化します。

このオプションは、分散検索では機能しません。
group.query

オプション

デフォルト:なし

指定されたクエリに一致するドキュメントの単一グループを返します。

rows

オプション

デフォルト:10

返すグループの数。

start

オプション

デフォルト:なし

グループリストの初期オフセットを指定します。

group.limit

オプション

デフォルト:1

グループごとに返す結果の数を指定します。

group.offset

オプション

デフォルト:なし

各グループのドキュメントリストの初期オフセットを指定します。

sort

オプション

デフォルト:score desc

Solrがグループを互いにどのようにソートするかを指定します。たとえば、sort=popularity descを指定すると、グループは各グループ内で最も人気のあるドキュメントに従ってソートされます。

group.sort

オプション

デフォルト:説明を参照

Solrが各グループ内でドキュメントをどのようにソートするかを指定します。 group.sort が指定されていない場合のデフォルトの動作は、sort パラメータと同じ有効値を使用することです。

group.format

オプション

デフォルト: grouped

このパラメータを simple に設定すると、グループ化されたドキュメントは単一のフラットリストで表示され、start および rows パラメータはグループではなくドキュメントの数に影響します。このパラメータの代替値は grouped です。

group.main

オプション

デフォルト:なし

true の場合、最初のフィールドグループ化コマンドの結果が、group.format=simple を使用して、レスポンスのメイン結果リストとして使用されます。

group.ngroups

オプション

デフォルト:false

true の場合、Solrはクエリに一致したグループの数を結果に含めます。

シャード化されたインデックスを使用する場合の分散結果グループ化の注意点については、以下を参照してください。

group.truncate

オプション

デフォルト:false

true の場合、ファセット数は、クエリに一致する各グループの最も関連性の高いドキュメントに基づきます。

group.facet

オプション

デフォルト:false

facet.field パラメータで指定されたフィールドファセットに対して、グループ化されたファセットを計算するかどうかを決定します。グループ化されたファセットは、最初に指定されたグループに基づいて計算されます。通常のフィールドファセットと同様に、フィールドはトークン化しないでください(そうしないと、各トークンに対してカウントが計算されます)。グループ化されたファセットは、単一値フィールドと複数値フィールドをサポートします。

このオプションを使用すると、パフォーマンスが大幅に低下する可能性があります。

シャード化されたインデックスを使用する場合の分散結果グループ化の注意点については、以下を参照してください。

group.cache.percent

オプション

デフォルト: 0

このパラメータを 0 より大きい数値に設定すると、結果のグループ化のキャッシュが有効になります。結果のグループ化は2回の検索を実行します。このオプションは2回目の検索をキャッシュします。

テストの結果、グループキャッシュは、ブール型、ワイルドカード、およびあいまいクエリを使用した場合にのみ検索時間を改善することが示されています。用語または「すべて一致」クエリのような単純なクエリの場合、グループキャッシュはパフォーマンスを低下させます。

単一のリクエストで、任意の数のグループコマンド(例:group.fieldgroup.funcgroup.query など)を指定できます。

グループ化の例

以下のすべてのサンプルクエリは、Solrの「bin/solr -e techproducts」の例で動作します。

フィールドによる結果のグループ化

この例では、サンプルデータセット内のアイテムの製造元を指定する manu_exact フィールドに基づいて結果をグループ化します。

https://127.0.0.1:8983/solr/techproducts/select?fl=id,name&q=solr+memory&group=true&group.field=manu_exact
{
"..."
"grouped":{
  "manu_exact":{
    "matches":6,
    "groups":[{
        "groupValue":"Apache Software Foundation",
        "doclist":{"numFound":1,"start":0,"docs":[
            {
              "id":"SOLR1000",
              "name":"Solr, the Enterprise Search Server"}]
        }},
      {
        "groupValue":"Corsair Microsystems Inc.",
        "doclist":{"numFound":2,"start":0,"docs":[
            {
              "id":"VS1GB400C3",
              "name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail"}]
        }},
      {
        "groupValue":"A-DATA Technology Inc.",
        "doclist":{"numFound":1,"start":0,"docs":[
            {
              "id":"VDBDB1A16",
              "name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM"}]
        }},
      {
        "groupValue":"Canon Inc.",
        "doclist":{"numFound":1,"start":0,"docs":[
            {
              "id":"0579B002",
              "name":"Canon PIXMA MP500 All-In-One Photo Printer"}]
        }},
      {
        "groupValue":"ASUS Computer Inc.",
        "doclist":{"numFound":1,"start":0,"docs":[
            {
              "id":"EN7800GTX/2DHTV/256M",
              "name":"ASUS Extreme N7800GTX/2DHTV (256 MB)"}]
        }
      }]}}}

レスポンスは、クエリに合計6件の一致があることを示しています。 group.field の5つの固有値のそれぞれについて、Solrは、その groupValue に対する docList を返します。 numFound はそのグループ内のドキュメントの総数を示し、上位ドキュメントは暗黙的なデフォルトの group.limit=1 および group.sort=score desc パラメータに従って返されます。結果のグループは、暗黙的な sort=score desc に基づいて各グループ内の上位ドキュメントのスコアでソートされ、返されるグループの数は暗黙的な rows=10 に制限されます。

リクエストパラメータ group.main=true を使用して同じクエリを実行できます。これにより、結果は単一のフラットドキュメントリストとしてフォーマットされます。このフラットフォーマットには、通常の結果グループ化クエリ結果ほど多くの情報(特に各グループの numFound)は含まれていませんが、既存のSolrクライアントが解析する方が簡単な場合があります。

https://127.0.0.1:8983/solr/techproducts/select?fl=id,name,manufacturer&q=solr+memory&group=true&group.field=manu_exact&group.main=true
{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "fl":"id,name,manufacturer",
      "indent":"true",
      "q":"solr memory",
      "group.field":"manu_exact",
      "group.main":"true",
      "group":"true"}},
  "grouped":{},
  "response":{"numFound":6,"start":0,"docs":[
      {
        "id":"SOLR1000",
        "name":"Solr, the Enterprise Search Server"},
      {
        "id":"VS1GB400C3",
        "name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail"},
      {
        "id":"VDBDB1A16",
        "name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM"},
      {
        "id":"0579B002",
        "name":"Canon PIXMA MP500 All-In-One Photo Printer"},
      {
        "id":"EN7800GTX/2DHTV/256M",
        "name":"ASUS Extreme N7800GTX/2DHTV (256 MB)"}]
  }
}

クエリによるグループ化

この例では、group.query パラメータを使用して、2つの異なる価格帯(0.00〜99.99、および100以上)で「メモリ」の上位3つの結果を見つけます。

https://127.0.0.1:8983/solr/techproducts/select?indent=true&fl=name,price&q=memory&group=true&group.query=price:[0+TO+99.99]&group.query=price:[100+TO+*]&group.limit=3
{
  "responseHeader":{
    "status":0,
    "QTime":42,
    "params":{
      "fl":"name,price",
      "indent":"true",
      "q":"memory",
      "group.limit":"3",
      "group.query":["price:[0 TO 99.99]",
      "price:[100 TO *]"],
      "group":"true"}},
  "grouped":{
    "price:[0 TO 99.99]":{
      "matches":5,
      "doclist":{"numFound":1,"start":0,"docs":[
          {
            "name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail",
            "price":74.99}]
      }},
    "price:[100 TO *]":{
      "matches":5,
      "doclist":{"numFound":3,"start":0,"docs":[
          {
            "name":"CORSAIR  XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail",
            "price":185.0},
          {
            "name":"Canon PIXMA MP500 All-In-One Photo Printer",
            "price":179.99},
          {
            "name":"ASUS Extreme N7800GTX/2DHTV (256 MB)",
            "price":479.95}]
      }
    }
  }
}

この場合、Solrは「メモリ」に5件の一致を見つけましたが、価格別にグループ化された4つの結果のみを返します。これは、「メモリ」の結果の1つに価格が割り当てられていなかったためです。

分散結果グループ化の注意点

グループ化は、いくつかの注意点はあるものの、分散検索でサポートされています。

  • 現在、group.func は分散検索ではサポートされていません。

  • group.ngroupsgroup.facet は、正確なカウントを返すために、各グループのすべてのドキュメントが同じシャードに配置されている必要があります。 複合キーによるドキュメントルーティングは、多くの状況で役立つソリューションです。