JSONファセッティングドメインの変更
ファセット計算は、ドキュメントの「ドメイン」で動作します。デフォルトでは、このドメインはメインクエリによって一致するドキュメントで構成されます。サブファセットの場合、ドメインは親ファセットによってバケットに配置されたすべてのドキュメントで構成されます。
ユーザーは、データを分割するファセットの「ドメイン」をオーバーライドして、関連するファセットのバケットが計算される前に、元のドメインを制限、拡張、または完全に変更するためのさまざまなオプションをサポートできるJSONオブジェクトである明示的な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
フィルタを破棄することで拡張されたドメインで動作します。
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
}
}
}
}