12.4. Types de requêtes
Précédent | Chapitre 12. Zend_Search | Suivant

## 12.4. Types de requêtes

### 12.4.1. Recherche avec un seul terme

Le requêtes par terme permettent de chercher un simple terme.

Deux méthode de recherche peuvent être utilisés pour rechercher un terme.

Recherche avec une chaîne de caractères :

                $hits = $index->find('mot1');

ou

Construction de la requêtre avec l'API :

    <?php

        $term  = new Zend_Search_Lucene_Index_Term('mot1');
        $query = new Zend_Search_Lucene_Search_Query_Term($term);
        $hits  = $index->find($query);

    ?>

### 12.4.2. Recherche avec plusieurs termes

Les recherches multi termes permettent de rechercher suivant un jeu de terme donné.

Chaque terme peut-être définis comme requis, interdit, ou ni requis, ni interdit (optionnel).

- requis signifie que le document doit contenir ce terme.

- interdit signifie que le document ne doit pas contenir ce terme.

- neither, in which case matched documents are neither prohibited from nor required to match the term. However, a document must match at least 1 term to match the query.

Cela signifie que si des termes optionnels sont ajouté à la recherche avec les termes requis, alors il y aura les même résultats, mais la seconde requête aura des résultats qui corresponderont aux termes optionnels, qui seront placés en haut des résultats.

Deux méthodes de recherche peuvent être utilisées pour des recherche multi-termes.

Recherche par chaine de caractères :

    <?php

    $hits = $index->find('+mot1 auteur:mot2 -mot3');

    ?>

- '+' est utilisé pour définir un terme comme requis.
- '-' est utilisé pour définir un terme comme interdit.
- Le préfixe 'field:' est utilisé pour indiquer un champ du document lors de la recherche. Si ce n'est pas indiqué, alors le champs 'contents' est utilisé.

ou

Construction de recherche par l'API :

    <?php

        $query = new Zend_Search_Lucene_Search_Query_MultiTerm();

        $query->addTerm(new Zend_Search_Lucene_Index_Term('mot1'), true);
        $query->addTerm(new Zend_Search_Lucene_Index_Term('mot2'), null);
        $query->addTerm(new Zend_Search_Lucene_Index_Term('mot3'), false);

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

    ?>

Le tableau `$signs` contient des informations sur le type du terme :

- true est utilisé pour un terme définis comme requis.
- false est utilisé pour un terme définis comme interdit.
- null est utilisé pour définir un terme comme ni requis, ni interdit.

### 12.4.3. Requêtes de phrases

Les requêtes de phrases permettent de rechercher des phrases.

Les requêtes de phrases sont très flexible et permettent de chercher des phrases exactes, comme des morceau de phrases. Les phrases exactes peuvent aussi contennir des espaces ou des termes au même endroits. (Elles peuvent être générées par Analyser pour différentes utilisation. Ex. un term peut être duppliqué pour améliorer le poid du terme, ou plusieurs synonymes peuvent-être placé en première position). Conformément à cela, les requêtes de phrase peuvent être construitent exclusivement par l'API maintenant :

    <?php
    $query1 = new Zend_Search_Lucene_Search_Query_Phrase();

    // Ajoute 'mot1' en position relative 0
    $query1->addTerm(new Zend_Search_Lucene_Index_Term('mot1'));

    // Ajoute 'mot2' en position relative 1
    $query1->addTerm(new Zend_Search_Lucene_Index_Term('mot2'));

    // Ajoute 'mot3' en position relative 3
    $query1->addTerm(new Zend_Search_Lucene_Index_Term('mot3'), 3);

    ...

    $query2 = new Zend_Search_Lucene_Search_Query_Phrase(
                    array('mot1', 'mot2', 'mot3'), array(0,1,3));

    ...

    // Requête sans espaces.
    $query3 = new Zend_Search_Lucene_Search_Query_Phrase(
                    array('mot1', 'mot2', 'mot3'));

    ...

    $query4 = new Zend_Search_Lucene_Search_Query_Phrase(
                    array('mot1', 'mot2'), array(0,1), 'annotation');

    ?>

