Langage de requêtes
Java Lucene et Zend_Search_Lucene fournissent des langages de requêtes plutôt puissants.
Ces langages sont pratiquement pareils, exceptées les quelques différences ci-dessous.
La syntaxe complète du langage de requêtes Java Lucene peut être trouvée
ici.
Termes
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.
Un terme simple est un simple mot, tel que "test" ou "hello".
Une phrase est un groupe de mots inclus dans des double guillemets, tel que "hello dolly".
Une sous-requête est une requête incluse dans des parenthèses, tel que "(hello dolly)".
De multiples termes peuvent être combinés ensemble avec des opérateurs booléens pour former
des requêtes complexes (voyez ci-dessous).
Champs
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.
La première différence et la plus significative avec Java Lucene est que par défaut les termes
sont cherchés dans tous les champs.
Il y a deux méthodes statiques dans la classe Zend_Search_Lucene qui
permettent au développeur de configurer ces paramètres :
La valeur NULL indique que la recherche est effectuée dans tous les champs. C'est
le paramétrage par défaut
Vous pouvez chercher dans des champs spécifiques en tapant le nom du champ suivi de ":", suivi du terme
que vous cherchez.
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 :
or
"text" étant le champ par défaut, l'indicateur de champ n'est pas requis.
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
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 à NULL).
Jokers (Wildcards)
Lucene supporte les recherches avec joker sur un ou plusieurs caractères au sein des termes simples (mais pas
dans les phrases).
Pour effectuez une recherche avec joker sur un seul caractère, utilisez le symbole "?".
Pour effectuez une recherche avec joker sur plusieurs caractères, utilisez le symbole "*".
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 :
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 :
Vous pouvez utiliser "?", "*" ou les deux n'importe où dans un terme :
Cela va chercher "write", "wrote", "written", "rewrite", "rewrote", etc.
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
Veuillez noter qu'il ne s'agit pas d'une Zend_Search_Lucene_Search_QueryParserException,
mais d'une Zend_Search_Lucene_Exception. Elle est levée pendant l'opération de réécriture de la requête (exécution)..
Ce paramètre peut être modifié à l'aide des méthodes Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()
et Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength().
Modificateurs de termes
Lucene supporte la modification des termes pour fournir un large panel d'options de recherche.
Le modificateur "~" peut être utilisé pour spécifier des recherches de proximité dans les phrases ou
des recherches floues pour les termes individuels.
Recherche par intervalle
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.
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.
Cela va trouver tous les documents dont le titre serait triés entre Aida et Carmen, sans inclure ni Aida, ni Carmen.
Les requêtes d'intervalles inclusives utilisent des crochets. Les exclusives utilisent des accolades.
Si aucun champ n'est spécifié, par défaut Zend_Search_Lucene cherchera l'intervalle spécifié dans tous les champs.
Recherches floues
Zend_Search_Lucene 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 :
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 :
Si le paramètre n'est pas fourni, la valeur par défaut est à 0.5.
Limitation des termes correspondants
Les recherches floues, par intervalle ou par joker peuvent correspondre à trop de termes. Cela peut
causer d'énormes baisses de performances.
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 Zend_Search_Lucene::getTermsPerQueryLimit()/Zend_Search_Lucene::setTermsPerQueryLimit($limit).
La limite du nombre de correspondances par requête est de 1024.
Recherches de proximité
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 :
Booster un terme
Java Lucene et Zend_Search_Lucene 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.
Le boostage vous permet de contrôler la pertinence d'un document en boostant les termes individuellement.
Par exemple, si vous cherchez
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 :
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 :
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).
Boolean Operators
Boolean operators allow terms to be combined through logic operators.
Lucene supports AND, "+", OR, NOT and "-" as Boolean operators.
Java Lucene requires boolean operators to be ALL CAPS. Zend_Search_Lucene does not.
AND, OR, and NOT operators and "+", "-" defines two different styles to construct boolean queries.
Unlike Java Lucene, Zend_Search_Lucene doesn't allow these two styles to be mixed.
If the AND/OR/NOT style is used, then an AND or OR operator must be present between all query terms.
Each term may also be preceded by NOT operator. The AND operator has higher precedence than the OR operator.
This differs from Java Lucene behavior.
AND
The AND operator means that all terms in the "AND group" must match some part of the searched field(s).
To search for documents that contain "PHP framework" and "Zend Framework" use the query:
OR
The OR operator divides the query into several optional terms.
To search for documents that contain "PHP framework" or "Zend Framework" use the query:
NOT
The NOT operator excludes documents that contain the term after NOT. But an "AND group" which contains
only terms with the NOT operator gives an empty result set instead of a full set of indexed documents.
To search for documents that contain "PHP framework" but not "Zend Framework" use the query:
&&, ||, and ! operators
&&, ||, and ! may be used instead of AND, OR, and NOT notation.
+
The "+" or required operator stipulates that the term after the "+" symbol must match the document.
To search for documents that must contain "Zend" and may contain "Framework" use the query:
-
The "-" or prohibit operator excludes documents that match the term after the "-" symbol.
To search for documents that contain "PHP framework" but not "Zend Framework" use the query:
No Operator
If no operator is used, then the search behavior is defined by the "default boolean operator".
This is set to OR by default.
That implies each term is optional by default. It may or may not be present within document, but documents with this term
will receive a higher score.
To search for documents that requires "PHP framework" and may contain "Zend Framework" use the query:
The default boolean operator may be set or retrieved with the
Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator) and
Zend_Search_Lucene_Search_QueryParser::getDefaultOperator() methods, respectively.
These methods operate with the
Zend_Search_Lucene_Search_QueryParser::B_AND and
Zend_Search_Lucene_Search_QueryParser::B_OR constants.
Grouping
Java Lucene and Zend_Search_Lucene support using parentheses to group clauses to form sub queries. This can be
useful if you want to control the precedence of boolean logic operators for a query or mix different boolean query styles:
Zend_Search_Lucene supports subqueries nested to any level.
Field Grouping
Lucene also supports using parentheses to group multiple clauses to a single field.
To search for a title that contains both the word "return" and the phrase "pink panther" use the query:
Escaping Special Characters
Lucene supports escaping special characters that are used in query syntax. The current list of special
characters is:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
+ and - inside single terms are automatically treated as common characters.
For other instances of these characters use the \ before each special character you'd like to escape. For example to search for (1+1):2 use the query: