2017-05-06 6 views
3

Unsere App verwaltet Bücher im Besitz eines Benutzers mit einem Buch mit mehreren Dokumenten (PDFs, Word-Dokumente usw.). Die Startseite listet alle Bücher für einen Benutzer mit einer Schaltfläche zum Blättern auf, die die nächsten 10 Bücher lädt. Wenn ein Benutzer dann auf ein Buch klickt, wird es in einem neuen Bildschirm geöffnet und listet alle Dokumente für dieses Buch auf.Azure Suche Eltern und Kind Datensätze zurückgeben

Bis jetzt verwendeten wir WCF/entity framework, um alle auf der Homepage angezeigten Bücher abzurufen, dann azure search (verbunden mit einer sql-Ansicht), um die Dokumente für ein Buch zu erhalten, als es geöffnet wurde Paging und Sortieren.

Nun, obwohl wir auch die Liste aller Bücher für einen Benutzer aus azurblauen suchen wollen, so haben wir eine neue Tabelle erstellt, um die Buch-und Dokumentdaten zu halten, eine Zeile pro Dokument bedeutet den übergeordneten Buchnamen und Buch-ID wiederholt Für jede Reihe.

AzureSearchTable

Unsere azurSuchIndex zeigt nun auf dieser Tabelle, und ich muss herausfinden, wie die Bücher für einen Benutzer mit Paging abzurufen und gegebenenfalls auch zu sortieren. Das Problem ist, dass ich eine bestimmte Auswahl für die Bücher brauche, aber azurblaue Suche nicht eindeutig und ich weiß nicht, wie viele Dokumente ein Buch haben könnte, so kann ich den Top-Parameter nicht auf 10. Ein Buch könnte haben 30 oder 40 Dokumente, was bedeutet, dass die ersten 40 Zeilen zum Beispiel nur für ein Buch sein könnten.

Ich habe versucht, eine Facette auf die Buch-ID, die Art von funktioniert und gibt mir die ID und Anzahl der Dokumente für jedes Buch, aber ich kann nicht scheinen, eine Sortierreihenfolge für die Facette angeben - die Reihenfolge ist anders zu der Reihenfolge, die ich für die Abfrage (BookId) festgelegt habe. Ich weiß auch nicht, wie man alle Bücher mit einer Facette bekommt - ich kann eine Count-Eigenschaft auf der Facette setzen, aber ich weiß nicht, wie viele Bücher ein Benutzer haben wird.

Unser Architekt sagt, ich sollte alle Reihen (die Tausende sein könnten) bekommen und sie im C# Code filtern, um 10 Bücher zu erhalten. Das scheint mir aber ziemlich ineffizient zu sein und fühlt sich nicht richtig an.

