ブロック結合クエリパーサー
ブロック結合をサポートするクエリパーサーは 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>
Parent query must not match any docs besides parent filter. Combine them as must (+) and must-not (-) clauses to find a problem doc. このタイプのエラーが発生した場合は、 |
フィルタリングとタグ付け
{!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>
)に適用され、積集合の結果が子に結合されることに注意してください。
ブロック結合親クエリパーサー
このパーサーは、子ドキュメントに一致するクエリを受け取り、その親を返します。
このパーサーの構文は、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>
Child query must not match same docs with parent filter. Combine them as must clauses (+) to find a problem doc. 原因を特定するには、 |
フィルタリングとタグ付け
{!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>
)に適用され、積集合の結果が親に結合されることに注意してください。
ブロックマスク: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)
を使用する必要があります。
ネストされた子ドキュメントの検索セクションには、ドキュメントの非自明な階層を持つブロックマスククエリの指定に関するより詳細な例が含まれています。