Maison > développement back-end > tutoriel php > Utilisation de Solarium avec Solr pour la recherche - implémentation

Utilisation de Solarium avec Solr pour la recherche - implémentation

尊渡假赌尊渡假赌尊渡假赌
Libérer: 2025-02-21 10:56:10
original
462 Les gens l'ont consulté

Using Solarium with SOLR for Search - Implementation

Il s'agit du troisième épisode d'une série en quatre parties démontrant l'intégration de Solarium avec Apache Solr pour l'implémentation de recherche. La première partie a couvert les concepts de base et la configuration, tandis que l'installation et la configuration détaillées de Solarium détaillé en tant qu'interface PHP à SOLR. Cet article se concentre sur la construction de la fonctionnalité de recherche elle-même.

Concepts clés:

Ce tutoriel couvre la création d'une recherche de base dans Laravel à l'aide du client Solarium. Nous explorerons une recherche améliorée à l'aide de Dismax, implémenter la recherche à facettes de résultats raffinés, gérer les champs dynamiques et la pagination et implémenter le filtrage pour une amélioration de l'interaction utilisateur.

Implémentation de base de la recherche:

Une recherche simple peut être implémentée comme suit:

$query = $client->createSelect();
$query->setQuery('%P1%', [Input::get('q')]); // Using a placeholder for secure input
Copier après la connexion

Input::get('q') récupère la requête de recherche à partir d'une variable Laravel Get ou Post (nommée 'q'). L'ensemble de placement %P1% échappe à la phrase de recherche.

Exécution de la recherche:

$resultset = $client->select($query);
Copier après la connexion

Récupérer le nombre de résultats:

printf('Your search yielded %d results:', $resultset->getNumFound());
Copier après la connexion

itération à travers les résultats:

foreach ($resultset as $document) {
    // Access fields as public properties (e.g., $document->title) or iterate:
    foreach ($document as $field => $value) {
        if (is_array($value)) $value = implode(', ', $value); // Handle multi-value fields
        print '<strong>' . $field . '</strong>: ' . $value . '<br>';
    }
}
Copier après la connexion

intégrer dans une application Laravel:

Pour une demande de get, la méthode getIndex dans le contrôleur d'origine pourrait être:

public function getIndex()
{
    if (Input::has('q')) {
        $query = $this->client->createSelect();
        $query->setQuery('%P1%', [Input::get('q')]);
        $resultset = $this->client->select($query);
        return View::make('home.index', ['q' => Input::get('q'), 'resultset' => $resultset]);
    }
    return View::make('home.index');
}
Copier après la connexion

La vue correspondante (app/views/home/index.blade.php) afficherait les résultats:

@if (isset($resultset))
<p>Your search yielded <strong>{{ $resultset->getNumFound() }}</strong> results:</p>
@foreach ($resultset as $document)
    <h3>{{ $document->title }}</h3>
    <dl>
        <dt>Year</dt><dd>{{ $document->year }}</dd>
        @if (is_array($document->cast))
            <dt>Cast</dt><dd>{{ implode(', ', $document->cast) }}</dd>
        @endif
    </dl>
    {{ $document->synopsis }}
@endforeach
@endif
Copier après la connexion

Améliorer la recherche avec Dismax:

pour rechercher sur plusieurs champs (par exemple, «titre», «cast», «synopsis»), utilisez Dismmax:

$dismax = $query->getDisMax();
$dismax->setQueryFields('title^3 cast^2 synopsis^1'); // Assign weights
Copier après la connexion

Cela priorise les correspondances dans le champ «Title».

Spécification des champs renvoyés:

Contrôlez les champs renvoyés en utilisant:

$query->clearFields()->addFields(['title', 'cast']); // Or $query->addFields('*') for all
Copier après la connexion

Résultats de tri:

Trier les résultats en utilisant:

$query->addSort('title', 'asc'); // Ascending order by title
Copier après la connexion

Pagination:

Implémentez la pagination en utilisant $query->setStart(0); et $query->setRows(20);.

Recherche à facettes:

Les facettes permettent aux utilisateurs de filtrer les résultats. Pour créer une facette sur le champ de «note»:

$facetSet = $query->getFacetSet();
$facetSet->createFacetField('rating')->setField('rating');
Copier après la connexion

Afficher le nombre de facettes:

$facet = $resultset->getFacetSet()->getFacet('rating');
foreach ($facet as $value => $count) {
    echo $value . ' [' . $count . ']<br>';
}
Copier après la connexion

Facettes de portée (par exemple, par décennie):

$facet = $facetSet->createFacetRange('years')
    ->setField('year')
    ->setStart(1900)
    ->setGap(10)
    ->setEnd(2020);
Copier après la connexion

Filtrage avec des facettes:

Ajouter un filtrage basé sur les sélections de facettes:

if (Input::has('rating')) {
    $query->createFilterQuery('rating')->setQuery('rating:%T1%', [Input::get('rating')]);
}
if (Input::has('decade')) {
    $query->createFilterQuery('years')->setQuery($helper->rangeQuery('year', Input::get('decade'), Input::get('decade') + 9));
}
Copier après la connexion

La vue doit être mise à jour pour inclure des liens de filtrage en fonction de ces facettes. Cela nécessite de générer des URL avec des paramètres de requête appropriés en utilisant http_build_query. (Code de vue détaillé omis pour la concision mais suit les principes décrits dans le texte d'origine).

Cette explication améliorée fournit une procédure pas à pas plus structurée et détaillée de l'intégration du solarium et du solr dans une application Laravel. N'oubliez pas d'adapter le code à votre modèle de données spécifique et à votre structure d'application.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal