27.3. Rechercher dans l'index

27.3.1. Créer des requêtes

Il existe deux méthode pour rechercher dans l'index. La première utiliser Query Parser pour créer une requête à partir d'une chaîne de caractères La seconde fournit la possibilité de créer vos propres requêtes à travers l'API Zend_Search_Lucene.

Avant de choisir d'utiliser le Query Parser fournit, veuillez prendre en compte les points suivants :

  1. Si vous programmez la génération de la requête, et qu'ensuite vous la parsez avec le Query Parser, dans ce cas vous devriez utiliser la génération de requêtes avec l'API de requêtes. Autrement dit, le Query Parser est créé pour du texte "human-entered", pas pour du texte "program-generated".

  2. Untokenized fields are best added directly to queries, and not through the query parser. If a field's values are generated programmatically by the application, then so should query clauses for this field. Un analyseur utilisé par le Query Parser est créé pour convertir le texte "human-entered" en termes. Les valeurs générées par le programme, comme des dates, des mots-clés, etc, devraient être constamment générée par le programme.

  3. Dans la formulation d'une requête, les champs généralement texte devraient utiliser le Query Parser. Il est mieux d'ajouter tous les autres, comme les dates, les mots-clés, etc au traver de l'API que requête. Un champ avec un jeu de valeurs limites, qui peut-être défini via un menu déroulant, ne devrait pas être ajouté à la requête qui sera ensuite parsée, mais devrait plutôt être ajouté à la clause TermQuery.

Les deux méthodes utilisent la même API pour chercher dans l'index :

<?php

require_once('Zend/Search/Lucene.php');

$index = new Zend_Search_Lucene('/donnees/mon-index');

$index->find($query);

?>

La méthode Zend_Search_Lucene::find() détermine automatiquement le type en entrée et utilise le Query Parser pour construire l'objet Zend_Search_Lucene_Search_Query à partir d'une chaîne de caractères.

Il est important de noter que find() EST sensible à la casse. Par défaut, LuceneIndexCreation.jar normalise tous les document en minuscule. Ceci peut être désactivé avec une ligne de commande (saisissez LuceneIndexCreation.jar sans arguments pour de l'aide). La casse du texte fournit à find() doit correspondre à l'index. Si l'index est normalisé en minuscule, alors tous le texte fournit à find() doit être passé dans strtolower(), sinon il n'y aura peut-être aucune correspondance.

27.3.2. Résultats de recherche

Le résultat de recherche est un tableau d'objets Zend_Search_Lucene_Search_QueryHit. Chacun possède deux propriétés : $hit->document est le nombre de document dans l'index et $hit->score est un score du hit dans le résultat de recherche. Le résultat est trié par score (les meilleurs scores en premier).

L'objet Zend_Search_Lucene_Search_QueryHit expose aussi chaque champ de Zend_Search_Lucene_Document trouvé par le hit, comme une propriété de ce hit. Dans cet exempl, un hit est retourné et le document correspondant à deux champs : titre et auteur.

<?php

require_once('Zend/Search/Lucene.php');

$index = new Zend_Search_Lucene('/donnees/mon-index');

$hits = $index->find($query);

foreach ($hits as $hit) {
    echo $hit->id;
    echo $hit->score;

    echo $hit->titre;
    echo $hit->auteur;
}

?>

Optionnellement, l'objet Zend_Search_Lucene_Document orginial peut-être retourné à partir de Zend_Search_Lucene_Search_QueryHit. Vous pouvez retrouver les parties stockées du document en utilisant la méthode getDocument() de l'objet index, et ensuite les récupérer par la méthode getFieldValue() :

<?php

    require_once('Zend/Search/Lucene.php');
    
    $index = new Zend_Search_Lucene('/donnees/mon-index');
    
    $hits = $index->find($query);
    foreach ($hits as $hit) {

    // retourn l'objet Zend_Search_Lucene_Document pour ce hit
    echo $document = $hit->getDocument();

    // retourne un objet Zend_Search_Lucene_Field
    // à partir de Zend_Search_Lucene_Document
    echo $document->getField('title');

    // retourne la valeur de l'objet Zend_Search_Lucene_Field
    echo $document->getFieldValue('title');

    // identique à getFieldValue()
    echo $document->title;
}

?>

Les champs disponibles de l'objet Zend_Search_Lucene_Document sont déterminés au moment de l'indexation. Les champs de document sont soit indexés, soit indexés et stockés dans le document par l'application qui indexe (i.e LuceneIndexCreation.jar).

Faites attention, l'identité du document ('path' dans notre exemple) est aussi stocké dans les indexes et doit être retrouvé à partir d'eux.

27.3.3. Score de résultats

Zend_Search_Lucene utilise le même algorithme de scoring que Java Lucene. Les résultats de recherche sont triés par score, dans l'ordre décroissant.

Différents score signifie qu'un document correspond à la requête plus qu'un autre.

Pour être franc, les hits de recherche qui contiennent de termes de recherche ou des phrases plus fréquentes, obtiennent de plus grands scores.

Le score peut-être retrouvé par la propriété score du hit :

<?php
$hits = $index->find($query);

foreach ($hits as $hit) {
    echo $hit->id;
    echo $hit->score;
}

?>

La classe Zend_Search_Lucene_Search_Similarity est utilisée pour calculer le score. Pour plus de détails, lisez Extensibilité. Algorithme des score. Zend_Search_Lucene_Search_Similarity class is used to calculate score.