**ファセット**

ファセットとは、インデックス付きの用語に基づいて検索結果をカテゴリに分類することです。

検索者には、インデックス付きの用語と、各用語で見つかった一致するドキュメントの数値カウントが表示されます。ファセットを使用すると、ユーザーは検索結果を簡単に探索し、探している結果を絞り込むことができます。

これに対する別の方法については、JSON ファセット API も参照してください。

一般的なファセットパラメータ

ファセットを制御するための 2 つの一般的なパラメータがあります。

facet

必須

デフォルト: false

true に設定すると、このパラメータはクエリ応答でファセットカウントを有効にします。 false、空の値、または欠落している値に設定すると、このパラメータはファセットを無効にします。 このパラメータが true に設定されていない限り、以下にリストされている他のパラメータはすべて無効になります。

facet.query

オプション

デフォルト: なし

このパラメータを使用すると、Lucene のデフォルト構文で任意のクエリを指定して、ファセットカウントを生成できます。

デフォルトでは、Solr のファセット機能はフィールドの一意の用語を自動的に決定し、各用語のカウントを返します。 facet.query を使用すると、このデフォルトの動作をオーバーライドし、カウントする用語または式を正確に選択できます。 ファセットの典型的な実装では、いくつかの facet.query パラメータを指定します。 このパラメータは、数値範囲ベースのファセットまたはプレフィックスベースのファセットに特に役立ちます。

複数のクエリを個別のファセット制約として使用する必要があることを示すために、facet.query パラメータを複数回設定できます。

デフォルト構文以外の構文でファセットクエリを使用するには、ファセットクエリの前にクエリ表記法の名前を付けます。 たとえば、仮定の myfunc クエリパーサーを使用するには、次のように facet.query パラメータを設定します

facet.query={!myfunc}name~fred

フィールド値ファセットパラメータ

フィールドにインデックス付きの用語に基づいてファセットをトリガーするために、いくつかのパラメータを使用できます。

これらのパラメータを使用する場合、「用語」は Lucene では非常に具体的な概念であることを覚えておくことが重要です。これは、分析が行われた後にインデックス付けされるリテラルフィールド/値のペアに関連しています。ステミング、小文字化、または単語分割を含むテキストフィールドの場合、結果の用語は予期したものとは異なる場合があります。

Solrで完全なリテラル文字列に対して分析(検索用)とファセットの両方を実行する場合は、スキーマでcopyFieldディレクティブを使用して、フィールドの2つのバージョンを作成します。1つはテキスト、もう1つは文字列です。テキストフィールドは、検索に使用されるがファセットに使用されない場合はindexed="true" docValues="false"にする必要があり、文字列フィールドは、ファセットに使用されるが検索に使用されない場合はindexed="false" docValues="true"にする必要があります。(copyFieldディレクティブの詳細については、フィールドのコピーを参照してください。)

特に指定がない限り、以下のすべてのパラメータは、f.<fieldname>.facet.<parameter>の構文を使用して、フィールドごとに指定できます。

facet.field

オプション

デフォルト: なし

facet.fieldパラメータは、ファセットとして扱うべきフィールドを識別します。フィールド内の各用語を反復処理し、その用語を制約として使用してファセット数を生成します。このパラメータは、クエリで複数回指定して、複数のファセットフィールドを選択できます。

スキーマ内の少なくとも1つのフィールドにこのパラメータを設定しない場合、このセクションで説明されている他のパラメータはすべて効果がありません。
facet.prefix

オプション

デフォルト: なし

facet.prefixパラメータは、ファセット対象の用語を、指定された文字列プレフィックスで始まる用語に制限します。これは、クエリを制限するものではなく、クエリへの応答として返されるファセットのみを制限します。

facet.contains

オプション

デフォルト: なし

facet.containsパラメータは、ファセット対象の用語を、指定された部分文字列を含む用語に制限します。これは、クエリを制限するものではなく、クエリへの応答として返されるファセットのみを制限します。

