Zend_Search_Lucene-QueryLanguage.xml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 21829 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.query-language">
  5. <title>Langage de requêtes</title>
  6. <para>
  7. Java Lucene et <classname>Zend_Search_Lucene</classname> fournissent des langages de requêtes plutôt puissants.
  8. </para>
  9. <para>
  10. Ces langages sont pratiquement pareils, exceptées les quelques différences ci-dessous.
  11. </para>
  12. <para>
  13. La syntaxe complète du langage de requêtes Java Lucene peut être trouvée
  14. <ulink url="http://lucene.apache.org/java/2_3_0/queryparsersyntax.html">ici</ulink>.
  15. </para>
  16. <sect2 id="zend.search.lucene.query-language.terms">
  17. <title>Termes</title>
  18. <para>
  19. Une requête est décomposée en termes et opérateurs. Il y a 3 types de termes : le termes simples, les
  20. phrases et les sous-requêtes.
  21. </para>
  22. <para>
  23. Un terme simple est un simple mot, tel que "test" ou "hello".
  24. </para>
  25. <para>
  26. Une phrase est un groupe de mots inclus dans des double guillemets, tel que "hello dolly".
  27. </para>
  28. <para>
  29. Une sous-requête est une requête incluse dans des parenthèses, tel que "(hello dolly)".
  30. </para>
  31. <para>
  32. De multiples termes peuvent être combinés ensemble avec des opérateurs booléens pour former
  33. des requêtes complexes (voyez ci-dessous).
  34. </para>
  35. </sect2>
  36. <sect2 id="zend.search.lucene.query-language.fields">
  37. <title>Champs</title>
  38. <para>
  39. Lucene supporte les champs de données. Lorsque vous effectuez une recherche, vous pouvez soit
  40. spécifier un champ, soit utiliser le champ par défaut. Le nom du champ dépend des données indexées
  41. et le champ par défaut est défini par les paramètres courants.
  42. </para>
  43. <para>
  44. La première différence et la plus significative avec Java Lucene est que par défaut les termes
  45. sont cherchés dans <emphasis>tous les champs</emphasis>.
  46. </para>
  47. <para>
  48. Il y a deux méthodes statiques dans la classe <classname>Zend_Search_Lucene</classname> qui
  49. permettent au développeur de configurer ces paramètres :
  50. </para>
  51. <programlisting language="php"><![CDATA[
  52. $defaultSearchField = Zend_Search_Lucene::getDefaultSearchField();
  53. ...
  54. Zend_Search_Lucene::setDefaultSearchField('contents');
  55. ]]></programlisting>
  56. <para>
  57. La valeur <constant>NULL</constant> indique que la recherche est effectuée dans tous les champs. C'est
  58. le paramétrage par défaut
  59. </para>
  60. <para>
  61. Vous pouvez chercher dans des champs spécifiques en tapant le nom du champ suivi de ":", suivi du terme
  62. que vous cherchez.
  63. </para>
  64. <para>
  65. Par exemple, prenons un index Lucene contenant deux champs -title et text- avec text comme champ par défaut.
  66. Si vous voulez trouver le document ayant pour titre "The Right Way" qui contient le text "don't go this way",
  67. vous pouvez entrer :
  68. </para>
  69. <programlisting language="querystring"><![CDATA[
  70. title:"The Right Way" AND text:go
  71. ]]></programlisting>
  72. <para>
  73. or
  74. </para>
  75. <programlisting language="querystring"><![CDATA[
  76. title:"Do it right" AND go
  77. ]]></programlisting>
  78. <para>
  79. "text" étant le champ par défaut, l'indicateur de champ n'est pas requis.
  80. </para>
  81. <para>
  82. Note: Le champ n'est valable que pour le terme, la phrase ou la sous-requête qu'il précède directement,
  83. ainsi la requête
  84. <programlisting language="querystring"><![CDATA[
  85. title:Do it right
  86. ]]></programlisting>
  87. ne trouvera que "Do" dans le champ 'title'. Elle trouvera "it" et "right" dans le champ par défaut (si le
  88. 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>).
  89. </para>
  90. </sect2>
  91. <sect2 id="zend.search.lucene.query-language.wildcard">
  92. <title>Jokers (Wildcards)</title>
  93. <para>
  94. Lucene supporte les recherches avec joker sur un ou plusieurs caractères au sein des termes simples (mais pas
  95. dans les phrases).
  96. </para>
  97. <para>
  98. Pour effectuez une recherche avec joker sur un seul caractère, utilisez le symbole "?".
  99. </para>
  100. <para>
  101. Pour effectuez une recherche avec joker sur plusieurs caractères, utilisez le symbole "*".
  102. </para>
  103. <para>
  104. 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.
  105. Par exemple, pour trouver "text" ou "test" vous pouvez utiliser la recherche :
  106. <programlisting language="querystring"><![CDATA[
  107. te?t
  108. ]]></programlisting>
  109. </para>
  110. <para>
  111. La rechercher par joker sur plusieurs caractères recherche pour 0 ou plus caractères quand elle fait correspondre
  112. une chaîne avec les termes de recherche. Par exemple, pour trouver test, tests ou tester, on peut utiliser la recherche :
  113. <programlisting language="querystring"><![CDATA[
  114. test*
  115. ]]></programlisting>
  116. </para>
  117. <para>
  118. Vous pouvez utiliser "?", "*" ou les deux n'importe où dans un terme :
  119. <programlisting language="querystring"><![CDATA[
  120. *wr?t*
  121. ]]></programlisting>
  122. Cela va chercher "write", "wrote", "written", "rewrite", "rewrote", etc.
  123. </para>
  124. <para>
  125. Depuis la version 1.7.7 du ZF, les termes avec joker requierent un préfixe. La longueur
  126. par défaut du préfixe est de 3 (comme dans Java Lucene). Ainsi les termes "*", "te?t" ou "wr?t"
  127. causeront une exception<footnote>
  128. <para>Veuillez noter qu'il ne s'agit pas d'une <code>Zend_Search_Lucene_Search_QueryParserException</code>,
  129. 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>.
  130. </para>
  131. <para>
  132. Ce paramètre peut être modifié à l'aide des méthodes <code>Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()</code>
  133. et <code>Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength()</code>.
  134. </para>
  135. </sect2>
  136. <sect2 id="zend.search.lucene.query-language.modifiers">
  137. <title>Modificateurs de termes</title>
  138. <para>
  139. Lucene supporte la modification des termes pour fournir un large panel d'options de recherche.
  140. </para>
  141. <para>
  142. Le modificateur "~" peut être utilisé pour spécifier des recherches de proximité dans les phrases ou
  143. des recherches floues pour les termes individuels.
  144. </para>
  145. </sect2>
  146. <sect2 id="zend.search.lucene.query-language.range">
  147. <title>Recherche par intervalle</title>
  148. <para>
  149. 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
  150. 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.
  151. Le tri est effectué de manière lexicographique.
  152. <programlisting language="querystring"><![CDATA[
  153. mod_date:[20020101 TO 20030101]
  154. ]]></programlisting>
  155. Cela va trouver les documents dont la valeur du champ mod_date se trouve entre 20020101 et 20030101, bornes incluses.
  156. 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.
  157. <programlisting language="querystring"><![CDATA[
  158. title:{Aida TO Carmen}
  159. ]]></programlisting>
  160. Cela va trouver tous les documents dont le titre serait triés entre Aida et Carmen, sans inclure ni Aida, ni Carmen.
  161. </para>
  162. <para>
  163. Les requêtes d'intervalles inclusives utilisent des crochets. Les exclusives utilisent des accolades.
  164. </para>
  165. <para>
  166. Si aucun champ n'est spécifié, par défaut <classname>Zend_Search_Lucene</classname> cherchera l'intervalle spécifié dans tous les champs.
  167. <programlisting language="querystring"><![CDATA[
  168. {Aida TO Carmen}
  169. ]]></programlisting>
  170. </para>
  171. </sect2>
  172. <sect2 id="zend.search.lucene.query-language.fuzzy">
  173. <title>Recherches floues</title>
  174. <para>
  175. <classname>Zend_Search_Lucene</classname> tout comme Java Lucene supporte les recherches floues basées sur les algorithmes "Levenshtein Distance" ou "Edit Distance".
  176. Pour effectuer une recherche floue, utilisez le symbole tilde "~" à la fin du mot pour un terme simple. Par exemple
  177. pour chercher un terme similaire à "roam", utilisez la recherche floue suivante :
  178. <programlisting language="querystring"><![CDATA[
  179. roam~
  180. ]]></programlisting>
  181. Cette recherche va trouver des termes tels que foam ou roams.
  182. Un paramètre additionnel (et optionnel) peut spécifier la similarité requise. La valeur doit se trouver
  183. entre 0 et 1. Avec une valeur proche de 1, seuls les termes très similaires vont correspondre. Par exemple :
  184. <programlisting language="querystring"><![CDATA[
  185. roam~0.8
  186. ]]></programlisting>
  187. Si le paramètre n'est pas fourni, la valeur par défaut est à 0.5.
  188. </para>
  189. </sect2>
  190. <sect2 id="zend.search.lucene.query-language.matched-terms-limitations">
  191. <title>Limitation des termes correspondants</title>
  192. <para>
  193. Les recherches floues, par intervalle ou par joker peuvent correspondre à trop de termes. Cela peut
  194. causer d'énormes baisses de performances.
  195. </para>
  196. <para>
  197. Du coup, Zend_Search_Lucene définit une limite dans le nombre de correspondances par requêtes (ou sous-requêtes).
  198. 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>.
  199. </para>
  200. <para>
  201. La limite du nombre de correspondances par requête est de 1024.
  202. </para>
  203. </sect2>
  204. <sect2 id="zend.search.lucene.query-language.proximity-search">
  205. <title>Recherches de proximité</title>
  206. <para>
  207. Lucene permet de trouver des mots dans une phrase qui se trouvent à une certaine distance les uns des autres dans une chaîne.
  208. Pour effectuer une recherche de proximité, utilisez le symbole tilde "~" à la fin de la phrase. Par exemple pour retrouver
  209. "Zend" et "Framework" avec 10 mots entre eux dans un document, utilisez la recherche :
  210. <programlisting language="querystring"><![CDATA[
  211. "Zend Framework"~10
  212. ]]></programlisting>
  213. </para>
  214. </sect2>
  215. <sect2 id="zend.search.lucene.query-language.boosting">
  216. <title>Booster un terme</title>
  217. <para>
  218. Java Lucene et <classname>Zend_Search_Lucene</classname> fournissent le niveau de pertinence des documents
  219. basé sur les termes trouvés. Pour booster la pertinence d'un terme, utilisez le symbole circonflexe "^" avec
  220. un facteur de boost (un nombre) à la fin du terme que vous cherchez. Plus le facteur de boost est élevé, plus
  221. la pertinence du terme le sera.
  222. </para>
  223. <para>
  224. Le boostage vous permet de contrôler la pertinence d'un document en boostant les termes individuellement.
  225. Par exemple, si vous cherchez
  226. <programlisting language="querystring"><![CDATA[
  227. PHP framework
  228. ]]></programlisting>
  229. et que vous voulez que le terme "PHP" soit plus pertinent, boostez le en utilisant le symbole ^ et
  230. son facteur de boost juste après le terme. Vous pourriez écrire :
  231. <programlisting language="querystring"><![CDATA[
  232. PHP^4 framework
  233. ]]></programlisting>
  234. Cela fera en sorte que les documents possédant le terme PHP seront plus pertinents. Vous pouvez également
  235. booster des phrases ou des sous-requêtes, comme dans l'exemple ci-dessous :
  236. <programlisting language="querystring"><![CDATA[
  237. "PHP framework"^4 "Zend Framework"
  238. ]]></programlisting>
  239. Par défaut, le facteur de boost est 1. Bien que le facteur de boost doive être positif,
  240. il peut être inférieur à 1 (p. ex. 0.2).
  241. </para>
  242. </sect2>
  243. <sect2 id="zend.search.lucene.query-language.boolean">
  244. <title>Opérateurs booléens</title>
  245. <para>
  246. Les opérateurs booléens permettent de combiner des termes avec des opérateurs logiques.
  247. Lucene supporte AND, "+", OR, NOT et "-" en tant qu'opérateurs booléens.
  248. Dans Java Lucene, les opérateurs booléens doivent être en MAJUSCULE. Ce n'est pas
  249. nécessaire dans <classname>Zend_Search_Lucene</classname>.
  250. </para>
  251. <para>
  252. Les opérateurs AND, OR et NOT et "+", "-" définissent deux styles différents pour
  253. construire des requêtes booléennes.
  254. Contrairement à Java Lucene, <classname>Zend_Search_Lucene</classname> ne permet pas
  255. de mixer ces deux styles.
  256. </para>
  257. <para>
  258. Si le style AND/OR/NOT est utilisé, un opérateur AND ou OR devra être présent entre
  259. chaque terme de requête.
  260. Chaque terme peut également être précédé de l'opérateur NOT. L'opérateur AND à la priorité sur
  261. l'opérateur OR. Cela diffère du comportement de Java Lucene.
  262. </para>
  263. <sect3 id="zend.search.lucene.query-language.boolean.and">
  264. <title>AND</title>
  265. <para>
  266. L'opérateur AND signifie que tous les termes dans le "groupe AND" doivent correspondre à
  267. une partie du/des champs cherché(s).
  268. </para>
  269. <para>
  270. Pour chercher des documents qui contiennent "PHP framework" et "Zend Framework", utilisez
  271. la requête :
  272. <programlisting language="querystring"><![CDATA[
  273. "PHP framework" AND "Zend Framework"
  274. ]]></programlisting>
  275. </para>
  276. </sect3>
  277. <sect3 id="zend.search.lucene.query-language.boolean.or">
  278. <title>OR</title>
  279. <para>
  280. L'opérateur OR divise la requête en plusieurs termes optionnels.
  281. </para>
  282. <para>
  283. Pour chercher des documents qui contiennent "PHP framework" ou "Zend Framework", utilisez
  284. la requête :
  285. <programlisting language="querystring"><![CDATA[
  286. "PHP framework" OR "Zend Framework"
  287. ]]></programlisting>
  288. </para>
  289. </sect3>
  290. <sect3 id="zend.search.lucene.query-language.boolean.not">
  291. <title>NOT</title>
  292. <para>
  293. L'opérateur NOT exclut les documents qui contiennent le terme situé après NOT. Mais un "groupe AND"
  294. qui contient uniquement des termes précédés de NOT ne retournera aucun résultat au lieu de retourner
  295. tous les documents indexés.
  296. </para>
  297. <para>
  298. Pour chercher des documents qui contiennent "PHP framework", mais pas "Zend Framework", utilisez
  299. la requête :
  300. <programlisting language="querystring"><![CDATA[
  301. "PHP framework" AND NOT "Zend Framework"
  302. ]]></programlisting>
  303. </para>
  304. </sect3>
  305. <sect3 id="zend.search.lucene.query-language.boolean.other-form">
  306. <title>Les opérateurs &amp;&amp;, ||, et !</title>
  307. <para>
  308. &amp;&amp;, ||, et ! peuvent être utilisés à la place de la notation AND, OR, et NOT.
  309. </para>
  310. </sect3>
  311. <sect3 id="zend.search.lucene.query-language.boolean.plus">
  312. <title>+</title>
  313. <para>
  314. L'opérateur "+" ou 'requis' stipule que le terme après le symbole "+" doit correspondre au document.
  315. </para>
  316. <para>
  317. Pour chercher des documents qui doivent contenir "Zend" et peuvent contenir "Framework", utilisez
  318. la requête :
  319. <programlisting language="querystring"><![CDATA[
  320. +Zend Framework
  321. ]]></programlisting>
  322. </para>
  323. </sect3>
  324. <sect3 id="zend.search.lucene.query-language.boolean.minus">
  325. <title>-</title>
  326. <para>
  327. L'opérateur "-" ou 'interdit' exclut les documents qui correspondent au terme suivant le symbole "-".
  328. </para>
  329. <para>
  330. Pour chercher des documents qui contiennent "PHP framework" mais pas "Zend Framework", utilisez
  331. la requête :
  332. <programlisting language="querystring"><![CDATA[
  333. "PHP framework" -"Zend Framework"
  334. ]]></programlisting>
  335. </para>
  336. </sect3>
  337. <sect3 id="zend.search.lucene.query-language.boolean.no-operator">
  338. <title>Pas d'opérateur</title>
  339. <para>
  340. Si aucun opérateur n'est utilisé, le comportement de la recherche est définit par "l'opérateur
  341. booléen par défaut".
  342. </para>
  343. <para>
  344. Il est défini à <code>OR</code> par défaut.
  345. </para>
  346. <para>
  347. Cela implique que chaque terme est optionnel par défaut. Il peut être présent ou pas dans le document, mais
  348. les documents avec le terme recevront un score plus élevé.
  349. </para>
  350. <para>
  351. Pour chercher des documents qui doivent contenir "PHP framework" et peuvent contenir "Zend Framework", utilisez
  352. la requête :
  353. <programlisting language="querystring"><![CDATA[
  354. +"PHP framework" "Zend Framework"
  355. ]]></programlisting>
  356. </para>
  357. <para>
  358. L'opérateur booléen par défaut peut être défini ou récupéré avec les méthodes
  359. <classname>Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator)</classname> et
  360. <classname>Zend_Search_Lucene_Search_QueryParser::getDefaultOperator()</classname>, respectivement.
  361. </para>
  362. <para>
  363. Ces méthodes travaillent avec les constantes
  364. <classname>Zend_Search_Lucene_Search_QueryParser::B_AND</classname> et
  365. <classname>Zend_Search_Lucene_Search_QueryParser::B_OR</classname>.
  366. </para>
  367. </sect3>
  368. </sect2>
  369. <sect2 id="zend.search.lucene.query-language.grouping">
  370. <title>Groupement</title>
  371. <para>
  372. Java Lucene et <classname>Zend_Search_Lucene</classname> supportent l'usage de parenthèses pour grouper des clauses et former
  373. 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
  374. ou bien mixer différents styles de requête :
  375. <programlisting language="querystring"><![CDATA[
  376. +(framework OR library) +php
  377. ]]></programlisting>
  378. <classname>Zend_Search_Lucene</classname> supporte l'imbrication de requêtes à n'importe quel niveau.
  379. </para>
  380. </sect2>
  381. <sect2 id="zend.search.lucene.query-language.field-grouping">
  382. <title>Groupement de champs</title>
  383. <para>
  384. Lucene supporte également l'usage des parenthèses pour grouper plusieurs clauses sur un simple champ.
  385. </para>
  386. <para>
  387. Pour chercher un titre (champ 'title') qui contient le mot "return" ET la phrase "pink panther", utilisez la requête :
  388. <programlisting language="querystring"><![CDATA[
  389. title:(+return +"pink panther")
  390. ]]></programlisting>
  391. </para>
  392. </sect2>
  393. <sect2 id="zend.search.lucene.query-language.escaping">
  394. <title>Echappement des caractères spéciaux</title>
  395. <para>
  396. Lucene supporte l'échappement des caractères spéciaux qui sont utilisés dans la syntaxe
  397. de requête. La liste des caractères spéciaux est la suivante :
  398. </para>
  399. <para>
  400. + - &amp;&amp; || ! ( ) { } [ ] ^ " ~ * ? : \
  401. </para>
  402. <para>
  403. dans les termes simples, + et - sont automatiquement traités comme des caractères normaux.
  404. </para>
  405. <para>
  406. Pour d'autres occurences de ces caractères, utilisez le \ avant chaque caractère spécial si vous
  407. voulez l'échapper. Par exemple, pour chercher (1+1):2, utilisez la requête :
  408. <programlisting language="querystring"><![CDATA[
  409. \(1\+1\)\:2
  410. ]]></programlisting>
  411. </para>
  412. </sect2>
  413. </sect1>