Laravel Scout fournit un moyen pratique d'intégrer la fonctionnalité de recherche dans votre application, mais lorsque vous utilisez Typesense, vous remarquerez peut-être que les facettes ne sont pas incluses dans la méthode de recherche par défaut.
Cet article montre comment ajouter correctement des filtres à facettes à vos recherches Typesense dans Laravel Scout.
Mise en œuvre de base
Voici une implémentation simplifiée qui montre comment ajouter des facettes à votre recherche Laravel Scout avec Typesense en utilisant le méthode brute:
public function index() { // Commencez par une requête de recherche de base $query = Product::search('my searchterm'); // Préparez les conditions de filtre $filterBy = []; // Par exemple, un prix supérieur à 100 ou votre propre filtre personnalisé $filterBy[] = 'price:>=100'; // Appliquez les options spécifiques à Typesense si vous le souhaitez $query->options([ 'query_by' => 'name', 'filter_by' => implode(' && ', $filterBy), 'facet_by' => 'brand,category,price', // Demandez ces facettes à Typesense, assurez-vous que ces facettes sont disponibles 'sort_by' => $request->input('sort_by', 'relevance:desc') ]); // Obtenir les résultats paginés $results = $query->paginate(24); // Ajouter le nombre de facettes aux résultats paginés $results->facetCounts = $this->getFacets($query); return $results; } /** * Obtenir les facettes à partir des résultats de recherche Typesense */ private function getFacets($query) { $raw = $query->raw(); return $raw['facet_counts'] ?? []; }Facultatif : reformater les facettes pour une utilisation plus facile
Vous pouvez également reformater les facettes pour les rendre plus faciles à utiliser dans votre application :
/** * Reformater les facettes Typesense pour une utilisation plus facile * * @param array $facets Le nombre de facettes brutes de Typesense * @return \Illuminate\Support\Collection */ private function reformatFacets(array $facets): \Illuminate\Support\Collection { $result = collect(); foreach ($facets as $facet) { $fieldName = $facet['field_name'] ?? null; if (!$fieldName) { continue; } $counts = collect($facet['counts'] ?? [])->map(function($item) { return [ 'value' => $item['value'], 'count' => $item['count'] ]; }); $result[$fieldName] = $counts; } renvoie $result; }Utiliser les facettes dans votre application
Pour utiliser les facettes reformatées, modifiez simplement la méthode de recherche précédente :
// Obtenir les résultats paginés $results = $query->paginate(24); // Obtenir le nombre de facettes brutes à partir de Typesense $facets = $query->raw()['facet_counts'] ?? []; // Ajouter des facettes reformatées aux résultats paginés $results->facetCounts = $this->reformatFacets($facets); return $results;Points clés à retenir
- Utilisez le
facet_byoption pour spécifier les champs pour lesquels vous souhaitez des facettes - Accédez aux données de facettes brutes à partir de la requête de recherche avec
$query->raw()['facet_counts'] - Envisagez de reformater les facettes pour les rendre plus faciles à utiliser dans votre application
- Attachez les facettes à vos résultats paginés afin qu'ils soient accessibles dans vos vues
En mettant en œuvre ces techniques, vous pouvez facilement ajouter de puissantes capacités de filtrage à facettes à votre application Laravel avec Typesense, permettant aux utilisateurs d'affiner leurs résultats de recherche selon divers critères.
Dernière mise à jour le 3 mars 2025