facet.contains.ignoreCase

オプション

デフォルト: なし

facet.containsが使用されている場合、facet.contains.ignoreCaseパラメータは、指定された部分文字列を候補ファセット用語と照合する際に大文字と小文字を無視するようにします。

facet.matches

オプション

デフォルト: なし

正規表現に一致する用語のファセットバケットのみを返す場合に使用します。

facet.sort

オプション

デフォルト: なし

このパラメータは、ファセットフィールドの制約の順序を決定します。

このパラメータには2つのオプションがあります。

count

制約をカウントでソートします(カウントの高い順)。

index

制約をインデックス順(インデックス付き用語による辞書順)でソートして返します。ASCII範囲の用語の場合、これはアルファベット順にソートされます。

デフォルトは、facet.limitが0より大きい場合はcount、それ以外の場合はindexです。特定の用語でファセットを制限する場合、デフォルトのロジックが変更されることに注意してください。

facet.limit

オプション

デフォルト:100

このパラメータは、ファセットフィールドに対して返されるべき制約カウントの最大数(基本的に、フィールドのファセットの数)を指定します。負の値は、Solrが制約カウントを無制限に返すことを意味します。

facet.offset

オプション

デフォルト:0

facet.offsetパラメータは、ページングを許可するための制約リストへのオフセットを示します。

facet.mincount

オプション

デフォルト:0

facet.mincountパラメータは、ファセットフィールドが応答に含まれるために必要な最小カウントを指定します。フィールドのカウントが最小値を下回っている場合、フィールドのファセットは返されません。

facet.missing

オプション

デフォルト: false

trueに設定すると、このパラメータは、ファセットフィールドの用語ベースの制約に加えて、クエリに一致するがフィールドにファセット値がないすべての結果のカウントを計算して応答で返す必要があることを示します。

facet.method

オプション

デフォルト:fc

facet.methodパラメータは、Solrがフィールドをファセット化する際に使用するアルゴリズムまたはメソッドのタイプを選択します。

以下のメソッドが利用可能です。

enum

フィールド内のすべての用語を列挙し、用語に一致するドキュメントとクエリに一致するドキュメントの積集合を計算します。

このメソッドは、少数の個別値のみを持つ複数値フィールドのファセット化に推奨されます。ドキュメントあたりの平均値数は関係ありません。

たとえば、Alabama、Alaska、…​ Wyomingなどの米国の州を持つフィールドでファセット化すると、50個のキャッシュされたフィルターが作成され、繰り返し使用されます。filterCacheは、すべてのキャッシュされたフィルターを保持するのに十分な大きさにする必要があります。

fc

クエリに一致するドキュメントを反復処理し、各ドキュメントに現れる用語を合計することで、ファセット数を計算します。

これは現在、フィールドが複数値であるか、またはトークン化されている(FieldType.isTokened()による)場合、UnInvertedFieldキャッシュを使用して実装されています。各ドキュメントはキャッシュで検索され、含まれている用語/値が確認され、各値の集計が増加します。

このメソッドは、フィールドのインデックス付き値の数は多いが、ドキュメントあたりの値の数は少ない場合に最適です。複数値フィールドの場合、多くのドキュメントに一致する用語のfilterCacheからの用語フィルターを使用するハイブリッドアプローチが使用されます。文字fcはフィールドキャッシュの略です。

fcs

単一値文字列フィールドのセグメントごとのフィールドファセット。facet.method=fcsで有効にし、threadsローカルパラメータを使用して使用するスレッド数を制御します。このパラメータを使用すると、インデックスが急速に変化する場合にファセットを高速化できます。

デフォルト値はfcです(BoolFieldフィールドタイプを使用するフィールドとfacet.exists=trueが要求されている場合を除く)。これは、フィールドにインデックスに多くのユニークな用語がある場合、メモリ使用量が少なく、高速になる傾向があるためです。

facet.enum.cache.minDf

オプション

デフォルト:0

