ブロック結合クエリパーサー

ブロック結合をサポートするクエリパーサーは 2 つあります。これらのパーサーは、ネストされたドキュメントとしてインデックス化されたリレーショナルコンテンツのインデックス化と検索を可能にします。

以下のクエリパーサーの使用例は、次のドキュメントがインデックス化されていることを前提としています

<add>
  <doc>
    <field name="id">1</field>
    <field name="content_type">parent</field>
    <field name="title">Solr has block join support</field>
    <doc>
      <field name="id">2</field>
      <field name="content_type">child</field>
      <field name="comments">SolrCloud supports it too!</field>
    </doc>
  </doc>
  <doc>
    <field name="id">3</field>
    <field name="content_type">parent</field>
    <field name="title">New Lucene and Solr release</field>
    <doc>
      <field name="id">4</field>
      <field name="content_type">child</field>
      <field name="comments">Lots of new features</field>
    </doc>
  </doc>
</add>

ブロック結合子クエリパーサー

このパーサーは、一部の親ドキュメントに一致するクエリをラップし、それらのドキュメントの子を返します。

このパーサーの構文は次のとおりです。q={!child of=<blockMask>}<someParents>

  • 内部の従属クエリ文字列(someParents)は、一部の親ドキュメントに一致するクエリでなければなりません

  • of パラメータは、ブロックマスクとして使用するクエリ文字列である必要があります。通常、考えられるすべての親ドキュメントのセットに一致するクエリです

結果のクエリは、<blockMask> クエリに一致*せず*、<someParents> によって一致するドキュメントの子(または子孫)であるすべてのドキュメントに一致します。

上記のサンプルドキュメントを使用して、q={!child of="content_type:parent"}title:lucene のようなクエリを作成できます。応答としてドキュメントは 1 つだけ取得されます

<result name="response" numFound="1" start="0">
  <doc>
    <str name="id">4</str>
    <arr name="content_type"><str>child</str></arr>
    <str name="comments">Lots of new features</str>
  </doc>
</result>

someParents のクエリは、ブロックマスクによって一致するドキュメントの厳密なサブセットに一致する*必要*があります。そうでない場合、クエリでエラーが発生する可能性があります

Parent query must not match any docs besides parent filter.
Combine them as must (+) and must-not (-) clauses to find a problem doc.

このタイプのエラーが発生した場合は、q=+(someParents) -(blockMask) を検索して原因を見つけることができます。

フィルタリングとタグ付け

{!child} は、次のような filters および excludeTags ローカルパラメータもサポートしています

?q={!child of=<blockMask> filters=$parentfq excludeTags=certain}<someParents>
&parentfq=BRAND:Foo
&parentfq=NAME:Bar
&parentfq={!tag=certain}CATEGORY:Baz

これは以下と同等です

q={!child of=<blockMask>}+<someParents> +BRAND:Foo +NAME:Bar

クエリを参照するための filters の「$」構文に注目してください。カンマ区切りのタグ excludeTags を使用すると、タグ付けによって特定のクエリを除外できます。全体的な考え方は、ファセットでの fq の除外に似ています。フィルタリングは従属節(<someParents>)に適用され、積集合の結果が子に結合されることに注意してください。

すべての子の構文

従属節(<someParents>)が省略された場合、子ドキュメントの*セグメント化*され*キャッシュされた*フィルタとして解析されます。より正確には、q={!child of=<blockMask>}q=*:* -<blockMask> と同等です。

ブロック結合親クエリパーサー

このパーサーは、子ドキュメントに一致するクエリを受け取り、その親を返します。

このパーサーの構文は、child パーサーに似ています。q={!parent which=<blockMask>}<someChildren>

  • 内部の従属クエリ文字列(someChildren)は、一部の子ドキュメントに一致するクエリでなければなりません

  • which パラメータは、ブロックマスクとして使用するクエリ文字列である必要があります。通常、すべての可能な親ドキュメントのセットに一致するクエリです。

結果のクエリは、<blockMask> クエリに一致し、<someChildren> で一致するドキュメントの親(または祖先)であるすべてのドキュメントに一致します。

上記のドキュメント例を再度使用して、q={!parent which="content_type:parent"}comments:SolrCloud のようなクエリを構築できます。このドキュメントが応答として返されます。

