JSONファセッティングドメインの変更

ファセット計算は、ドキュメントの「ドメイン」で動作します。デフォルトでは、このドメインはメインクエリによって一致するドキュメントで構成されます。サブファセットの場合、ドメインは親ファセットによってバケットに配置されたすべてのドキュメントで構成されます。

ユーザーは、データを分割するファセットの「ドメイン」をオーバーライドして、関連するファセットのバケットが計算される前に、元のドメインを制限、拡張、または完全に変更するためのさまざまなオプションをサポートできるJSONオブジェクトである明示的なdomain属性を使用することもできます。

domainの変更は、データパーティショニングを行う個々のファセットでのみ指定できます。統計/メトリックファセットやファセットのグループでは指定できません。

domainの変更を伴う*:*クエリファセットを使用して、共通のドメイン変更を適用するために、任意のタイプの複数のサブファセットをグループ化できます。

ドメインフィルタの追加

ドメイン変更の最も簡単な例は、既存のドメインに追加のフィルタを指定することです。これは、ファセットのdomainブロック内のfilterキーワードを使用して行うことができます。

curl

curl http://localhost:8983/solr/techproducts/query -d '
{
  "query": "*:*",
  "facet": {
    "categories": {
      "type": "terms",
      "field": "cat",
      "limit": 3,
      "domain": {
        "filter": "popularity:[5 TO 10]"
      }
    }
  }
}'

SolrJ

final TermsFacetMap categoryFacet =
    new TermsFacetMap("cat")
        .setLimit(3)
        .withDomain(new DomainMap().withFilter("popularity:[5 TO 10]"));
final JsonQueryRequest request =
    new JsonQueryRequest().setQuery("*:*").withFacet("categories", categoryFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);

filterの値は、フィルタとして扱う単一のクエリ、またはフィルタクエリのJSONリストにすることができます。各クエリは次のことができます。

  • Solrクエリ構文のクエリを含む文字列。

  • Solrクエリ構文を含むリクエストパラメータを参照するもので、{param: <request_param_name>}という形式です。JSONリクエストAPIのクエリキーで定義されているDSL構文で、1つ以上のクエリを参照できます。参照されるパラメータは、0(存在しない)または複数の値を持つ場合があります。

    • 値が指定されていない場合、フィルタは適用されず、エラーは発生しません。

    • 複数の値が指定されている場合、各値は解析され、同時にフィルタとして使用されます。

DSLクエリを参照する例を以下に示します。

curl http://localhost:8983/solr/techproducts/query -d '
{
  "query": "*:*",
  "queries": {
      "sample_filtrs":[
           {"field":{"f":"text", "query":"usb"}},
           {"field":{"f":"text", "query":"lcd"}}
        ],
        "another_filtr":
            {"field":{"f":"text", "query":"usb"}}
  },
  "facet": {
    "usblcd": {
      "type": "terms",
      "field": "cat",
      "limit": 3,
      "domain": {
        "filter": {"param":"sample_filtrs"}
      }
    },
    "justusb": {
      "type": "terms",
      "field": "cat",
      "limit": 3,
      "domain": {
        "filter": {"param":"another_filtr"}
      }
    }
  }
}'

filterオプションと他のdomain変更オプションを組み合わせると、フィルタリングは他のドメイン変更が行われたに適用されます。

フィルタの除外

excludeTagsキーワードを使用して特定のタグ付きクエリフィルタを破棄または無視することにより、ドメインを拡張することもできます。

これは、以下の例で、検索に一致する上位2つのメーカーを表示するために使用されています。検索結果はフィルタmanu_id_s:appleと一致しますが、計算されたファセットは、このフィルタを破棄し、manu_id_sフィルタを破棄することで拡張されたドメインで動作します。

curl

curl http://localhost:8983/solr/techproducts/query -d '
{
  "query": "cat:electronics",
  "filter": "{!tag=MANU}manu_id_s:apple",
  "facet": {
    "stock": {"type": "terms", "field": "inStock", "limit": 2},
    "manufacturers": {
      "type": "terms",
      "field": "manu_id_s",
      "limit": 2,
      "domain": { "excludeTags":"MANU" }
    }
  }
}'

SolrJ

final TermsFacetMap inStockFacet = new TermsFacetMap("inStock").setLimit(2);
final TermsFacetMap allManufacturersFacet =
    new TermsFacetMap("manu_id_s")
        .setLimit(2)
        .withDomain(new DomainMap().withTagsToExclude("MANU"));
final JsonQueryRequest request =
    new JsonQueryRequest()
        .setQuery("cat:electronics")
        .withFilter("{!tag=MANU}manu_id_s:apple")
        .withFacet("stock", inStockFacet)
        .withFacet("manufacturers", allManufacturersFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);

excludeTagsの値は、単一の文字列タグ、文字列タグの配列、または単一の文字列内のカンマ区切りのタグにすることができます。

excludeTagsオプションと他のdomain変更オプションを組み合わせると、ドメインは他のドメイン変更が行われるに拡張されます。

複数選択ファセッティングに関するセクションも参照してください。

任意のドメインクエリ