このパラメータは、その用語の制約カウントを決定する際にfilterCacheを使用する必要がある最小ドキュメント頻度(用語に一致するドキュメントの数)を示します。これは、ファセットのfacet.method=enumメソッドでのみ使用されます。

ゼロより大きい値は、filterCacheのメモリ使用量を削減しますが、クエリを処理するために必要な時間を増加させます。非常に多数の用語を持つフィールドでファセットを作成し、メモリ使用量を削減したい場合は、このパラメータを25から50の間の値に設定して、いくつかのテストを実行してみてください。その後、必要に応じてパラメータ設定を最適化します。

デフォルト値は0で、filterCacheがフィールド内のすべての用語に使用されます。

facet.exists

オプション

デフォルト: なし

ファセット数を1に制限するには、facet.exists=trueを指定します。このパラメータは、facet.method=enumを使用する場合、または省略されている場合に使用できます。これは、非トライフィールド(文字列など)でのみ使用できます。大きなインデックスやカーディナリティの高いファセット値のファセットカウントを高速化できます。

facet.excludeTerms

オプション

デフォルト: なし

ファセットカウントから用語を削除するが、インデックスには残したい場合、facet.excludeTermsパラメータを使用するとそれができます。

facet.overrequest.count and facet.overrequest.ratio

オプション

デフォルト:*説明を参照*

状況によっては、分散Solrクエリでファセットに返される「上位」制約を選択する際の精度を、個々のシャードそれぞれから必要な制約の数(つまり、facet.limit)を「オーバーリクエスト」することで向上させることができます。このような状況では、各シャードはデフォルトで上位10 + (1.5 * facet.limit)の制約を要求されます。

ドキュメントがシャード間でどのようにパーティション分割されているか、および使用したfacet.limit値に応じて、Solrが行うオーバーリクエストの量を増減すると有利な場合があります。これは、facet.overrequest.count(デフォルトは10)およびfacet.overrequest.ratio(デフォルトは1.5)パラメータを設定することで実現できます。

facet.threads

オプション

デフォルト: なし

このパラメータは、ファセットで使用される基になるフィールドの読み込みを、指定されたスレッド数で並列に実行させます。facet.threads=Nとして指定します。ここで、Nは使用される最大スレッド数です。

このパラメータを省略するか、スレッド数を0として指定すると、スレッドは生成されず、メインのリクエストスレッドのみが使用されます。負のスレッド数を指定すると、最大Integer.MAX_VALUEスレッドが作成されます。

範囲ファセット

範囲ファセットは、日付フィールド、または範囲クエリをサポートする数値フィールドで使用できます。これは、価格などの範囲クエリ(クエリによるファセット)をまとめてつなぎ合わせる場合に特に役立ちます。

facet.range

必須

デフォルト: なし

facet.rangeパラメータは、Solrが範囲ファセットを作成するフィールドを定義します。例えば

facet.range=price&facet.range=age
facet.range=lastModified_dt
facet.range.start

必須

デフォルト: なし

facet.range.startパラメータは、範囲の下限を指定します。このパラメータは、f.<fieldname>.facet.range.startの構文を使用してフィールドごとに指定できます。例えば

f.price.facet.range.start=0.0&f.age.facet.range.start=10
f.lastModified_dt.facet.range.start=NOW/DAY-30DAYS
facet.range.end

必須

デフォルト: なし

facet.range.endは、範囲の上限を指定します。このパラメータは、f.<fieldname>.facet.range.endの構文を使用してフィールドごとに指定できます。例えば

f.price.facet.range.end=1000.0&f.age.facet.range.start=99
f.lastModified_dt.facet.range.end=NOW/DAY+30DAYS
facet.range.gap

必須

デフォルト: なし

下限に追加される値として表される各範囲のスパン。日付フィールドの場合、これはDateMathParser構文を使用して表す必要があります(例:facet.range.gap=%2B1DAY …​ '+1DAY')。

このパラメータは、f.<fieldname>.facet.range.gapの構文を使用してフィールドごとに指定できます。例えば

