web-dev-qa-db-ja.com

子要素を持つSolrドキュメント?

サブ要素を含むsolrドキュメントを作成することはどういうわけか可能ですか?

たとえば、次のようなものをどのように表現しますか。

<person first="Bob" last="Smith">
   <children>
      <child first="Little" last="Smith" />
      <child first="Junior" last="Smith" />
   </children>
</person>

この問題を解決する通常の方法は何ですか?

20
cambo

検索/ファセットのニーズに応じて、さまざまな方法でこれをモデル化できます。通常、複数値または動的フィールドを使用します。次の例では、フィールドタイプ、インデックス付きフラグ、および格納フラグを省略します。

<field name="first"/>
<field name="last"/>
<field name="child_first" multiValued="true"/>
<field name="child_last" multiValued="true"/>

子の姓と名を関連付けるのはあなた次第です。または、両方を1つのフィールドに入力することもできます。

<field name="first"/>
<field name="last"/>
<field name="child_first_and_last" multiValued="true"/>

もう1つ:

<field name="first"/>
<field name="last"/>
<dynamicField name="child_first_*"/>
<dynamicField name="child_last_*"/>

ここでは、フィールド 'child_first_1'、 'child_last_1'、 'child_first_2'、 'child_last_2'などを格納します。ここでも、値を相互に関連付けるのはあなた次第ですが、少なくともインデックスはあります。いくつかのコードを使用すると、これを透過的にすることができます。

結論: Solr wiki のように:「Solrは1つのテーブルを提供します。通常、セットのデータベーステーブルをインデックスに格納するには、いくつかのテーブルを非正規化する必要があります。非正規化を回避しようとすると、通常は失敗します。」検索のニーズに応じてデータを非正規化するのはあなた次第です。

更新:バージョン4.5以降、Solrはネストされたドキュメントを直接サポートします: https://cwiki.Apache.org/confluence/display/solr/Other+Parsers#OtherParsers-BlockJoinQueryParsers

13

Solr 4.7および4.8以降、Solrはネストされたドキュメントをサポートします。

{
"id": "chapter1",
"title" : "Indexing Child Documents in JSON",
"content_type": "chapter",
"_childDocuments_": [
  {
    "id": "1-1",
    "content_type": "page",
    "text": "ho hum... this is page 1 of chapter 1"
  },
  {
    "id": "1-2",
    "content_type": "page",
    "text": "more text... this is page 2 of chapter 1"
  }
]
}

詳細は Solrリリースノート を参照してください。

21
whomer

子供用に個別のフィールドがあると、誤検知の一致につながります。連結フィールドはある意味で機能しますが、それは本当に限られたアプローチです。 http://blog.griddynamics.com/2011/06/solr-experience-search-parent-child.html でブログに掲載されている同様のタスクで多くの経験があります。

7
mkhludnev