Chercher dans un indexConstruire des requêtesIl y a deux manières de chercher dans un index. La première utilise le parseur de requête pour construire une requête à partir d'une chaîne de caractères. La seconde consiste à créer vos propres requêtes par programme à l'aide de l'API Zend_Search_Lucene. Avant de choisir d'utiliser le parseur de requête fourni, veuillez considérer ce qui suit :
Les deux manières utilisent la même méthode d'API pour chercher dans l'index :
La méthode Zend_Search_Lucene::find() détermine automatiquement le type de données entrantes et utilise le parseur de requêtes ou construit un objet approprié à partir d''une donnée entrante de type chaîne de caractères. Il est important de noter que le parseur de requêtes utilise l'analyseur standard pour "tokenizer" les différentes partie d'une chaîne. Ainsi, toutes les transformations qui sont appliquées aux textes indexés le sont également aux chaînes de requête. L'analyseur standard peut transformer la chaîne de requête en minuscules pour gérer l'insensibilité à la casse, retirer les mots exclus (ou "stop-words"), et encapsuler les autres transformations. La méthode de l'API ne transforme ni ne filtre les termes entrant d'aucune façon. Elle est ainsi plus pratique pour les champs générés par le programme ou ceux qui ne sont pas "tokenizés". Parsage de requêtesLa méthode Zend_Search_Lucene_Search_QueryParser::parse() peut être utilisée pour parser des chaînes de requête en objets de requête. Cet objet de requête peut être utilisé dans une méthode de construction de requête de l'API pour combiner des requêtes entrées par l'utilisateur avec des requêtes générées par programme. Pour l'instant, dans certains cas c'est le seul moyen de chercher des valeurs dans des champs "non-tokenizés" : Actually, in some cases it's the only way to search for values within untokenized fields:
La méthode Zend_Search_Lucene_Search_QueryParser::parse() prend également un paramètre optionnel d'encodage, qui permet de spécifier l'encodage de la chaîne de requête :
Si le paramètre d'encodage est omis, la locale courante est utilisée. Il est également possible de spécifier l'encodage par défaut de la chaîne de requête avec la méthode Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding() :
Zend_Search_Lucene_Search_QueryParser::getDefaultEncoding() retourne la valeur actuelle de l'encodage par défaut d'une chaîne de requête (une chaîne vide signifiant "locale courante"). Résultats de recherche
Le résultat de recherche est un tableau d'objets
Zend_Search_Lucene_Search_QueryHit. Chacun d'eux a deux propriétés :
L'objet Zend_Search_Lucene_Search_QueryHit expose également chaque champ du Zend_Search_Lucene_Document trouvé dans la recherche en tant que propriété du hit. Dans l'exemple suivant, un hit est retourné avec deux champs du document correspondant : title et author. Les champs stockés sont toujours retournés encodés en UTF-8. Optionnellement, l'objet original Zend_Search_Lucene_Document peut être retourné depuis le Zend_Search_Lucene_Search_QueryHit. Vous pouvez récupérer les parties stockées du document en utilisant la méthode getDocument() de l'objet index, puis les obtenir avec la méthode getFieldValue() :
Les champs disponibles dans l'objet Zend_Search_Lucene_Document sont déterminés lors de l'indexation. Les champs sont soit indexés, soit indexés et stockés dans le document par l'application d'indexage (p. ex. LuceneIndexCreation.jar). Notez que l'identité du document ('path' dans notre exemple) est également stocké dans l'index et doit être récupéré depuis l'index. Limiter le nombre de résultatsL'opération la plus lourde au niveau du calcul dans une recherche est la calculation des scores. Cela peut prendre plusieurs secondes pour un grand ensemble de résultats (dizaine de milliers de hits). Zend_Search_Lucene donne la possibilité de limiter la taille de l'ensemble de résultats avec les méthodes getResultSetLimit() et setResultSetLimit() :
Cela ne retournera pas les 'N meilleurs' résultats, mais seulement les 'N premiers'. [1] . Etablissement des scores des résultats de rechercheZend_Search_Lucene utilise le même algorithme de scoring que Java Lucene. Par défaut, tous les hits dans l'ensemble de résultats sont triés par score. Les hits avec le plus grand score viennent en premier, et les documents avec des hauts scores devraient mieux correspondre à la requête que ceux avec des scores moins élevés. En gros, les hits qui contiennent le terme ou la phrase cherché plus fréquemment auront un score plus élevé.
Le score d'un hit peut être récupéré en accédant à la propriété La classe Zend_Search_Lucene_Search_Similarity est utilisée pour calculer le score pour chaque hit. Consultez la section Extensibility. Scoring Algorithms pour des détails. Tri des résultats de recherchePar défaut, les résultats de recherche sont triés par score. Le programmeur peut changer ce comportement en définissant des paramètres pour le champ de tri (ou une liste de champs), le type de tri et le sens de tri.
L'appel à
Le nom d'un champ stocké par lequel on veut trier les résultats devrait être passé comme paramètre $sortField. $sortType peut être omis ou prendre l'une des valeurs suivantes : SORT_REGULAR (compare les éléments normalement- valeur par défaut), SORT_NUMERIC (compare les éléments comme des valeurs numériques), SORT_STRING (compare les éléments comme des chaînes de caractères). $sortOrder peut être omis ou prendre l'une des valeurs suivantes : SORT_ASC (trie dans l'ordre croissant- valeur par défaut), SORT_DESC (trie dans l'ordre décroissant). Exemples:
Soyez prudents en personnalisant vos clés de tri; la requête aura besoin de récupérer tous les documents correspondant de l'index, ce qui peut réduire considérablement les performances de recherche. Mise en évidence des résultats de rechercheZend_Search_Lucene propose deux options pour mettre en évidence les résultats de recherche. La première consiste à utiliser la classe Zend_Search_Lucene_Document_Html (voyez la section Documents HTML pour des détails) en utilisant les méthodes suivantes :
Pour personnaliser le comportement de mise en évidence, utilisez la méthode highlightExtended() avec le callback spécifié qui prendra un ou plusieurs paramètres. [2] , ou étendez la classe Zend_Search_Lucene_Document_Html et redéfinissez la méthode applyColour($stringToHighlight, $colour) qui est utilisée comme le callback de mise en évidence par défaut. [3] XHTML Les View helpers peuvent également être utilisés comme des callbacks dans un contexte d'affichage du script :
Le résultat de l'opération de mise en évidence est récupéré avec
la méthode
La seconde option est d'utiliser la méthode
Le second paramètre optionnel est l'encodage par défaut du document HTML. Il est utilisé si l'encodage n'est pas spécifié dans le metatag HTTP-EQUIV Content-Type. Le troisième paramètre optionnel est un objet de mise en évidence qui doit implémenter l'interface Zend_Search_Lucene_Search_Highlighter_Interface:
Si le paramètre $highlighter est omis, un objet Zend_Search_Lucene_Search_Highlighter_Default est instancié et utilisé. La méthode de mise en évidence highlight() est invoquée une fois par sous-requête, ainsi elle a la possibilité de différencier la mise en évidence pour chacune. La mise en évidence par défaut le fait en parcourant une table prédéfinie de couleurs. Vous pouvez implémenter votre propre classe de mise en évidence ou juste étendre la classe par défaut et redéfinir la table de couleurs.
[1]
Les hits retournés demeurent triés par score ou par l'ordre spécifié, s'il est spécifié.
[2]
Le premier paramètre est un fragment de code HTML pour la mise en évidence et
les suivants sont dépendants du comportement du callback. La valeur de retour
est un fragment HTML mise en évidence.
[3]
Dans les deux cas, le HTML retourné est automatiquement transformé en
valide.
|