Vor kurzem habe ich mich an den Einschränkungen der Dokumentindizierungs-Engines gewundert. Ich habe eine kleine Website entwickelt, die einige ziemlich robuste Suchfunktionen benötigt, aber aufgrund ihrer Hardwareeinschränkungen konnte ich keine Lucene-ähnliche Lösung (wie Solr oder ElasticSearch, wie ich es normalerweise tun würde) bereitstellen, um diesen Bedarf zu decken.
Und selbst dann, während ich einige komplexe Daten und Berechnungen bereitstellen musste, die datenbankintensiv waren, musste ich nicht mehr als 250.000 potenzielle Datensätze verarbeiten. Die Bereitstellung einer gesamten Solr- oder ES-Instanz, um dies zu handhaben, schien eine Verschwendung zu sein.
Nachdem ich darüber nachgedacht habe, scheint es ein ziemlich großes Problem zu sein. Die meisten Benutzer behandeln Suchanforderungen ausschließlich mit SQL. Sie führen nur SQL-Abfragen für ihre Daten aus und das war's. Ihre Suchfunktionen sind auch schrecklich.
Das Durchführen einer umfassenden Volltextsuche mit Platzhaltern kann auf einigen Systemen (insbesondere auf gemeinsam genutzten Hosts) schmerzhaft langsam sein und Ihre Datenbank blockieren, insbesondere wenn Sie komplizierte Abfragen und viele Verknüpfungen haben.
Am Ende führen Sie mehrere Abfragen auf eine einzige Anfrage des Benutzers aus. Sie können dies mit immer komplizierteren Abfragen umgehen, sehen Sie sich jedoch den vorherigen Punkt an.
Fehlende Funktionen, die normalerweise in Volltext-Engines vorhanden sind.
Datenbanken hatten das gleiche Problem, dass sie als Server bereitgestellt werden mussten, und dann kam SQLite und plötzlich konnten wir eine Datenbank bereitstellen, die in einer einzelnen Datei enthalten ist. Mein Googeln hat nichts hervorgebracht - fragen Sie sich, ob es so etwas für die Indizierung / Suche im Volltext gibt.
Welche Faktoren müssen berücksichtigt werden, wenn entschieden wird, ob eine einfache Dokumentindizierung implementiert werden soll (z. B. wie in den Antworten auf eine andere Frage erläutert ) oder SQL für diese Situationen weiterhin verwendet werden soll?
quelle
Antworten:
Weißt du, ich muss sagen, dass du Redis verwenden solltest.
Verwenden Sie die Idee des Kontexts . Es wäre schwierig, in die Tiefe zu gehen, ohne mehr über die Dokumente zu wissen. Oft können Sie viele Dinge aus den Überschriften von Dokumenten erkennen. Das Profilieren jedes Dokuments ist der erste grundlegende Schritt, genau wie das Crawlen im Internet.
Zählen Sie jedes Wortdokument in einem Wörterbuch mit Schlüsselwörtern. Verfolgen Sie die Beliebtheit jedes Wortes für das gesamte Projekt. Fügen Sie dem Iterator für diese Anzahl mehr Gewicht hinzu, wenn Sie zufällig eine hohe Relevanz in einem Dokument oder einer Gruppe feststellen können.
Das erste, was dies tut, ist, Ihnen eine umfassende Liste von Wörtern in Ihrem gesamten Satz zu geben. Alles, was NICHT in dieser Liste enthalten ist, automatische Rückgabe von 'keine Ergebnisse'. Ich würde vorschlagen, dass ein Ergebnisranking von weniger als den unteren 5 bis 20% der Popularität (wenn eine Suchabfrage im Index ausgeführt wird) auch einfach keine Ergebnisse sagt.
Wenn Sie es mit so etwas wie redis gehen, oder auch nur Ihre eigene Speicherstruktur machen Sie Dokumente mit Descriptor Dateien oder Mini-db - Datei und Seitenobjekte paaren können , die jeden spezifischen Dokument wieder beschreiben und her in den Speicher. Behalten Sie die allgemeinen Suchanfragen im Gedächtnis, indem Sie sie möglicherweise um Slots konkurrieren lassen oder ihnen eine Lebenszeit geben, die mit jeder Suche wächst.
Beginnen Sie mit dem Speichern von Referenzdaten, die einen Link / Ref / Zeiger / Index / was auch immer aus zwei oder mehr Dokumenten und einem Pool von Schlüsselwörtern oder Phrasen gruppieren. Grundsätzlich erhalten Sie eine aufgepumpte Tag-Cloud.
Führen Sie außerdem eine Phrasenerkennung durch, indem Sie nachverfolgen, wann auf ein Wort in Ihrem Wörterbuch eine genaue Zeichenfolge folgt oder vorangestellt ist, die üblicherweise in Dokumenten mit ähnlichen Metadaten / Titeln verwendet wird. Dies ist intensiv, erfordert jedoch nur einen Durchgang, um die Daten zu rendern.
Je mehr Möglichkeiten Sie haben, Ihre Daten zu trennen und die miteinander verbundenen Gruppen im tatsächlichen Gebrauch zu halten, desto besser.
Verbinden Sie die Wahrscheinlichkeit der Korrektheit, indem Sie jedes Mal nachverfolgen, wenn ein Benutzer auf ein Ergebnis klickt, das nicht zu den Top 3 gehört. Verbessern Sie die Erkennung von Phrasen, indem Sie Benutzersuchen beobachten, die keine perfekten Ergebnisse liefern. Erzwingen Sie, dass Ihre Abfragen relativ zu den Suchanfragen der Kunden werden.
Müssen Sie auf Dokumentaktualisierungen achten? Chronjobs / Shell-Skript oder geplante Aufgaben / Batch-Skript können helfen. Es gibt jedoch verschiedene Optionen für die Planung und Skripterstellung.
Abfallscheibe, Geschwindigkeit gewinnen, Komplexität verlieren. Speichern Sie mehrere Bäume Ihrer Dokumente und / oder Bäume mit Links zu den Dokumenten. Durchsuchen Sie nur die Bäume, für die Kriterien erfüllt wurden, oder bevorzugen Sie sie zumindest, um in den meisten Fällen ein schnelleres Ergebnis zu erzielen.
Erstellen Sie Ihre eigene leichte Permutations-Engine oder finden Sie eine, die eine schnelle Zeichenerkennung und keinen regulären Ausdruck verwendet. Oder machen Sie einfach eine mit Regex in ein paar Stunden, aber der Leistungsunterschied wird hier für ausreichende Suchvorgänge spürbar.
So viele Sachen.
Diese sind als mögliche Lösungen für die Implementierung einer robusten Indizierung und Suche von Dokumenten gedacht. Es ist nicht alles inklusive. Und dann ist es wahrscheinlich besser, sich eine Ersatzbox zu schnappen, ein neuronales Netz darauf zu werfen und ein paar Tage damit zu verbringen, ein schönes Webinterface für dieses neuronale Netz zu erstellen.
quelle