Eine Erweiterung bietet eine einfache Volltext-Suche mit Ideen, die von Laravel/Scout und der Basis auf Teamtnt/TNTSearch-Wrapper für yii2 Active Record erhalten sind.
Erfordern Sie YII2 mit Composer durchsuchbar:
composer require vxm/yii2-searchable Fügen Sie schließlich das vxmsearchableSearchableTrait -Merkmal hinzu und fügen Sie vxmsearchableSearchableBehavior -Verhalten an den aktiven Datensatz bei, den Sie durchsuchbar machen möchten. Dies hilft, das Modell mit Indexdaten zu synchronisieren.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
}Obwohl Sie diese Erweiterung nicht ausschließlich verpflichtet haben, sollten Sie vor der Verwendung einer Erweiterung eine YII2-Queue konfigurieren. Durch das Ausführen eines Warteschlangenangestellten können Sie alle Vorgänge, die Ihre Modellinformationen mit Ihren Suchindizes synchronisieren, in die Warteschlange gestellt und für die Weboberfläche Ihrer Anwendung viel bessere Antwortzeiten bereitgestellt werden.
Sobald Sie eine Warteschlangenkomponente konfiguriert haben, setzen Sie den Wert der Warteschlangenoption in Ihrer Anwendungskonfigurationsdatei auf Komponenten -ID oder eine Array -Konfiguration davon.
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' queue ' => ' queueComponentId '
]
] Standardmäßig wird eine Komponente zu Ihren Anwendungskomponenten über Bootstrapping mit searchable ID hinzugefügt. Wenn Sie es konfigurieren müssen, können Sie manuelle Konfiguration in Ihrer Anwendungskonfigurationsdatei:
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' storagePath ' => ' @runtime/vxm/search ' ,
' queue ' => null , // an optional not required
' defaultSearchMode ' => vxm searchable Searchable:: FUZZY_SEARCH ,
' asYouType ' => false ,
' fuzziness ' => false ,
' fuzzyPrefixLength ' => 2 ,
' fuzzyMaxExpansions ' => 50 ,
' fuzzyMaxExpansions ' => 50 ,
' fuzzyDistance ' => 50
]
] Jedes aktive Datensatzmodell wird mit einem bestimmten index synchronisiert, der alle durchsuchbaren Datensätze für dieses Modell enthält. Mit anderen Worten, Sie können sich jeden Index wie eine MySQL -Tabelle vorstellen. Standardmäßig wird jedes Modell in einen Index bestehen, der dem typischen table des Modells entspricht. Typischerweise ist dies die Pluralform des Modellnamens; Sie können den index jedoch frei anpassen, indem Sie die statische Methode für den aktiven searchableIndex überschreiben:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get the index name for the model class.
*
* @return string
*/
public static function searchableIndex (): string
{
return ' articles_index ' ;
}
} Standardmäßig wird die gesamte toArray -Form eines bestimmten Modells in seinem Suchindex bestehen. Wenn Sie die Daten anpassen möchten, die mit dem Suchindex synchronisiert sind, können Sie die Methode toSearchableArray auf dem Modell überschreiben:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get the indexable data array for the model.
*
* @return array
*/
public function toSearchableArray (): array
{
$ array = $ this -> toArray ();
// Customize array...
return $ array ;
}
} Standardmäßig der primäre Schlüsselname des Modells als eindeutige ID im Suchindex. Wenn Sie dieses Verhalten anpassen müssen, können Sie die searchableKey statische Methode auf dem Modell überschreiben:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get searchable key by default primary key will be use.
*
* @return string key name.
*/
public static function searchableKey (): string
{
return ' id ' ;
}
}Wenn Sie eine Erweiterung in ein vorhandenes Projekt installieren, haben Sie möglicherweise bereits Datenbankdatensätze, die Sie in Ihren Suchtreiber importieren müssen. Diese Erweiterung enthält eine Importaktion, mit der Sie alle vorhandenen Datensätze in Ihre Suchindizes importieren können:
php yii searchable/import -- models ="app models Post " Sie können Multi -Modellklassen per Trennzeichen importieren ,
php yii searchable/import -- models ="app models Post , app models Category " Sobald Sie das vxmsearchableSearchableTrait hinzugefügt und das Verhalten vxmsearchableSearchableBehavior an ein Modell angehängt haben, müssen Sie nur eine Modellinstanz speichern und es wird automatisch Ihrem Suchindex hinzugefügt. Wenn Sie die Warteschlange konfiguriert haben, wird dieser Vorgang von Ihrem Warteschlangenarbeiter im Hintergrund ausgeführt:
$ post = new app models Post ;
// ...
$ post -> save (); Wenn Sie Ihrem Suchindex eine aktive Abfrageergebnisse hinzufügen möchten, können Sie ein aktive makeSearchable verwenden. Die makeSearchable Methode begleitet die Ergebnisse der Abfrage und fügt die Datensätze zu Ihrem Suchindex hinzu. Wenn Sie die Warteschlange konfiguriert haben, werden alle Brocken von Ihren Warteschlangenangestellten im Hintergrund hinzugefügt:
// Adding via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); Die makeSearchable Methode kann als upsert -Operation angesehen werden. Mit anderen Worten, wenn sich der Modelldatensatz bereits in Ihrem Index befindet, wird er aktualisiert. Wenn es im Suchindex nicht vorhanden ist, wird es dem Index hinzugefügt.
Um ein durchsuchbares Modell zu aktualisieren, müssen Sie nur die Eigenschaften der Modellinstanz aktualisieren und das Modell in Ihrer Datenbank speichern. Diese Erweiterung behält automatisch die Änderungen an Ihrem Suchindex fest:
$ post = app models Post:: findOne ( 1 );
// Update the post...
$ post -> save (); Sie können auch die makeSearchable Methode in einer aktiven Datensatzklasse verwenden, um die Instanz zu aktualisieren. Wenn die Modelle in Ihrem Suchindex nicht vorhanden sind, werden sie erstellt:
// Updating via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models );Um einen Datensatz aus Ihrem Index zu löschen, löschen Sie das Modell aus der Datenbank:
$ post = app models Post:: findOne ( 1 );
$ post -> delete (); Wenn Sie ein aktives Abfrageergebnis aus Ihrem Suchindex löschen möchten, können Sie die deleteSearchable -Methode für eine aktive Datensatzklasse verwenden:
// Deleting via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: deleteSearchable ( $ models ); Manchmal müssen Sie möglicherweise eine Menge aktiver Datensatzvorgänge auf einem Modell ausführen, ohne die Modelldaten mit Ihrem Suchindex zu synchronisieren. Sie können dies mit der Methode withoutSyncingToSearch tun. Diese Methode akzeptiert einen einzelnen Rückruf, der sofort ausgeführt wird. Jegliche Modellvorgänge, die innerhalb des Rückrufs auftreten, werden nicht mit dem Index des Modells synchronisiert:
app models Post:: withoutSyncingToSearch ( function () {
$ post = app models Post:: findOne ( 1 );
$ post -> save (); // will not syncing with index data
}); Manchmal müssen Sie möglicherweise nur ein Modell unter bestimmten Bedingungen durchsuchbar machen. Stellen Sie sich beispielsweise vor, Sie haben appmodelsArticle , das sich möglicherweise in einem von zwei Zuständen befindet: draft und published . Möglicherweise möchten Sie nur zulassen, dass published Beiträge durchsuchbar sind. Um dies zu erreichen, können Sie eine sollte eine shouldBeSearchable Methode in Ihrem Modell definieren:
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Determine if the model should be searchable.
*
* @return bool
*/
public static function shouldBeSearchable ()
{
return $ this -> is_published ;
}
} Die shouldBeSearchable Methode wird nur angewendet, wenn Modelle durch die Save -Methode manipuliert werden. Durch direktes Erstellen von Modellen mithilfe der searchable oder makeSearchable Methode das Ergebnis der shouldBeSearchable Methode:
// Will respect "shouldBeSearchable"...
$ post = app models Post:: findOne ( 1 );
$ post -> save ();
// Will override "shouldBeSearchable"...
$ post -> searchable ();
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); Sie können mit der Suche nach einem Modell mit der search beginnen. Die Suchmethode akzeptiert eine einzelne Zeichenfolge, mit der Ihre Modelle durchsucht werden. Diese Methode gibt eine ActiveQuery zurück. Sie können mehr Bedingung oder Beziehung wie eine Ursprungsabfrage hinzufügen.
Hinweis Wenn Sie mehr Abfragebedingung hinzufügen, dürfen Sie nicht verwendet werden,
wheredie Methode verwendet wirdandWherewo oderorWherestattdessen das Ergebnis der Such -IDs.
$ posts = app models Post:: search ( ' vxm ' )-> all ();
$ posts = app models Post:: search ( ' vxm ' )-> andWhere ([ ' author_id ' => 1 ])-> all ();
// not use
$ posts = app models Post:: search ( ' vxm ' )-> where ([ ' author_id ' => 1 ])-> all (); Sie können die Beziehungen zu Suchanfragen mit den Relations -Support -Unterstützung anschließen: searchable :
$ posts = app models Post:: search ( ' vxm ' )-> joinWith ( ' category ' )-> andWhere (Category:: search ( ' vxm category ' )); Sie können einen boolean oder fuzzy -Suchmodus als zweites Parameter auswählen, wenn Sie nicht feststellen können, dass defaultSearchMode der Searchable Komponente verwendet wird:
$ posts = app models Post:: search ( ' vxm ' , ' fuzzy ' , [ ' fuzziness ' => true ])-> all ();
$ posts = app models Post:: search ( ' vxm ' , ' boolean ' )-> all ();Weitere Details des Suchmodus finden Sie unter TeamTNT/TNTSearch, um das vollständige Dokument anzuzeigen.