f.price.facet.range.gap=100&f.age.facet.range.gap=10
f.lastModified_dt.facet.range.gap=+1DAY
facet.range.hardend

オプション

デフォルト: false

facet.range.hardendパラメータは、facet.range.gapfacet.range.startfacet.range.endの間で均等に分割されない場合にSolrがどのように処理するかを指定するブールパラメータです。

trueの場合、最後の範囲制約は、上限としてfacet.range.end値を持ちます。falseの場合、最後の範囲はfacet.range.endより大きい最小の上限値を持つため、範囲は指定された範囲ギャップと完全に同じ幅になります。

このパラメータは、f.<fieldname>.facet.range.hardendの構文を使用してフィールドごとに指定できます。

facet.range.include

オプション

デフォルト:*説明を参照*

デフォルトでは、facet.range.startfacet.range.endの間の範囲ファセットを計算するために使用される範囲は、下限を含み、上限を含みません。facet.range.otherパラメータで定義された「before」範囲は排他的であり、「after」範囲は包含的です。以下の「lower」に相当するこのデフォルトでは、境界で二重カウントが発生しません。以下のオプションを使用して、facet.range.includeパラメータでこの動作を変更できます。

  • lower:すべてのギャップベースの範囲は、その下限を含みます。

  • upper:すべてのギャップベースの範囲は、その上限を含みます。

  • edge:最初と最後のギャップ範囲は、対応するupper/lowerオプションが指定されていない場合でも、エッジ境界(最初の範囲は下限、最後の範囲は上限)を含みます。

  • outer:最初または最後の範囲にすでにこれらの境界が含まれている場合でも、「before」および「after」範囲は境界を含みます。

  • all:すべてのオプション(lowerupperedgeouter)を含みます。

このパラメータは、f.<fieldname>.facet.range.includeの構文を使用してフィールドごとに指定でき、複数回指定して複数の選択肢を示すことができます。

二重カウントを避けるためには、lowerupperの両方を選択せず、outerを選択せず、allを選択しないでください。
facet.range.other

オプション

デフォルト: なし

facet.range.otherパラメータは、facet.range.startfacet.range.endの間の各範囲制約のカウントに加えて、以下のオプションのカウントも計算する必要があることを指定します。

  • before:最初の範囲の下限より小さいフィールド値を持つすべてのレコード。

  • after:最後の範囲の上限より大きいフィールド値を持つすべてのレコード。

  • between:すべての範囲の開始境界と終了境界の間にあるフィールド値を持つすべてのレコード。

  • none:カウントを計算しません。

  • all:before、between、およびafterのカウントを計算します。

このパラメータは、f.<fieldname>.facet.range.otherの構文を使用してフィールドごとに指定できます。allオプションに加えて、このパラメータは複数回指定して複数の選択肢を示すことができますが、noneは他のすべてのオプションをオーバーライドします。

facet.range.method

オプション

デフォルト:filter

facet.range.methodパラメータは、Solrが範囲ファセットに使用するアルゴリズムまたはメソッドのタイプを選択します。どちらのメソッドも同じ結果を生成しますが、パフォーマンスは異なる場合があります。

filter

このメソッドは、他の facet.range パラメータに基づいて範囲を生成し、それぞれに対してフィルタを実行します。このフィルタは、後でメインクエリの結果セットと交差してカウントを取得します。 filterCache を使用するため、すべての範囲を格納するのに十分な大きさのキャッシュがあればメリットがあります。

dv

このメソッドは、メインクエリに一致するドキュメントを反復処理し、それぞれに対して値の正しい範囲を見つけます。このメソッドは、(フィールドで有効になっている場合)DocValues または fieldCache を使用します。 dv メソッドは、フィールドタイプ DateRangeField または group.facets を使用している場合はサポートされていません。

日付範囲とタイムゾーン