Also ich bin nicht sicher, ob dies der richtige Ansatz ist ..

  • sollte ich getrennte azurSuchIndizes für Buch- und Belegdaten haben (die separate Tabellen verwenden?
  • wie kann ich die Rückkehr top n Bücher aus dieser Tabelle
  • kann ich eine Sortierreihenfolge für Facetten mit der C# SDK angeben? (Ich denke, dass es über die Rest API möglich ist)
  • Wie bekomme ich eine Facette um alle Bücher für einen Benutzer zurückzugeben?

Antwort

3

Hier sind ein paar Gedanken:

Kugel # 1 Antwort:

Wenn Ihre Absicht, eine Liste der Bücher zurückzukehren, basierend auf einer Suche nach Document der Lage sein, dann werden Sie wahrscheinlich wollen um sie im selben Index zu halten. Die Idee, die Ihr Architekt zum Umgang mit den Ergebnissen in C# hatte, ist vielleicht nicht so schlimm, wie Sie denken. Sie könnten eine GroupBy in LINQ machen. Die Azure Search-Abfrage ist schnell und LINQ-Abfragen ebenfalls. Insbesondere, wenn der Computer, der die Azure Search-Abfrage ausgibt, ein Azure-Web-/Anwendungsserver ist und sich in derselben Region befindet (Intra-Datencenter-Kommunikation). Ich habe diesen Ansatz auch mit der Suggestions-API für eine Auto-Vervollständigen-Funktion verwendet, die schnell Ergebnisse (innerhalb einiger hundert Millisekunden) zurückgeben muss, während der Benutzer tippt. Ich würde sagen, es ist zumindest einen Versuch wert, um zu sehen, welche Art von Leistung Sie mit Ihren maximalen und typischen Datensätzen erzielen.

Wenn dies jedoch nicht für Sie funktioniert, sollten Sie das Indexschema so umstrukturieren, dass DocumentName vom Typ Collection (Edm.String) ist. Sie würde in etwa so aussehen:

{ 
    id: 20663, 
    userId: 1, 
    bookId: 2144, 
    bookName: "ber", 
    documentName: ["asdasd", "_318-1991.jpg", "wallhaven-13081.png", etc...], 
    documentCount: 7 
} 

Nun, wenn Sie brauchen, damit der Benutzer detaillierte Informationen über die Dokumente eines bestimmten Buch bekommen, die sie wählen Sie können nur das tun, mit einem Datenbank-Aufruf, das Buch zu bekommen Einzelheiten. Alternativ dazu können Sie auch einen weiteren Azure-Suchindex für Dokumente mit detaillierteren Dokumentinformationen erstellen. Aber an dieser Stelle im Benutzer-Workflow, es sei denn, Sie werden eine weitere Volltextsuche in den Dokumenten dieses bestimmten Buchs anbieten, dann würden Sie wahrscheinlich nur bei einem DB-Anruf, der von einer bestimmten Stelle kommt, bleiben.

Kugel # 2 Antwort:

Für das Dokument zählen Sie ein anderes Feld nur erstellen können (wie oben dargestellt) und Art/Filter/Facette, dass auf.

Kugel # 3 Antwort:

Weder das SDK noch das Azure Search REST-API bietet eine Möglichkeit, die Facetten selbst zu bestellen, aber im Kopf zu behalten haben Sie letztlich die vollständige Kontrolle, wie Sie Facette Informationen angezeigt werden sollen in der Benutzeroberfläche. Wenn das SDK nicht das bietet, was Sie benötigen, können Sie in Ihrer App eine einfache Suchklasse erstellen, um Ihre Facetten nach Ihren Wünschen zu ordnen. Etwas wie folgt aus:

public class FacetDefinition 
{ 
    public string FacetName { get; set; } 
    public int FacetOrder { get; set; } 
} 

... 

var myFacetDefinitions = new List<FacetDefinition>(); 
myFacetDefinitions.Add(new FacetDefinition() { FacetName = "SomeNameThatMatchesTheFacetThatAzureSearchSendsBack", FacetOrder = 1}); 
myFacetDefinitions.Add(new FacetDefinition() { FacetName = "SomeOtherNameThatMatchesTheFacetThatAzureSearchSendsBack", FacetOrder = 2}); 
... 

Kugel # 4 Antwort:

alle Bücher zurückzukehren für einen bestimmten Benutzer können Sie nur einen Filterausdruck wie folgt hinzu:

userId eq <put_authenticated_userid_here> 

, dass unter der Annahme Der aktuell authentifizierte Benutzer sollte nur seine eigenen Bücher sehen können. Wenn Sie jedoch eine Liste von Benutzern in einer Facette haben möchten, die über einen oder mehrere von ihnen filtern, dann müsste das Indexschema neu strukturiert werden, um ein neues Feld im Buchdokument zu erhalten, das so ähnlich lautet "Benutzer" ist eine Sammlung (Edm.String) des Benutzernamens. Gefällt mir:

{ 
    ... 
    users: ["Luke Skywalker", "Han Solo", "Chewbacca", etc...] 
    ... 
} 
+0

Hallo @Matthew danke für das Update. Ich habe einen neuen Suchindex und eine neue Tabelle für Buchdaten mit einer Zeile pro Buch erstellt und die Dinge scheinen soweit in Ordnung zu sein. Ich las über den Collection (Edm.String) Typ für einen Index, aber es war nicht wirklich intuitiv, zumindest nicht für mich. Glauben Sie, dass es zwei Nachteile hat, zwei Suchindizes zu verwenden? –

+0

Es hängt davon ab, welche Attribute der Dokumente Sie suchen/filtern müssen. Müssen Sie in der Lage sein, nach DocumentName oder anderen Attributen des Dokuments zu suchen/zu filtern (wie der Inhalt des Dokuments oder etwas Ähnliches)? –

+0

Ja, es gibt eine Reihe weiterer Textfelder in unserer Dokumententabelle, wie z. B. Gerätename, Standortadresse, Stadt, Straße usw. Alle diese Felder können im Index (für Dokumente) durchsucht werden. Der neue Index für die neue Tabelle (für Bücher) wird nur verwendet, um den Namen und die ID jedes Buches und die Anzahl der Dokumente, die jedes Buch hat, zurückzugeben. –