Langage de requêtesJava 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. TermesUne 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). ChampsLucene 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
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 :
Multiple character wildcard searches look for 0 or more characters when matching strings against terms. For example, to search for test, tests or tester, you can use the search:
You can use "?", "*" or both at any place of the term:
Starting from ZF 1.7.7 wildcard patterns need some non-wildcard prefix. Default prefix length is 3 (like in Java Lucene).
So "*", "te?t", "*wr?t*" terms will cause an exception[1]
It can be altered using Term ModifiersLucene supports modifying query terms to provide a wide range of searching options. "~" modifier can be used to specify proximity search for phrases or fuzzy search for individual terms. Range SearchesRange queries allow the developer or user to match documents whose field(s) values are between the lower and upper bound specified by the range query. Range Queries can be inclusive or exclusive of the upper and lower bounds. Sorting is performed lexicographically.
Inclusive range queries are denoted by square brackets. Exclusive range queries are denoted by curly brackets. If field is not specified then Zend_Search_Lucene searches for specified interval through all fields by default.
Fuzzy SearchesZend_Search_Lucene as well as Java Lucene supports fuzzy searches based on the Levenshtein Distance, or Edit Distance algorithm. To do a fuzzy search use the tilde, "~", symbol at the end of a Single word Term. For example to search for a term similar in spelling to "roam" use the fuzzy search:
Matched terms limitationWildcard, range and fuzzy search queries may match too many terms. It may cause incredible search performance downgrade.
So Zend_Search_Lucene sets a limit of matching terms per query (subquery). This limit can be retrieved and set using
Default matched terms per query limit is 1024. Proximity SearchesLucene supports finding words from a phrase that are within a specified word distance in a string. To do a proximity search use the tilde, "~", symbol at the end of the phrase. For example to search for a "Zend" and "Framework" within 10 words of each other in a document use the search:
Boosting a TermJava 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
Opérateurs booléensLes 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 Zend_Search_Lucene. Les opérateurs AND, OR et NOT et "+", "-" définissent deux styles différents pour construire des requêtes booléennes. Contrairement à Java Lucene, Zend_Search_Lucene ne permet pas de mixer ces deux styles. 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. ANDL'opérateur AND signifie que tous les termes dans le "groupe AND" doivent correspondre à une partie du/des champs cherché(s). Pour chercher des documents qui contiennent "PHP framework" et "Zend Framework", utilisez la requête :
ORL'opérateur OR divise la requête en plusieurs termes optionnels. Pour chercher des documents qui contiennent "PHP framework" ou "Zend Framework", utilisez la requête :
NOTL'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. Pour chercher des documents qui contiennent "PHP framework", mais pas "Zend Framework", utilisez la requête :
Les opérateurs &&, ||, et !&&, ||, et ! peuvent être utilisés à la place de la notation AND, OR, et NOT. +L'opérateur "+" ou 'requis' stipule que le terme après le symbole "+" doit correspondre au document. Pour chercher des documents qui doivent contenir "Zend" et peuvent contenir "Framework", utilisez la requête :
-L'opérateur "-" ou 'interdit' exclut les documents qui correspondent au terme suivant le symbole "-". Pour chercher des documents qui contiennent "PHP framework" mais pas "Zend Framework", utilisez la requête :
Pas d'opérateurSi aucun opérateur n'est utilisé, le comportement de la recherche est définit par "l'opérateur booléen par défaut".
Il est défini à 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é. Pour chercher des documents qui doivent contenir "PHP framework" et peuvent contenir "Zend Framework", utilisez la requête :
L'opérateur booléen par défaut peut être défini ou récupéré avec les méthodes Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator) et Zend_Search_Lucene_Search_QueryParser::getDefaultOperator(), respectivement. Ces méthodes travaillent avec les constantes Zend_Search_Lucene_Search_QueryParser::B_AND et Zend_Search_Lucene_Search_QueryParser::B_OR. GroupementJava Lucene et Zend_Search_Lucene 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 :
Groupement de champsLucene supporte également l'usage des parenthèses pour grouper plusieurs clauses sur un simple champ. Pour chercher un titre (champ 'title') qui contient le mot "return" ET la phrase "pink panther", utilisez la requête :
Echappement des caractères spéciauxLucene 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 : + - && || ! ( ) { } [ ] ^ " ~ * ? : \ dans les termes simples, + et - sont automatiquement traités comme des caractères normaux. 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 :
[1]Please note, that it's not a , but a
. It's thrown during query rewrite (execution) operation.
|