日付フィールドの範囲ファセットは、TZ パラメータが役立つ一般的な状況です。特定のタイムゾーンを基準とした、1 日または 1 か月が「開始」する時点の明確な定義に基づいて、「1 日あたりのファセット数」または「1 か月あたりのファセット数」が計算されるようにするためです。

詳細については、日付の書式設定と日付演算 セクションの例を参照してください。

範囲ファセットにおける facet.mincount

フィールドファセットで使用されるのと同じ facet.mincount パラメータは、範囲ファセットにも適用されます。使用すると、最小値を下回るカウントの範囲はレスポンスに含まれません。

ピボット(決定木)ファセット

ピボットは、テーブルに格納されているデータの自動的な並べ替え、カウント、合計、または平均を可能にする集計ツールです。結果は通常、集計データを示す 2 番目のテーブルに表示されます。ピボットファセットを使用すると、複数のフィールドでドキュメントをファセットした結果のサマリーテーブルを作成できます。

別の見方をすれば、クエリは決定木を生成します。つまり、Solr は「ファセット A について、制約/カウントは X/N、Y/M などです。A を X で制約すると、B の制約カウントは S/P、T/Q などになります」と示します。言い換えれば、現在のファセット結果から制約を適用した場合、フィールドの「次の」ファセット結果のセットがどうなるかを事前に示します。

facet.pivot

オプション

デフォルト: なし

facet.pivot パラメータは、ピボットに使用するフィールドを定義します。複数の facet.pivot 値を指定すると、レスポンスに複数の「facet_pivot」セクションが作成されます。フィールドの各リストはコンマで区切ります。

facet.pivot.mincount

オプション

デフォルト:1

facet.pivot.mincount パラメータは、ファセットが結果に含まれるために必要な一致ドキュメントの最小数を定義します。

「bin/solr -e techproducts」の例を使用すると、このクエリ URL は以下のデータを返します。ピボットファセットの結果は「facet_pivot」セクションにあります。

https://127.0.0.1:8983/solr/techproducts/select?q=*:*&facet.pivot=cat,popularity,inStock
   &facet.pivot=popularity,cat&facet=true&facet.field=cat&facet.limit=5&rows=0&facet.pivot.mincount=2
{  "facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "cat":[
        "electronics",14,
        "currency",4,
        "memory",3,
        "connector",2,
        "graphics card",2]},
    "facet_dates":{},
    "facet_ranges":{},
    "facet_pivot":{
      "cat,popularity,inStock":[{
          "field":"cat",
          "value":"electronics",
          "count":14,
          "pivot":[{
              "field":"popularity",
              "value":6,
              "count":5,
              "pivot":[{
                  "field":"inStock",
                  "value":true,
                  "count":5}]}]
}]}}}

統計コンポーネントとピボットの組み合わせ

他のタイプのファセットでサポートされている一般的なローカルパラメータに加えて、stats ローカルパラメータを facet.pivot と共に使用して、各ピボット制約に対して計算するstats.field インスタンスを(タグで)参照できます。

以下の例では、facet.pivot 結果階層のそれぞれに対して、2 つの異なる(重複する)統計セットが計算されます。

stats=true
stats.field={!tag=piv1,piv2 min=true max=true}price
stats.field={!tag=piv2 mean=true}popularity
facet=true
facet.pivot={!stats=piv1}cat,inStock
facet.pivot={!stats=piv2}manu,inStock

結果

