2011-04-07 11 views
20

¿Es de alguna manera posible crear un documento de solr que contenga subelementos?Solr documentos con elementos secundarios?

Por ejemplo, ¿cómo iba a representar algo como esto:

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

¿Cuál es la forma habitual de resolver este problema?

Respuesta

13

Puede modelar esto de diferentes maneras, según sus necesidades de búsqueda/facetado. Por lo general, usará campos multivalorados o dinámicos. En los siguientes ejemplos I a omitir el tipo de campo, banderas indexados y almacenados:

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

Es hasta usted para correlacionar los niños primeros nombres y apellidos. O simplemente puede poner tanto en un solo campo:

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

Otra:

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

Aquí en que almacena los campos de los child_first_1 ', 'child_last_1', 'child_first_2', 'child_last_2', etc. De nuevo depende de usted correlacionar valores, pero al menos tiene un índice. Con algún código, puedes hacer que esto sea transparente.

En pocas palabras: como dice Solr wiki: "Solr proporciona una tabla. Almacenar tablas de bases de datos en un índice generalmente requiere desnormalizar algunas de las tablas. Por lo general, los intentos de evitar la desnormalización fallan". Depende de usted la desnormalización de sus datos de acuerdo con sus necesidades de búsqueda.

ACTUALIZACIÓN: Desde la versión 4.5 o menos Solr apoya directamente documentos anidados: https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-BlockJoinQueryParsers

+0

Gracias Mauricio. Las opciones n. ° 1 y n. ° 2 no son realmente útiles ya que resulta imposible extraer campos individuales, especialmente si hay más de dos. Su tercera sugerencia puede funcionar, usando campos dinámicos. ¿Qué mecanismo en el DataImportHandler usaría para generar estos campos dinámicos? – cambo

+0

@ user332523: puede ser imposible si está restringido a usar DataImportHandler ... pero es muy fácil de hacer si importa en su propio proceso codificado. –

+0

Hola Mauricio, gracias por la respuesta. ¿Solo se refiere a un importador de datos personalizado que usa la API Solr para agregar los documentos al índice? Leí sobre algo en los documentos Solr DIH que podrían crear campos dinámicos [http://wiki.apache.org/solr/DataImportHandler#TemplateTransformer] – cambo

7

que tienen una campos separados para los niños conduce a falsos positivos partidos. Los campos concatenados funcionan en cierto sentido, pero su enfoque es realmente limitado. Tenemos mucha experiencia en las tareas similares en blogs en http://blog.griddynamics.com/2011/06/solr-experience-search-parent-child.html

+3

wow. Respondí esto hace casi dos años. Ahora cambié de opinión. La maquinaria n.º 1 se describe en http://blog.mikemccandless.com/2012/01/searching-relational-content-with.html y está disponible para Solr https://issues.apache.org/jira/browse/ SOLR-3076 se lanzará en 4.5. y por cierto es compatible con #ElasticSearch durante mucho tiempo – mkhludnev

19

A partir de Solr 4.7 y 4.8, Solr soporta documentos anidados:

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

Véase el Solr release notes por más.

+1

El enlace está roto. ¿Podrías actualizarlo? – elachell

+0

cómo usar esta estructura con pajar? –

Cuestiones relacionadas