| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 |
- <?xml version="1.0" encoding="utf-8"?>
- <!-- EN-Revision: 21829 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.search.lucene.query-language">
- <title>Langage de requêtes</title>
- <para>
- Java Lucene et <classname>Zend_Search_Lucene</classname> fournissent des langages de requêtes plutôt puissants.
- </para>
- <para>
- Ces langages sont pratiquement pareils, exceptées les quelques différences ci-dessous.
- </para>
- <para>
- La syntaxe complète du langage de requêtes Java Lucene peut être trouvée
- <ulink url="http://lucene.apache.org/java/2_3_0/queryparsersyntax.html">ici</ulink>.
- </para>
- <sect2 id="zend.search.lucene.query-language.terms">
- <title>Termes</title>
- <para>
- Une requête est décomposée en termes et opérateurs. Il y a 3 types de termes : le termes simples, les
- phrases et les sous-requêtes.
- </para>
- <para>
- Un terme simple est un simple mot, tel que "test" ou "hello".
- </para>
- <para>
- Une phrase est un groupe de mots inclus dans des double guillemets, tel que "hello dolly".
- </para>
- <para>
- Une sous-requête est une requête incluse dans des parenthèses, tel que "(hello dolly)".
- </para>
- <para>
- De multiples termes peuvent être combinés ensemble avec des opérateurs booléens pour former
- des requêtes complexes (voyez ci-dessous).
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.fields">
- <title>Champs</title>
- <para>
- Lucene supporte les champs de données. Lorsque vous effectuez une recherche, vous pouvez soit
- spécifier un champ, soit utiliser le champ par défaut. Le nom du champ dépend des données indexées
- et le champ par défaut est défini par les paramètres courants.
- </para>
- <para>
- La première différence et la plus significative avec Java Lucene est que par défaut les termes
- sont cherchés dans <emphasis>tous les champs</emphasis>.
- </para>
- <para>
- Il y a deux méthodes statiques dans la classe <classname>Zend_Search_Lucene</classname> qui
- permettent au développeur de configurer ces paramètres :
- </para>
- <programlisting language="php"><![CDATA[
- $defaultSearchField = Zend_Search_Lucene::getDefaultSearchField();
- ...
- Zend_Search_Lucene::setDefaultSearchField('contents');
- ]]></programlisting>
- <para>
- La valeur <constant>NULL</constant> indique que la recherche est effectuée dans tous les champs. C'est
- le paramétrage par défaut
- </para>
- <para>
- Vous pouvez chercher dans des champs spécifiques en tapant le nom du champ suivi de ":", suivi du terme
- que vous cherchez.
- </para>
- <para>
- Par exemple, prenons un index Lucene contenant deux champs -title et text- avec text comme champ par défaut.
- Si vous voulez trouver le document ayant pour titre "The Right Way" qui contient le text "don't go this way",
- vous pouvez entrer :
- </para>
- <programlisting language="querystring"><![CDATA[
- title:"The Right Way" AND text:go
- ]]></programlisting>
- <para>
- or
- </para>
- <programlisting language="querystring"><![CDATA[
- title:"Do it right" AND go
- ]]></programlisting>
- <para>
- "text" étant le champ par défaut, l'indicateur de champ n'est pas requis.
- </para>
- <para>
- Note: Le champ n'est valable que pour le terme, la phrase ou la sous-requête qu'il précède directement,
- ainsi la requête
- <programlisting language="querystring"><![CDATA[
- title:Do it right
- ]]></programlisting>
- ne trouvera que "Do" dans le champ 'title'. Elle trouvera "it" et "right" dans le champ par défaut (si le
- champ par défaut est défini) ou dans tous les champs indexés (si le champ par défaut est défini à <constant>NULL</constant>).
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.wildcard">
- <title>Jokers (Wildcards)</title>
- <para>
- Lucene supporte les recherches avec joker sur un ou plusieurs caractères au sein des termes simples (mais pas
- dans les phrases).
- </para>
- <para>
- Pour effectuez une recherche avec joker sur un seul caractère, utilisez le symbole "?".
- </para>
- <para>
- Pour effectuez une recherche avec joker sur plusieurs caractères, utilisez le symbole "*".
- </para>
- <para>
- La recherche avec un joker sur un seul caractère va faire correspondre le terme avec le "?" remplacé par n'importe quel autre caractère unique.
- Par exemple, pour trouver "text" ou "test" vous pouvez utiliser la recherche :
- <programlisting language="querystring"><![CDATA[
- te?t
- ]]></programlisting>
- </para>
- <para>
- La rechercher par joker sur plusieurs caractères recherche pour 0 ou plus caractères quand elle fait correspondre
- une chaîne avec les termes de recherche. Par exemple, pour trouver test, tests ou tester, on peut utiliser la recherche :
- <programlisting language="querystring"><![CDATA[
- test*
- ]]></programlisting>
- </para>
- <para>
- Vous pouvez utiliser "?", "*" ou les deux n'importe où dans un terme :
- <programlisting language="querystring"><![CDATA[
- *wr?t*
- ]]></programlisting>
- Cela va chercher "write", "wrote", "written", "rewrite", "rewrote", etc.
- </para>
- <para>
- Depuis la version 1.7.7 du ZF, les termes avec joker requierent un préfixe. La longueur
- par défaut du préfixe est de 3 (comme dans Java Lucene). Ainsi les termes "*", "te?t" ou "wr?t"
- causeront une exception<footnote>
- <para>Veuillez noter qu'il ne s'agit pas d'une <code>Zend_Search_Lucene_Search_QueryParserException</code>,
- mais d'une <code>Zend_Search_Lucene_Exception</code>. Elle est levée pendant l'opération de réécriture de la requête (exécution).</para></footnote>.
- </para>
- <para>
- Ce paramètre peut être modifié à l'aide des méthodes <code>Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()</code>
- et <code>Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength()</code>.
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.modifiers">
- <title>Modificateurs de termes</title>
- <para>
- Lucene supporte la modification des termes pour fournir un large panel d'options de recherche.
- </para>
- <para>
- Le modificateur "~" peut être utilisé pour spécifier des recherches de proximité dans les phrases ou
- des recherches floues pour les termes individuels.
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.range">
- <title>Recherche par intervalle</title>
- <para>
- Dans une requêtes par intervalle, le développeur ou l'utilisateur peut rechercher des documents dont la valeur du/des champ(s) se trouve entre
- la borne inférieur et la borne supérieur de l'intervalle. Les requêtes d'intervalle peuvent être inclusives ou exclusives pour les bornes supérieures ou inférieures.
- Le tri est effectué de manière lexicographique.
- <programlisting language="querystring"><![CDATA[
- mod_date:[20020101 TO 20030101]
- ]]></programlisting>
- Cela va trouver les documents dont la valeur du champ mod_date se trouve entre 20020101 et 20030101, bornes incluses.
- Notez que les requêtes d'intervalles ne sont pas réservées aux champs de date. Vous pouvez également les utiliser pour d'autres types de champ.
- <programlisting language="querystring"><![CDATA[
- title:{Aida TO Carmen}
- ]]></programlisting>
- Cela va trouver tous les documents dont le titre serait triés entre Aida et Carmen, sans inclure ni Aida, ni Carmen.
- </para>
- <para>
- Les requêtes d'intervalles inclusives utilisent des crochets. Les exclusives utilisent des accolades.
- </para>
- <para>
- Si aucun champ n'est spécifié, par défaut <classname>Zend_Search_Lucene</classname> cherchera l'intervalle spécifié dans tous les champs.
- <programlisting language="querystring"><![CDATA[
- {Aida TO Carmen}
- ]]></programlisting>
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.fuzzy">
- <title>Recherches floues</title>
- <para>
- <classname>Zend_Search_Lucene</classname> tout comme Java Lucene supporte les recherches floues basées sur les algorithmes "Levenshtein Distance" ou "Edit Distance".
- Pour effectuer une recherche floue, utilisez le symbole tilde "~" à la fin du mot pour un terme simple. Par exemple
- pour chercher un terme similaire à "roam", utilisez la recherche floue suivante :
- <programlisting language="querystring"><![CDATA[
- roam~
- ]]></programlisting>
- Cette recherche va trouver des termes tels que foam ou roams.
- Un paramètre additionnel (et optionnel) peut spécifier la similarité requise. La valeur doit se trouver
- entre 0 et 1. Avec une valeur proche de 1, seuls les termes très similaires vont correspondre. Par exemple :
- <programlisting language="querystring"><![CDATA[
- roam~0.8
- ]]></programlisting>
- Si le paramètre n'est pas fourni, la valeur par défaut est à 0.5.
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.matched-terms-limitations">
- <title>Limitation des termes correspondants</title>
- <para>
- Les recherches floues, par intervalle ou par joker peuvent correspondre à trop de termes. Cela peut
- causer d'énormes baisses de performances.
- </para>
- <para>
- Du coup, Zend_Search_Lucene définit une limite dans le nombre de correspondances par requêtes (ou sous-requêtes).
- Cette limite peut être récupérée et définie à l'aide des méthodes <code>Zend_Search_Lucene::getTermsPerQueryLimit()</code>/<code>Zend_Search_Lucene::setTermsPerQueryLimit($limit)</code>.
- </para>
- <para>
- La limite du nombre de correspondances par requête est de 1024.
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.proximity-search">
- <title>Recherches de proximité</title>
- <para>
- Lucene permet de trouver des mots dans une phrase qui se trouvent à une certaine distance les uns des autres dans une chaîne.
- Pour effectuer une recherche de proximité, utilisez le symbole tilde "~" à la fin de la phrase. Par exemple pour retrouver
- "Zend" et "Framework" avec 10 mots entre eux dans un document, utilisez la recherche :
- <programlisting language="querystring"><![CDATA[
- "Zend Framework"~10
- ]]></programlisting>
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.boosting">
- <title>Booster un terme</title>
- <para>
- Java Lucene et <classname>Zend_Search_Lucene</classname> fournissent le niveau de pertinence des documents
- basé sur les termes trouvés. Pour booster la pertinence d'un terme, utilisez le symbole circonflexe "^" avec
- un facteur de boost (un nombre) à la fin du terme que vous cherchez. Plus le facteur de boost est élevé, plus
- la pertinence du terme le sera.
- </para>
- <para>
- Le boostage vous permet de contrôler la pertinence d'un document en boostant les termes individuellement.
- Par exemple, si vous cherchez
- <programlisting language="querystring"><![CDATA[
- PHP framework
- ]]></programlisting>
- et que vous voulez que le terme "PHP" soit plus pertinent, boostez le en utilisant le symbole ^ et
- son facteur de boost juste après le terme. Vous pourriez écrire :
- <programlisting language="querystring"><![CDATA[
- PHP^4 framework
- ]]></programlisting>
- Cela fera en sorte que les documents possédant le terme PHP seront plus pertinents. Vous pouvez également
- booster des phrases ou des sous-requêtes, comme dans l'exemple ci-dessous :
- <programlisting language="querystring"><![CDATA[
- "PHP framework"^4 "Zend Framework"
- ]]></programlisting>
- Par défaut, le facteur de boost est 1. Bien que le facteur de boost doive être positif,
- il peut être inférieur à 1 (p. ex. 0.2).
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.boolean">
- <title>Opérateurs booléens</title>
- <para>
- Les opérateurs booléens permettent de combiner des termes avec des opérateurs logiques.
- Lucene supporte AND, "+", OR, NOT et "-" en tant qu'opérateurs booléens.
- Dans Java Lucene, les opérateurs booléens doivent être en MAJUSCULE. Ce n'est pas
- nécessaire dans <classname>Zend_Search_Lucene</classname>.
- </para>
- <para>
- Les opérateurs AND, OR et NOT et "+", "-" définissent deux styles différents pour
- construire des requêtes booléennes.
- Contrairement à Java Lucene, <classname>Zend_Search_Lucene</classname> ne permet pas
- de mixer ces deux styles.
- </para>
- <para>
- Si le style AND/OR/NOT est utilisé, un opérateur AND ou OR devra être présent entre
- chaque terme de requête.
- Chaque terme peut également être précédé de l'opérateur NOT. L'opérateur AND à la priorité sur
- l'opérateur OR. Cela diffère du comportement de Java Lucene.
- </para>
- <sect3 id="zend.search.lucene.query-language.boolean.and">
- <title>AND</title>
- <para>
- L'opérateur AND signifie que tous les termes dans le "groupe AND" doivent correspondre à
- une partie du/des champs cherché(s).
- </para>
- <para>
- Pour chercher des documents qui contiennent "PHP framework" et "Zend Framework", utilisez
- la requête :
- <programlisting language="querystring"><![CDATA[
- "PHP framework" AND "Zend Framework"
- ]]></programlisting>
- </para>
- </sect3>
- <sect3 id="zend.search.lucene.query-language.boolean.or">
- <title>OR</title>
- <para>
- L'opérateur OR divise la requête en plusieurs termes optionnels.
- </para>
- <para>
- Pour chercher des documents qui contiennent "PHP framework" ou "Zend Framework", utilisez
- la requête :
- <programlisting language="querystring"><![CDATA[
- "PHP framework" OR "Zend Framework"
- ]]></programlisting>
- </para>
- </sect3>
- <sect3 id="zend.search.lucene.query-language.boolean.not">
- <title>NOT</title>
- <para>
- L'opérateur NOT exclut les documents qui contiennent le terme situé après NOT. Mais un "groupe AND"
- qui contient uniquement des termes précédés de NOT ne retournera aucun résultat au lieu de retourner
- tous les documents indexés.
- </para>
- <para>
- Pour chercher des documents qui contiennent "PHP framework", mais pas "Zend Framework", utilisez
- la requête :
- <programlisting language="querystring"><![CDATA[
- "PHP framework" AND NOT "Zend Framework"
- ]]></programlisting>
- </para>
- </sect3>
- <sect3 id="zend.search.lucene.query-language.boolean.other-form">
- <title>Les opérateurs &&, ||, et !</title>
- <para>
- &&, ||, et ! peuvent être utilisés à la place de la notation AND, OR, et NOT.
- </para>
- </sect3>
- <sect3 id="zend.search.lucene.query-language.boolean.plus">
- <title>+</title>
- <para>
- L'opérateur "+" ou 'requis' stipule que le terme après le symbole "+" doit correspondre au document.
- </para>
- <para>
- Pour chercher des documents qui doivent contenir "Zend" et peuvent contenir "Framework", utilisez
- la requête :
- <programlisting language="querystring"><![CDATA[
- +Zend Framework
- ]]></programlisting>
- </para>
- </sect3>
- <sect3 id="zend.search.lucene.query-language.boolean.minus">
- <title>-</title>
- <para>
- L'opérateur "-" ou 'interdit' exclut les documents qui correspondent au terme suivant le symbole "-".
- </para>
- <para>
- Pour chercher des documents qui contiennent "PHP framework" mais pas "Zend Framework", utilisez
- la requête :
- <programlisting language="querystring"><![CDATA[
- "PHP framework" -"Zend Framework"
- ]]></programlisting>
- </para>
- </sect3>
- <sect3 id="zend.search.lucene.query-language.boolean.no-operator">
- <title>Pas d'opérateur</title>
- <para>
- Si aucun opérateur n'est utilisé, le comportement de la recherche est définit par "l'opérateur
- booléen par défaut".
- </para>
- <para>
- Il est défini à <code>OR</code> par défaut.
- </para>
- <para>
- Cela implique que chaque terme est optionnel par défaut. Il peut être présent ou pas dans le document, mais
- les documents avec le terme recevront un score plus élevé.
- </para>
- <para>
- Pour chercher des documents qui doivent contenir "PHP framework" et peuvent contenir "Zend Framework", utilisez
- la requête :
- <programlisting language="querystring"><![CDATA[
- +"PHP framework" "Zend Framework"
- ]]></programlisting>
- </para>
- <para>
- L'opérateur booléen par défaut peut être défini ou récupéré avec les méthodes
- <classname>Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator)</classname> et
- <classname>Zend_Search_Lucene_Search_QueryParser::getDefaultOperator()</classname>, respectivement.
- </para>
- <para>
- Ces méthodes travaillent avec les constantes
- <classname>Zend_Search_Lucene_Search_QueryParser::B_AND</classname> et
- <classname>Zend_Search_Lucene_Search_QueryParser::B_OR</classname>.
- </para>
- </sect3>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.grouping">
- <title>Groupement</title>
- <para>
- Java Lucene et <classname>Zend_Search_Lucene</classname> supportent l'usage de parenthèses pour grouper des clauses et former
- des sous-requêtes. Cela peut s'avérer utile si vous voulez contrôler la priorité des opérateurs logiques pour une requête
- ou bien mixer différents styles de requête :
- <programlisting language="querystring"><![CDATA[
- +(framework OR library) +php
- ]]></programlisting>
- <classname>Zend_Search_Lucene</classname> supporte l'imbrication de requêtes à n'importe quel niveau.
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.field-grouping">
- <title>Groupement de champs</title>
- <para>
- Lucene supporte également l'usage des parenthèses pour grouper plusieurs clauses sur un simple champ.
- </para>
- <para>
- Pour chercher un titre (champ 'title') qui contient le mot "return" ET la phrase "pink panther", utilisez la requête :
- <programlisting language="querystring"><![CDATA[
- title:(+return +"pink panther")
- ]]></programlisting>
- </para>
- </sect2>
- <sect2 id="zend.search.lucene.query-language.escaping">
- <title>Echappement des caractères spéciaux</title>
- <para>
- Lucene supporte l'échappement des caractères spéciaux qui sont utilisés dans la syntaxe
- de requête. La liste des caractères spéciaux est la suivante :
- </para>
- <para>
- + - && || ! ( ) { } [ ] ^ " ~ * ? : \
- </para>
- <para>
- dans les termes simples, + et - sont automatiquement traités comme des caractères normaux.
- </para>
- <para>
- Pour d'autres occurences de ces caractères, utilisez le \ avant chaque caractère spécial si vous
- voulez l'échapper. Par exemple, pour chercher (1+1):2, utilisez la requête :
- <programlisting language="querystring"><![CDATA[
- \(1\+1\)\:2
- ]]></programlisting>
- </para>
- </sect2>
- </sect1>
|