{"facet_pivot":{
  "cat,inStock":[{
      "field":"cat",
      "value":"electronics",
      "count":12,
      "pivot":[{
          "field":"inStock",
          "value":true,
          "count":8,
          "stats":{
            "stats_fields":{
              "price":{
                "min":74.98999786376953,
                "max":399.0}}}},
        {
          "field":"inStock",
          "value":false,
          "count":4,
          "stats":{
            "stats_fields":{
              "price":{
                "min":11.5,
                "max":649.989990234375}}}}],
      "stats":{
        "stats_fields":{
          "price":{
            "min":11.5,
            "max":649.989990234375}}}},
    {
      "field":"cat",
      "value":"currency",
      "count":4,
      "pivot":[{
          "field":"inStock",
          "value":true,
          "count":4,
          "stats":{
            "stats_fields":{
              "price":{
                "..."
  "manu,inStock":[{
      "field":"manu",
      "value":"inc",
      "count":8,
      "pivot":[{
          "field":"inStock",
          "value":true,
          "count":7,
          "stats":{
            "stats_fields":{
              "price":{
                "min":74.98999786376953,
                "max":2199.0},
              "popularity":{
                "mean":5.857142857142857}}}},
        {
          "field":"inStock",
          "value":false,
          "count":1,
          "stats":{
            "stats_fields":{
              "price":{
                "min":479.95001220703125,
                "max":479.95001220703125},
              "popularity":{
                "mean":7.0}}}}],
      "..."}]}}}}]}]}}

ファセットクエリとファセット範囲のピボットファセットとの組み合わせ

query ローカルパラメータを facet.pivot と共に使用して、各ピボット制約に対して計算する facet.query インスタンスを(タグで)参照できます。同様に、range ローカルパラメータを facet.pivot と共に使用して、facet.range インスタンスを参照できます。

以下の例では、facet.pivot 結果階層のそれぞれに対して 2 つのクエリファセットが計算されます。

facet=true
facet.query={!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]
facet.query={!tag=q1}price:[0 TO 100]
facet.pivot={!query=q1}cat,inStock
{"facet_counts": {
    "facet_queries": {
      "{!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]": 9,
      "{!tag=q1}price:[0 TO 100]": 7
    },
    "facet_fields": {},
    "facet_dates": {},
    "facet_ranges": {},
    "facet_intervals": {},
    "facet_heatmaps": {},
    "facet_pivot": {
      "cat,inStock": [
        {
          "field": "cat",
          "value": "electronics",
          "count": 12,
          "queries": {
            "{!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]": 9,
            "{!tag=q1}price:[0 TO 100]": 4
          },
          "pivot": [
            {
              "field": "inStock",
              "value": true,
              "count": 8,
              "queries": {
                "{!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]": 6,
                "{!tag=q1}price:[0 TO 100]": 2
              }
            },
            "..."]}]}}}

同様に、以下の例では、facet.pivot 結果階層のそれぞれに対して 2 つの範囲ファセットが計算されます。

facet=true
facet.range={!tag=r1}manufacturedate_dt
facet.range.start=2006-01-01T00:00:00Z
facet.range.end=NOW/YEAR
facet.range.gap=+1YEAR
facet.pivot={!range=r1}cat,inStock
{"facet_counts":{
    "facet_queries":{},
    "facet_fields":{},
    "facet_dates":{},
    "facet_ranges":{
      "manufacturedate_dt":{
        "counts":[
          "2006-01-01T00:00:00Z",9,
          "2007-01-01T00:00:00Z",0,
          "2008-01-01T00:00:00Z",0,
          "2009-01-01T00:00:00Z",0,
          "2010-01-01T00:00:00Z",0,
          "2011-01-01T00:00:00Z",0,
          "2012-01-01T00:00:00Z",0,
          "2013-01-01T00:00:00Z",0,
          "2014-01-01T00:00:00Z",0],
        "gap":"+1YEAR",
        "start":"2006-01-01T00:00:00Z",
        "end":"2015-01-01T00:00:00Z"}},
    "facet_intervals":{},
    "facet_heatmaps":{},
    "facet_pivot":{
      "cat,inStock":[{
          "field":"cat",
          "value":"electronics",
          "count":12,
          "ranges":{
            "manufacturedate_dt":{
              "counts":[
                "2006-01-01T00:00:00Z",9,
                "2007-01-01T00:00:00Z",0,
                "2008-01-01T00:00:00Z",0,
                "2009-01-01T00:00:00Z",0,
                "2010-01-01T00:00:00Z",0,
                "2011-01-01T00:00:00Z",0,
                "2012-01-01T00:00:00Z",0,
                "2013-01-01T00:00:00Z",0,
                "2014-01-01T00:00:00Z",0],
              "gap":"+1YEAR",
              "start":"2006-01-01T00:00:00Z",
              "end":"2015-01-01T00:00:00Z"}},
          "pivot":[{
              "field":"inStock",
              "value":true,
              "count":8,
              "ranges":{
                "manufacturedate_dt":{
                  "counts":[
                    "2006-01-01T00:00:00Z",6,
                    "2007-01-01T00:00:00Z",0,
                    "2008-01-01T00:00:00Z",0,
                    "2009-01-01T00:00:00Z",0,
                    "2010-01-01T00:00:00Z",0,
                    "2011-01-01T00:00:00Z",0,
                    "2012-01-01T00:00:00Z",0,
                    "2013-01-01T00:00:00Z",0,
                    "2014-01-01T00:00:00Z",0],
                  "gap":"+1YEAR",
                  "start":"2006-01-01T00:00:00Z",
                  "end":"2015-01-01T00:00:00Z"}}},
                  "..."]}]}}}

