2016-04-13 9 views
2

In meiner Instanz von Solr 4.10.3 Ich möchte JSONs mit einer verschachtelten Struktur indizieren.Wie können Sie ein vollständig verschachteltes Dokument in Solr abrufen?

Beispiel:

{ 
 
    "id": "myDoc", 
 
    "title": "myTitle" 
 
    "nestedDoc": { 
 
    "name": "test name" 
 
    "nestedAttribute": { 
 
     "attr1": "attr1Val" 
 
    } 
 
    } 
 
}

Ich bin in der Lage, es zu speichern, korrekt über das Admin-Interface:

/Solr/#/MYSCHEMA/Dokumente

und ich Außerdem kann ich das Dokument suchen und abrufen.

Das Problem, mit dem ich konfrontiert bin, ist, dass ich die verschachtelten Attribute nicht sehen kann, wenn ich das Antwortdokument von meiner Solr-Suche bekomme. Ich nur sehen:

{ 
 
    "id": "myDoc", 
 
    "title": "myTitle" 
 
}
Gibt es einen Weg, um ALLE verschachtelte Felder in den zurückgegebenen Dokumente enthalten?

Ich versuchte mit: "fl = [Kind elterFilter = title: myTitle]" aber es funktioniert nicht (ChildDocTransformerFactory von: https://cwiki.apache.org/confluence/display/solr/Transforming+Result+Documents). Ist das der richtige Weg oder gibt es einen anderen Weg?

Ich benutze: Solr 4.10.3 !!!!!!

+0

Alle lokalenParams sollten {} als ihre Syntax verwenden, nicht [], und sie gehen normalerweise in die query/fq-Abschnitte, nicht in die Feldliste. Ich bin nicht vertraut mit den Eltern/Kind-Beziehungen, also kann ich nicht sagen, ob das dein Problem ist. – MatsLindh

+0

@MatsLindh: Ich habe versucht, die ChildDocTransformerFactory zu verwenden: https://cwiki.apache.org/confluence/display/solr/Transforming+Result+Documents. Mit einfachen Abfragen kann ich nur die Elternstruktur (ohne die verschachtelten Kinder) sehen. Irgendwelche Ideen? – otrebla

Antwort

1

können Sie q setzen = und in fl Feld {Eltern, die =!}: "Fl = * [Kind parentFilter = Titel: myTitle]

Es wird Ihnen alle Eltern Feld und Kinder. Gebiet der Titel: mytitle

2

um alle die verschachtelte Struktur zurück zu erhalten, müssen Sie in der Tat ChildDocTransformerFactor verwenden, jedoch müssen Sie zuerst Ihre Dokumente richtig Index

Wenn Sie nur Ihre Struktur übergeben, wie es ist.. Solr wird inde x sie als separate Dokumente und nicht wissen, dass sie tatsächlich verbunden sind. Wenn Sie verschachtelte Dokumente korrekt abfragen möchten, müssen Sie Ihre Datenstruktur wie in this post beschrieben vorverarbeiten oder versuchen, eine Vorverarbeitung script zu verwenden. Leider gibt es, einschließlich der neuesten Solr 6.0, keine nette und reibungslose Lösung für die Indizierung und Rückgabe von verschachtelten Dokumentstrukturen, so dass alles durch "Workarounds" erledigt wird.

Besonders in Ihrem Fall, werden Sie Ihre Dokumentstruktur in diese Transformation müssen:

{ 
    "type": "parentDoc", 
    "id": "myDoc", 
    "title": "myTitle" 
    "_childDocuments_": [ 
    { 
    "type": "nestedDoc", 
    "name": "test name", 
    "_childDocuments_" :[ 
    { 
     "type": "nestedAttribute" 
     "attr1": "attr1Val" 
    }] 
    }]  
} 

Dann wird die folgende ChildDocTransformerFactor Abfrage finden Sie alle Subdokumente zurückkehren (btw, obwohl sie sagt, es seit Solr verfügbar ist 4,9 , ich habe es in Solr eigentlich nur 5,3 gesehen ... so dass Sie testen müssen):

q=title:myTitle&fl=*,[child parentFilter=type:parentDoc limit=50] 

Hinweis, obwohl es alle verschachtelten Dokumente zurückgibt, wird die zurückgegebene Dokumentstruktur sein werden abgeflacht (a las!), d.h., Sie erhalten:

{ 
    "type": "parentDoc", 
    "id": "myDoc", 
    "title": "myTitle" 
    "_childDocuments_": [ 
    { 
    "type": "nestedDoc", 
    "name": "test name" 
    }, 
    { 
     "type": "nestedAttribute" 
     "attr1": "attr1Val" 
    }]  
} 

Wahrscheinlich nicht wirklich das, was Sie erwartet haben, aber ... das ist das unglückliche Solr Verhalten ist, die in einer nächsten zukünftigen Version behoben werden.

+0

Gibt es Neuigkeiten zu einer Version, bei der das Ergebnis nicht abgeflacht ist? – DavidVdd

+0

@DavidVdd Da Solr 6 Graph-Strukturen eingeführt werden, scheint es, dass sie die BlockJoin-Fähigkeiten ersetzen werden. Mit anderen Worten, wenn das Abflachungsproblem gelöst ist/wird, wird es entlang der Graphenlinie und nicht entlang der BlockJoin Linie durchgeführt – alisa