2011-04-07 4 views
20

Est-il en quelque sorte possible de créer un document solr qui contient des sous-éléments?Documents Solr avec éléments enfants?

Par exemple, comment pourrais-je représenter quelque chose comme ceci:

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

Quelle est la façon habituelle pour résoudre ce problème?

Répondre

13

Vous pouvez modéliser ceci de différentes manières, en fonction de vos besoins de recherche/facettage. Habituellement, vous utiliserez des champs à plusieurs valeurs ou dynamiques. Dans les prochains exemples que je vais omettez le type de champ, drapeaux indexés et stockés:

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

Il est à vous pour établir une corrélation entre les enfants des prénoms et noms de famille. Ou vous pouvez simplement mettre les deux dans un seul champ:

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

Un autre:

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

Vous stockeriez champs 'child_first_1', 'child_last_1', 'child_first_2', 'child_last_2', etc. Encore une fois c'est à vous de corréler les valeurs, mais au moins vous avez un index. Avec du code, vous pouvez rendre cela transparent.

Ligne de fond: comme l'indique le message Solr wiki: "Solr fournit une table.Le stockage d'une table de base de données dans un index nécessite généralement la dénormalisation de certaines tables, car les tentatives de dénormalisation échouent généralement." C'est à vous de dénormaliser vos données en fonction de vos besoins de recherche.

MISE À JOUR: Depuis la version 4.5 ou si Solr prend en charge les documents imbriqués directement: https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-BlockJoinQueryParsers

+0

Merci Mauricio. Les options # 1 et # 2 ne sont pas vraiment utiles car il devient alors impossible d'extraire des champs individuels, surtout s'il y en a plus de deux. Votre troisième suggestion peut simplement fonctionner, en utilisant des champs dynamiques. Quel mécanisme utiliser dans DataImportHandler pour générer ces champs dynamiques? – cambo

+0

@ user332523: il peut être impossible si vous êtes limité à utiliser DataImportHandler ... mais c'est très facile à faire si vous importez dans votre propre processus codé. –

+0

Salut Mauricio, merci pour la réponse. Voulez-vous dire simplement un importateur de données personnalisé qui utilise l'API Solr pour ajouter les documents à l'index? J'ai lu quelque chose dans les documents Solr DIH qui pourraient être en mesure de créer des champs dynamiques [http://wiki.apache.org/solr/DataImportHandler#TemplateTransformer] – cambo

7

Avoir un champs séparés pour les enfants conduit aux faux positifs. Les champs concaténés fonctionnent dans un sens mais c'est une approche vraiment limitée. Nous avons beaucoup d'expérience dans les tâches similaires blogué à http://blog.griddynamics.com/2011/06/solr-experience-search-parent-child.html

+3

wow. J'ai répondu à cela il y a presque deux ans. Maintenant, j'ai changé d'avis. La machine n ° 1 est décrite sur http://blog.mikemccandless.com/2012/01/searching-relational-content-with.html, elle est juste disponible pour Solr https://issues.apache.org/jira/browse/ SOLR-3076 sera publié à 4.5. et btw il est pris en charge par #ElasticSearch pour très longtemps – mkhludnev

19

Au Solr 4.7 et 4.8, Solr prend en charge les documents imbriqués:

{ 
"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" 
    } 
] 
} 

Voir la Solr release notes plus.

+1

Le lien est cassé. Pourriez-vous le mettre à jour? – elachell

+0

comment utiliser cette structure avec une botte de foin? –

Questions connexes