追加のピボットパラメータ

facet.pivot.mincount は、フィールドファセットで使用される facet.mincount パラメータとは名前が異なりますが、上記で説明した多くのファセットパラメータはピボットファセットでも使用できます。

  • facet.limit

  • facet.offset

  • facet.sort

  • facet.overrequest.count

  • facet.overrequest.ratio

インターバルファセット

サポートされているもう 1 つのファセット形式は、インターバルファセットです。これは範囲ファセットに似ていますが、機能的には範囲クエリを使用したファセットクエリに近いです。インターバルファセットを使用すると、可変インターバルを設定し、指定されたフィールド内のそれらのインターバル内に値を持つドキュメントの数をカウントできます。

範囲クエリを使用したファセットクエリで同じ機能を実現できますが、これら 2 つのメソッドの実装は大きく異なり、コンテキストに応じて異なるパフォーマンスが得られます。

検索のパフォーマンスが気になる場合は、両方のオプションでテストする必要があります。インターバルファセットは、同じフィールドに複数のインターバルがある場合に適している傾向があり、ファセットクエリは、フィルタキャッシュがより効果的な環境(静的インデックスなど)で適している傾向があります。

このメソッドは、フィールドで有効になっている場合、DocValues を使用し、それ以外の場合は fieldCache を使用します。

インターバルファセットには、次のパラメータを使用します。

facet.interval

オプション

デフォルト: なし

このパラメータは、インターバルファセットを適用する必要があるフィールドを示します。同じリクエストで複数回使用して、複数のフィールドを示すことができます。

facet.interval=price&facet.interval=size

facet.interval.set

オプション

デフォルト: なし

このパラメータは、フィールドのインターバルを設定するために使用されます。複数回指定して、複数のインターバルを示すことができます。このパラメータはグローバルです。つまり、特定のフィールドのオーバーライドがない限り、facet.interval で示されたすべてのフィールドに使用されます。特定のフィールドでこのパラメータをオーバーライドするには、f.<fieldname>.facet.interval.set を使用します。次に例を示します。

f.price.facet.interval.set=[0,10]&f.price.facet.interval.set=(10,100]

インターバル構文

インターバルは '(' または '[' で始まり、開始値、コンマ(',')、終了値、そして ')' または ']' で終わる必要があります。

次に例を示します。

  • (1,10) → 1 より大きく 10 より小さい値が含まれます

  • [1,10) → 1 以上 10 未満の値が含まれます

  • [1,10] → 1 以上 10 以下の値が含まれます

開始値と終了値を空にすることはできません。

インターバルを無制限にする必要がある場合は、開始と終了の両方の制限に特殊文字 * を使用できます。この特殊文字を使用する場合、開始構文オプション (([) と終了構文オプション ()]) は同じように扱われます。 [*,*] には、フィールドに値を持つすべてのドキュメントが含まれます。

