Implementierung einer benutzerfreundlichen Suchmaschine in Doktrinentitäten.
Für die grundlegende Verwendung müssen Sie lediglich eine Karte der durchsuchten Entitäten und deren Eigenschaften definieren. Die Suchmaschine veranlasst, dass sie korrekt geladen werden und die Suchergebnisse automatisch auf der Grundlage der gefundenen Kandidaten sortiert.
Der Zweck des Pakets ist es, eine einfache API für die fortschrittliche Volltext-Suche in Doktrinentitäten bereitzustellen. Zu Beginn einer Anfrage wird ein Suchschema erstellt, und dieses Paket stellt automatisch sicher, dass die besten Ergebnisse auf der Grundlage der Relevanz gefunden und zurückgegeben werden.
So installieren Sie den Paket -Call -Komponisten manuell und führen Sie den folgenden Befehl aus:
$ composer require baraja-core/doctrine-fulltext-search Registrieren Sie dann DoctrineFulltextSearchExtension in der Konfiguration Neon:
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension oder Sie können eine Instanz von BarajaSearchSearch manuell erstellen.
Die Suche wird durch Erstellen einer Abfrage (Mapping -Entitäten und Spalten) durchgeführt:
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer Oder Sie können SelectorBuilder mit vollständigen strengen Typvalidierungen und Hinweismethoden zum Erstellen der Abfrage verwenden:
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;Es besteht keine Notwendigkeit, der Ausgabe zu entkommen, die gesamte Logik wird vom Motor automatisch gelöst.
:username - Die Spalte wird als Bildunterschrift verwendet
!slug - Die Spalte wird zum Suchen verwendet, aber in Perex -Ausgabe ignoriert.
_durationTime - Die Spalte wird in die Entität geladen, wird jedoch bei der Berechnung der Relevanz nicht berücksichtigt und wird nicht in das Perex aufgenommen.
content.versions.haystack - Eine Beziehung zwischen Entitäten erstellt automatisch einen Join und lädt die letzte Eigenschaft.
versions(content) - Benutzerdefinierte Getter (automatisch der Version versions , aber rufen Sie getContent() auf, um die Daten zu erhalten).
Wenn wir am Anfang des Spaltennamens einen Dickdarm verwenden (zum Beispiel ':username' ), wird er automatisch als Titel verwendet.
Der Titel wird auch dann angezeigt, wenn er die Suchwörter nicht enthält.
Die Bildunterschrift kann leer sein und kann nicht existieren (kann null sein).
Wenn der Titel nicht vorhanden ist, kann der Motor ihn automatisch gemäß dem besten Ereignis im gefundenen Text berechnen.
Die Suchabfrage wird automatisch normalisiert und die Stoppwörter werden entfernt, für die sie nicht für die Suche sinnvoll ist.
Der Algorithmus kann in einem bestimmten Projekt überschrieben werden, indem die IQueryNormalizer -Schnittstelle implementiert und im DIC -Container überschrieben wird.
Die Ausgabe der search() -Methode ist eine Entität des SearchResult -Typs, der die Iterator -Schnittstelle für die Fähigkeit implementiert, die Ergebnisse leicht zu durchlaufen.
TIPP: Wenn Sie nur die Suchergebnisse schnell drucken müssen und die Erscheinungsanforderungen nicht sehr hoch sind, implementiert die
SearchResult-Entität die Methode__toString()um die Ergebnisse direkt als HTML direkt zu rendern.
Das Suchergebnis fasst alle Ergebnisse aller Suchvorgänge in allen Entitäten zusammen. Alle Ergebnisse werden durch die getItems() -Methode erhalten - die Ausgabe ist ein Array von Entitäten des SearchItem[] -Typs.
Wir müssen jedoch häufig eine Abfrage in loser Schüttung zusammenstellen und dann auflisten, z. B. Kategorien und Produkte separat. Verwenden Sie dazu die Helfer -Methode getItemsOfType(string $type) , die ein verkürztes Array von Ergebnissen vom Typ SearchItem[] nur für Entitäten gemäß dem übergebenen Parameter zurückgibt.
Wir haben die Methode von getItems() oder getItemsOfType() verwendet, um die Suchergebnisse zu erhalten, die wir durchlaufen. Aber wie arbeite man mit einem bestimmten Ergebnis?
Es ist wichtig zu beachten, dass wir zu diesem Zeitpunkt die Methode __toString() nicht mehr zur Verfügung haben und das Ergebnis (idealerweise in einer Vorlage) selbst wiedergeben müssen.
In den meisten Fällen werden vorgefertigte Helfer ausreichen:
getTitle() gibt den Titel der gefundenen Entität als String oder Null zurück.getTitleHighlighted() ruft getTitle() intern auf, und wenn das Ergebnis eine gültige Zeichenfolge ist, färbt es die Vorkommen jedes Wortes mit <i class="highlight"> und </i> .getSnippet() gibt einen Ausschnitt der gefundenen Entität zurück, das den besten gefundenen Bereich in der ursprünglichen Entität zusammenfasst (z. B. ein Artikel -Snippet, in dem die Suchwörter auftreten). Weitere Ausschnitte können zurückgegeben werden (individuelle Vorkommen werden durch einen Dickdarm geteilt). Gibt immer eine Zeichenfolge zurück (kann leer sein).getTitleHighlighted() Innen Anrufe getSnippet() und färbt die Vorkommen jedes Wortes mit <i class="highlight"> und </i> .getScore() gibt die relative (unterschiedliche kontextbezogene Kontext nach der Suchabfrage und die verfügbaren Daten in jedem Projekt) zurück) Punktbewertung des Ergebnisses (gemäß diesem Parameter werden die Ergebnisse automatisch sortiert).getEntity() gibt die ursprüngliche gefundene Einheit zurück, die die Lehre intern produziert hat. Die Suche wird unter Verwendung einer Teilauswahl durchgeführt, sodass nicht alle Eigenschaften immer verfügbar sind.entityToArray() kehrt sich als Array zurück. Saiten werden automatisch normalisiert. Beide Methoden zum Erhalten von Ergebnissen ( getItems() und getItemsOfType() ) akzeptieren die Parameter $limit (Standard 10 ) und $offset (Standard 0 ).
Paging selbst wird am besten mit Nette -Pagination implementiert.
Die Gesamtzahl der Ergebnisse wird durch die Methode getCountResults() über der SearchResult -Entität erhalten.
Die Suchmaschine verwendet PARTIAL , um Datenbankentitäten zu laden und die resultierenden Entitäten in Suchergebnisse umzuwandeln, sodass Sie sie jederzeit durch Anruf ->getEntity() über einem bestimmten Suchergebnis laden können.
Wenn kein Ergebnis gefunden werden kann oder ihre Anzahl "klein" ist (die Definition wird durch den Algorithmus selbst gemäß der Analyse eines bestimmten Projekts bestimmt), kann (und möglicherweise nicht) ein Tipp für die beste Korrektur der Suchabfrage verfügbar sein (und möglicherweise nicht).
Um Hilfe zu erhalten, rufen Sie die Methode getDidYouMean() über SearchResult an. Die Ausgabe ist entweder Zeichenfolge (bessere Suchabfrage) oder NULL.
Die beste Suchabfragekorrektur wird von der Suchmaschine selbst auf der Grundlage der erweiterten Suchanalyse innerhalb jedes Projekts separat unter Verwendung maschineller Lernmethoden erhalten. Bei jeder Suche, Statistiken über die Suchabfrage, die Anzahl der Ergebnisse und andere Signale werden bei Bedarf automatisch gespeichert und nachträglich analysiert.
Hilfe zu bekommen ist natürlich und kann nicht leicht beeinflusst werden. Die Suchmaschine strebt nach maximaler Objektivität und bietet Benutzern Wörter, die nach anderen suchen und so viele relevante Ergebnisse wie möglich nach dem aktuellen Kontext zurückgeben. Intern werden komplexe mathematische Funktionen verwendet, die wir aufgrund der Erfahrung aller Projekte ständig verbessern.
Bei der Suche wird zuerst eine Liste von Kandidaten für die Suchergebnisse zusammengestellt. Diese Ergebnisse werden individuell einen Bewertungsalgorithmus übergeben, der eine automatische "relative" Bewertung im Bereich 0 - 512 durchführt (basierend auf verschiedenen Signalen wie der Suchabfrage, der jüngsten Benutzerverlauf, der Sprache, des physischen Standorts, des Entitätsinhalts und des Typs) (das Ergebnis ist immer int ).
Gemäß der Punktbewertung werden die Ergebnisse automatisch sortiert.
Der Bewertungsalgorithmus kann durch die Implementierung der IScoreCalculator -Schnittstelle überschrieben und im DIC -Container überschreiben.
baraja-core/doctrine-fulltext-search ist unter der MIT-Lizenz lizenziert. Weitere Informationen finden Sie in der Lizenzdatei.