query ドメインは、元のドメインとは無関係に、任意のドキュメントセットに対してファセットを計算したい場合に指定できます。最も一般的なユースケースは、メインクエリとは無関係に、コレクションの特定のサブセットに対してトップレベルのファセットを計算することです。しかし、セマンティック知識グラフを構築する場合のネストされたファセットでも役立ちます。

curl

curl http://localhost:8983/solr/techproducts/query -d '
{
  "query": "apple",
  "facet": {
    "popular_categories": {
      "type": "terms",
      "field": "cat",
      "domain": { "query": "popularity:[8 TO 10]" },
      "limit": 3
    }
  }
}'

SolrJ

final TermsFacetMap inStockFacet = new TermsFacetMap("inStock").setLimit(2);
final TermsFacetMap popularCategoriesFacet =
    new TermsFacetMap("cat")
        .withDomain(new DomainMap().withQuery("popularity:[8 TO 10]"))
        .setLimit(3);
final JsonQueryRequest request =
    new JsonQueryRequest()
        .setQuery("apple")
        .withFacet("popular_categories", popularCategoriesFacet);
QueryResponse queryResponse = request.process(solrClient, COLLECTION_NAME);

query の値は、単一のクエリ、またはクエリのJSONリストにすることができます。各クエリは、

  • Solrクエリ構文のクエリを含む文字列。

  • Solrクエリ構文を含むリクエストパラメータへの参照で、{param: <request_param_name>} の形式です。参照されるパラメータは、0(存在しない)または複数の値を持つ場合があります。

    • 値が指定されていない場合、エラーは発生しません。

    • 複数の値が指定されている場合、各値が解析され、クエリとして使用されます。

query ドメインは追加のドメインfilterと組み合わせることができますが、excludeTagsも使用することはできません。タグは無意味になるためです。query ドメインは、トップレベルのクエリとそれ以前のすべてのフィルタを完全に無視します。

ブロック結合ドメインの変更

コレクションにネストされたドキュメントが含まれている場合、blockChildrenまたはblockParentドメインオプションを使用して、あるタイプのドキュメントを含む既存のドメインを、指定された関係(子のまたは親の)を持つドキュメントを含むドメインに変換できます。

これらのオプションはどちらも、コレクション内のすべての親ドキュメントに排他的に一致する単一の文字列クエリを受け取る点で、対応するブロック結合クエリパーサーと同様に機能します。blockParentが使用される場合、結果のドメインには、元のドメインのドキュメントの子のすべての親ドキュメントが含まれます。blockChildrenが使用される場合、結果のドメインには、元のドメインの親のすべての子ドキュメントが含まれます。子ドキュメントのファセットを親ドキュメントでカウントする必要があることがよくあります。これは、ブロック結合ファセットカウントで説明されているように、uniqueBlock(_root_)を使用して実行できます。

{
  "colors": {                         (1)
    "type": "terms",
    "field": "sku_color",             (2)
    "facet" : {
      "brands" : {
        "type": "terms",
        "field": "product_brand",     (3)
        "domain": {
          "blockParent": "doc_type:product"
        }
      }}}}
1 この例では、製品に対応する親ドキュメントと、一意の色を持つ個々のSKUに対応する子ドキュメントがあり、元のクエリがSKUドキュメントに対して行われたことを前提としています。
2 colorsファセットは、検索に一致する元のすべてのSKUドキュメントに対して計算されます。
3 colorsファセットのバケットごとに、一致するすべてのSKUドキュメントのセットは、対応する親製品ドキュメントのセットに変換されます。結果のbrandsサブファセットは、各ブランドに存在する製品ドキュメント(関連付けられた色を持つSKUを持つ)の数をカウントします。

結合クエリドメインの変更

joinドメイン変更オプションを使用して、既存のドメインから関連するドキュメントセットへの変換に使用する任意のfromフィールドとtoフィールドを指定できます。

これは結合クエリパーサーと同様に機能し、マルチシャードコレクションを扱う場合と同じ制限があります。

{
  "colors": {
    "type": "terms",
    "field": "sku_color",
    "facet": {
      "brands": {
        "type": "terms",
        "field": "product_brand",
        "domain" : {
          "join" : {
            "from": "product_id_of_this_sku",
            "to": "id"
          },
          "filter": "doc_type:product"
        }
      }
    }
  }
}

joinドメイン変更は、オプションのmethodパラメータをサポートしています。これにより、ユーザーはこのドメイン変換で使用したい結合実装を指定できます。Solrは、パフォーマンス特性がそれぞれ異なるいくつかの結合実装を提供しています。これらの実装とそのトレードオフの詳細については、methodパラメータのドキュメントを参照してください。結合ドメイン変更は、crossCollectionを除くすべてのmethod値をサポートしています。

グラフトラバーサルドメインの変更

graphドメイン変更オプションはjoinドメインオプションと同様に機能しますが、既存のドメインから他のドキュメントへの複数ホップのトラバーサルを実行できます。

これはグラフクエリパーサーと非常によく似ており、そのオプションのパラメータをすべてサポートし、マルチシャードコレクションを扱う場合と同じ制限があります。

{
  "related_brands": {
    "type": "terms",
    "field": "brand",
    "domain": {
      "graph": {
        "from": "related_product_ids",
        "to": "id",
        "maxDepth": 3
      }
    }
  }
}