インターバルの制限は文字列にすることができますが、引用符を追加する必要はありません。コンマまでのすべてのテキストは開始制限として扱われ、それ以降のテキストは終了制限として扱われます。例:[Buenos Aires,New York]。文字列インターバル内のドキュメントを照合するために、文字列のような比較が行われることに注意してください(大文字と小文字は区別されます)。比較子は変更できません。

コンマ、括弧、角かっこは、前に \ を付けることでエスケープできます。値の前後の空白は省略されます。

開始制限は終了制限より大きくすることはできません。制限が等しいことは許可されています。これにより、[A,A][B,B][C,Z] など、カウントする特定の値を示すことができます。

インターバルファセットは、以下で説明する出力キーの置換をサポートしています。出力キーは、facet.interval パラメータfacet.interval.set パラメータ の両方で置き換えることができます。次に例を示します。

&facet.interval={!key=popularity}some_field
&facet.interval.set={!key=bad}[0,5]
&facet.interval.set={!key=good}[5,*]
&facet=true

ファセットのローカルパラメータ

ローカルパラメータ構文を使用すると、グローバル設定をオーバーライドできます。また、XML 属性と同様に、他のパラメータ値にメタデータを追加する方法を提供することもできます。

フィルタのタグ付けと除外

特定のフィルタにタグを付け、ファセット時にそれらのフィルタを除外できます。これは、複数選択ファセットを行う場合に役立ちます。

ファセットを使用した次のクエリ例を考えてみましょう。

q=mainquery&fq=status:public&fq=doctype:pdf&facet=true&facet.field=doctype

すべてがすでにフィルタ doctype:pdf によって制約されているため、facet.field=doctype ファセットコマンドは現在冗長であり、doctype:pdf 以外のすべてに対して 0 カウントを返します。

doctype の複数選択ファセットを実装するために、GUI は、doctype:pdf 制約がまだ適用されていないかのように、他の doctype 値とその関連するカウントを引き続き表示したい場合があります。次に例を示します。

=== Document Type ===
  [ ] Word (42)
  [x] PDF  (96)
  [ ] Excel(11)
  [ ] HTML (63)

現在選択されていない doctype 値のカウントを返すには、doctype を直接制約するフィルタにタグを付け、doctype でファセットを行うときにそれらのフィルタを除外します。

q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&facet=true&facet.field={!ex=dt}doctype

フィルタの除外は、すべてのタイプのファセットでサポートされています。 tagex の両方のローカルパラメータは、コンマで区切ることで複数の値を指定できます。

出力キーの変更

ファセットコマンドの出力キーを変更するには、key ローカルパラメータで新しい名前を指定します。次に例を示します。

facet.field={!ex=dt key=mylabel}doctype

上記のパラメータ設定により、「doctype」フィールドのフィールドファセットの結果は、レスポンスで「doctype」ではなく「mylabel」キーを使用して返されます。これは、異なる除外で同じフィールドで複数回ファセットを行う場合に役立ちます。

特定の用語でのファセットの制限

フィールドファセットを特定の用語に制限するには、terms ローカルパラメータでコンマ区切りで指定します。用語のコンマと引用符は、\, のようにバックスラッシュでエスケープできます。この場合、ファセットは facet.method=enum と同様の方法で計算されますが、facet.enum.cache.minDf は無視されます。次に例を示します。

facet.field={!terms='alfa,betta,with\,with\',with space'}symbol

このローカルパラメータは、facet.sort のデフォルトロジックをオーバーライドします。 facet.sort が省略された場合、ファセットは指定された用語の順序で返されます。これは、indexcount の値で変更される可能性があります。注:このパラメータが指定されている場合、他のパラメータは完全にサポートされない場合があります。

距離によるファセットとファセットによるヒートマップの生成の例については、空間検索 を参照してください。

JSON レスポンスライターを使用する場合のフィールドファセットデータの書き込み形式を制御する json.nl パラメータの詳細については、json.nl を参照してください。