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

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌original
2025-02-21 10:56:10463parcourir

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:

<code class="language-php">$query = $client->createSelect();
$query->setQuery('%P1%', [Input::get('q')]); // Using a placeholder for secure input</code>

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:

<code class="language-php">$resultset = $client->select($query);</code>

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

<code class="language-php">printf('Your search yielded %d results:', $resultset->getNumFound());</code>

itération à travers les résultats:

<code class="language-php">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>';
    }
}</code>

intégrer dans une application Laravel:

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

<code class="language-php">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');
}</code>

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

<code class="language-blade">@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</code>

Améliorer la recherche avec Dismax:

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

<code class="language-php">$dismax = $query->getDisMax();
$dismax->setQueryFields('title^3 cast^2 synopsis^1'); // Assign weights</code>

Cela priorise les correspondances dans le champ «Title».

Spécification des champs renvoyés:

Contrôlez les champs renvoyés en utilisant:

<code class="language-php">$query->clearFields()->addFields(['title', 'cast']); // Or $query->addFields('*') for all</code>

Résultats de tri:

Trier les résultats en utilisant:

<code class="language-php">$query->addSort('title', 'asc'); // Ascending order by title</code>

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»:

<code class="language-php">$facetSet = $query->getFacetSet();
$facetSet->createFacetField('rating')->setField('rating');</code>

Afficher le nombre de facettes:

<code class="language-php">$facet = $resultset->getFacetSet()->getFacet('rating');
foreach ($facet as $value => $count) {
    echo $value . ' [' . $count . ']<br>';
}</code>

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

<code class="language-php">$facet = $facetSet->createFacetRange('years')
    ->setField('year')
    ->setStart(1900)
    ->setGap(10)
    ->setEnd(2020);</code>

Filtrage avec des facettes:

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

<code class="language-php">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));
}</code>

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:
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