2017-01-31 2 views
0

Ich versuche herauszufinden, ob es eine performante Möglichkeit gibt, meine aktuellen Datenstrukturen zu durchsuchen, oder wenn ich sie neu strukturieren muss.Durchsuchen von verwandten Indizes auf Algolia

Ich habe die folgende Struktur für meinen Indizes:

  • Publikation (Attribute: id, title, keywords)
  • PublicationFile (Attribute: id, publication_id, text, page_number)

Eine Veröffentlichung hat viele Veröffentlichungsdateien, eine Veröffentlichungsdatei enthält den Inhalt der Datei und die Seite, für die sie bestimmt war nd in (text und page_number).

title, keywords und text sind die durchsuchbaren Attribute, wenn also jemand nach 'economy' sucht, möchte ich beide Indizes durchsuchen.

Ich möchte eine Suche durchzuführen, die beiden Indizes durchsucht und gibt die Ergebnisse in einer Weise, die mir so etwas zu tun erlaubt:

Publication1 keyword1 keyword2 Found results in Publication1's file contents in: [file a (pages: 1, 2, 3), file b (pages: 5)]

Deshalb möchte ich Art der Suche, was geschieht, um Ergebnisse zurückzugeben, die nach der ID einer Publikation gruppiert sind. Die einzige Möglichkeit, an die ich jetzt denken kann, besteht darin, beide Indizes zu durchsuchen und dann die Ergebnisse zu durchlaufen und die Übereinstimmungen zwischen Datei und Seite mit einer Veröffentlichung zu verknüpfen.

Zusammenfassend meine Fragen sind:

  1. Gibt es eine Weise, die ich meine Datenstruktur können die verschachtelten Schleifen zu vermeiden, sie zu verarbeiten?
  2. Gibt es eine Möglichkeit, dies durch Algolia zu tun, ohne meine Struktur ändern zu müssen? Ich würde im Idealfall wollen Algolia Frontend Suchcode und vermeiden Verarbeitung dieser Daten auf meinem Backend.

Antwort

2

Ihre Fragen beantworten:

1) Ja, ich werde unter

2) Nein leider nicht in weitere Einzelheiten erhalten, werden Sie Ihre Datenstruktur ändern müssen.


Hier ist, wie ich Ihnen empfehlen würde, Ihre Daten zu strukturieren, um zu erreichen, was Sie versuchen zu tun.

{ 
    objectID: "publicationFieIdId", 
    publicationId: '', 
    title: '', 
    keywords: ['', ''], 
    text: "", 
    page_number: 1, 
    published_at: 1485892992 // timestamp 
} 

Im Wesentlichen müssen Sie Ihre 2 Indizes zu einem einzigen reduzieren, um zu erreichen, was Sie versuchen zu tun. Die Änderung der Datenstruktur wird weniger Kopfschmerzen als die Beibehaltung des clientseitigen Codes nach sich ziehen. und auch besser.

Wenige Artikel oder Dokumentation Links, die nützlich sein könnten, zu erklären, warum:

https://blog.algolia.com/inside-the-engine-part-7-better-relevance-via-dedup-at-query-time/

https://www.algolia.com/doc/guides/search/distinct/

hoffe, das hilft!

Maxime

+0

Vielen Dank! das hilft wirklich, ich muss nur einen Weg finden, um die Daten jetzt unter 10 KB pro Datensatz zu halten. –

+0

Eigentlich würde ich noch einmal über mein Backend gehen müssen, um die Daten in der gleichen Struktur wie das Beispiel in meiner Frage zu verarbeiten, oder? Es scheint also keine Möglichkeit zu geben, diesen Teil zu vermeiden, aber wie würde ich dann die Daten paginieren, wenn ich sie verarbeite? Ich möchte, dass in meinen Suchergebnissen Publikationen angezeigt werden und die Dateinamen/Seitenzahlen, in denen die Ergebnisse gefunden wurden. Das Hauptelement des Ergebnisses ist die Veröffentlichung, wobei die Dateiübereinstimmungen als Unterelemente behandelt werden. –

+0

Ich habe nicht gefunden, um genau das zu bekommen, was ich wollte, aber das Deduplizieren mit der Datei-ID hat es mir ermöglicht, Treffer entweder als Publikation oder als Datei anzuzeigen. Ich habe sie auch in einen Index eingefügt, der dem von Ihnen verlinkten Blogpost ähnlich ist. Ich habe 'record_type' und' record_priority' verwendet, um die Ergebnisse so zu sortieren, dass sie für meinen Anwendungsfall sinnvoll sind. Ich habe nicht genau das bekommen, was ich von deiner Antwort benötigt habe (und wie du gesagt hast, es scheint noch nicht möglich zu sein), aber deine Antwort war der beste Kompromiss in meinem Fall. Danke vielmals. –

Verwandte Themen