Les requêtes de phrases peuvent être construitent en une étape avec un constructeur de classe, ou alors étape par étape avec la méthode `Zend_Search_Lucene_Search_Query_Phrase::addTerm()`.

Le constructeur de classe Zend_Search_Lucene_Search_Query_Phrase prend trois paramètres optionnels :

    Zend_Search_Lucene_Search_Query_Phrase([array $terms[, array $offsets[, string $field]]]);

`$terms` est un tablea de chaîne qui contient un jeu de phrases. S'il est ommit ou vaut null, alors une requête vide sera construite.

`$offsets` est un tableau d'entiers qui contient l'offset des termes dans une phrase. S'il est ommit ou vaut null, alors les positions des termes seront `array(0, 1, 2, 3, ...)`.

`$field` est une chaîne qui indique les champs de document dans lequel on recherche. S'il est ommit ou vaut null, alors le champ par défaut sera utilisé pour la recherche. Cette version de Zend_Search_Lucene définit le champ 'contents' comme champ par défaut, mais il est prévu de changer ce comportement à "any field" dans les prochaines versions.

Ainsi:

    $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'));

va rechercher la phrase 'zend framework'.

    <$query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'download'), array(0, 2));

va rechercher la phrase 'zend ????? download' et récupérer 'zend platform download', 'zend studio download', 'zend core download', 'zend framework download' etc.

    $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'), null, 'title');

va rechercher la phrase 'zend framework' dans le champ 'title'.

La méthode `Zend_Search_Lucene_Search_Query_Phrase::addTerm()` prend deux arguments. L'objet requis `Zend_Search_Lucene_Index_Term` et une position optionnelle :

    Zend_Search_Lucene_Search_Query_Phrase::addTerm(Zend_Search_Lucene_Index_Term $term[, integer $position]);

`$term` décrit le prochain terme dans une phrase. Il doit indiquer le même champ que les précédents termes. Sinon une exception sera lancée.

`$position` indique la position du terme.

Ainsi:

    $query = new Zend_Search_Lucene_Search_Query_Phrase();
    $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'));
    $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'));

va rechercher la phrase 'zend framework'.

    $query = new Zend_Search_Lucene_Search_Query_Phrase();
    $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'), 0);
    $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'), 2);

va rechercher la phrase 'zend ????? download' et récupérer 'zend platform download', 'zend studio download', 'zend core download', 'zend framework download' etc.

    $query = new Zend_Search_Lucene_Search_Query_Phrase();
    $query->addTerm(new Zend_Search_Lucene_Index_Term('zend', 'title'));
    $query->addTerm(new Zend_Search_Lucene_Index_Term('framework', 'title'));

va rechercher la phrase 'zend framework' dans le champ 'title'.

Slop factor sets the number of other words permitted between words in query phrase. If zero, then this is an exact phrase search. For larger values this works like a WITHIN or NEAR operator.

The slop is in fact an edit-distance, where the units correspond to moves of terms in the query phrase out of position. For example, to switch the order of two words requires two moves (the first move places the words atop one another), so to permit re-orderings of phrases, the slop must be at least two.

More exact matches are scored higher than sloppier matches, thus search results are sorted by exactness. The slop is zero by default, requiring exact matches.

Slop factor can be assigned after query creation:

    <?php

    // requête sans espace
    $query = new Zend_Search_Lucene_Search_Query_Phrase(array('mot1', 'mot2'));

    // Recherche de 'mot1 mot2', 'mot1 ... mot2'
    $query->setSlop(1);
    $hits1 = $index->find($query);

    // Recherche for 'mot1 mot2', 'mot1 ... mot2',
    // 'mot1 ... ... mot2', 'mot2 mot1'
    $query->setSlop(2);
    $hits2 = $index->find($query);

    ?>

Précédent | Niveau supérieur | Suivant
12.3. Rechercher dans l'index | Sommaire | 12.5. Jeux de caractères.