<result name="response" numFound="1" start="0">
  <doc>
    <str name="id">1</str>
    <arr name="content_type"><str>parent</str></arr>
    <arr name="title"><str>Solr has block join support</str></arr>
  </doc>
</result>

someChildren のクエリは、ブロックマスクに一致するドキュメントに一致してはなりません。一致した場合、クエリはエラーになる可能性があります。

Child query must not match same docs with parent filter.
Combine them as must clauses (+) to find a problem doc.

原因を特定するには、q=+(blockMask) +(someChildren) を検索できます。

フィルタリングとタグ付け

{!parent} クエリは、以下のように filters および excludeTags ローカルパラメータをサポートしています。

?q={!parent which=<blockMask> filters=$childfq excludeTags=certain}<someChildren>
&childfq=COLOR:Red
&childfq=SIZE:XL
&childfq={!tag=certain}PRINT:Hatched

これは以下と同等です

q={!parent which=<blockMask>}+<someChildren> +COLOR:Red +SIZE:XL

filters 内の "$" 構文は、クエリを参照するために使用されます。 excludeTags 内のカンマ区切りのタグを使用すると、タグ付けによって特定のクエリを除外できます。全体的な考え方は、ファセットでの fq の除外に似ています。フィルタリングは最初に下位句(<someChildren>)に適用され、積集合の結果が親に結合されることに注意してください。

ブロック結合親クエリパーサーによるスコアリング

オプションで、score ローカルパラメータを使用して、下位クエリのスコアを返すことができます。このパラメータに使用する値は集計のタイプを定義し、avg(平均)、max(最大)、min(最小)、total (合計) です。暗黙的なデフォルトは none で、0.0 を返します。

すべての親の構文

下位句(<someChildren>)が省略された場合、すべての親ドキュメントの*セグメント化*され*キャッシュ*されたフィルターとして解析されます。より正確には、q={!parent which=<blockMask>}q=<blockMask> と同等です。

ブロックマスク:of および which ローカルパラメータ

of または which パラメータ(使用されるパーサーによって異なります)として指定された「ブロックマスク」クエリの目的は、インデックス内の「親」(*またはその祖先*)として扱われるべきドキュメントのセットと、「子」として扱われるべきドキュメントを識別することです。「オンディスク」インデックスでは、関係はドキュメントの「ブロック」にフラット化されているため、階層関係の境界を識別するために、フラットドキュメントブロックに対して「マスク」として機能する of / which パラメータが必要です。

上記のクエリ例では、データが非常に単純であるため、doc_type:parent という非常に単純なブロックマスクを使用できました。すべてのドキュメントは parent または child のいずれかです。そのため、このクエリ文字列はすべてのドキュメントを簡単に区別します。

よくある間違いは、一致する親をフィルタリングするために、すべての親ドキュメントのセットよりも制限の厳しい which パラメータを使用しようとすることです。次の悪い例のように。

// BAD! DO NOT USE!
q={!parent which="title:join"}comments:support

このタイプのクエリは、多くの場合、期待どおりに機能しません。 which パラメータは「親」ドキュメントの*一部*のみを識別するため、結果のクエリは一致しないはずの「親」ドキュメントに一致する可能性があります。 which="title:join" ブロックマスクに一致*しない*すべてのドキュメントを、インデックス内の次の「親」ドキュメント(このマスクに一致する)の子として誤って識別するためです。

親/子ドキュメントと、子がなく*'親'ドキュメントを識別するために使用されるクエリに一致しない*「単純な」ドキュメントを混在させると、同様の問題が発生する可能性があります。たとえば、既存の親子ドキュメント例に次のドキュメントを追加するとします。

<add>
  <doc>
    <field name="id">0</field>
    <field name="content_type">plain</field>
    <field name="title">Lucene and Solr are cool</field>
  </doc>
</add>

…​すると、単純な doc_type:parent ブロックマスクは適切ではなくなります。「単純な」ドキュメントが隣接する「親」ドキュメントの「子」として誤って扱われるのを防ぐために、代わりに *:* -doc_type:child または doc_type:(simple parent) を使用する必要があります。

ネストされた子ドキュメントの検索セクションには、ドキュメントの非自明な階層を持つブロックマスククエリの指定に関するより詳細な例が含まれています。