Accueil > Bases de données relationnelles et indexation du contenu > Possibilités des requêtes Indri

Possibilités des requêtes Indri

Basé sur le langage Inquery

mercredi 9 septembre 2009, par Yoann Moreau

Description des fonctionnalités du langage de requête propre au moteur de recherche Lemur Indri basé sur Inquery, et principalement celles qui seront utiles pour l’entrepôt de données dans les tests appliqués sur les valeurs lors d’une opération de coupe.

Introduction

Le moteur d’indexation et de recherche Indri a pour but la recherche de texte dans des documents. Comme tout moteur de recherche dans un corpus de documents, il permet de classer les documents correspondants à une certaine requête selon des scores. Dans notre projet, le classement selon les scores n’est pas utile. En effet les conditions de l’opération de coupe sont des conditions booléennes, on cherchera alors la présence de certaines valeurs, ou encore l’appartenance de certaines valeurs à des intervalles donnés. Nous n’utiliserons donc pas toutes les fonctionnalités d’affinage des scores offertes par le langage de requête de Indri, mais d’autres fonctionnalités propres à Indri (comme la recherche par suffixe, ou la recherche de termes dans un certain ordre) seront par contre très utiles.

Définitions

L’indexation de Indri permet entre autre d’indexer des documents XML (comme du HTML). Le langage de requête permet ensuite d’utiliser ces balises pour préciser la recherche.

Le document est traité comme du texte contenu ou hors de balises XML. On définit le context d’une balise de type T comme l’ensemble du texte et des balises contenus par toutes les balises de type T dans le document. On définit un extent d’une balise de type T comme le contenu d’une paire de balises (ouvrante et fermante) de type T. Un context contient donc un ou plusieurs extents.

Les termes recherchés sont automatiquement transformés en lemmes (racine des différentes formes que peut prendre un mot), et si le mot appartient aux mots vides il sera ignoré. Pour que la chaine de caractères soit recherchée telle quelle et sans pouvoir être ignorée il faut l’entourer de guillemets (double quote). Il est également possible de donner la version en base 64 avec #base64quote(...).

Ordre et proximité

On peut rechercher des termes qui doivent obligatoirement apparaître dans l’ordre dans lequel ils sont donnés, en précisant ou non le nombre maximum de termes séparant chacun d’eux. Pour cela on utilise #odN(...) ou #N(...) avec N-1 représentant le nombre maximum de termes entre chaque terme de la requête. Si N n’est pas donné, alors il n’y a pas de distance maximum entre les termes.

On peut également tenir compte de la proximité sans tenir compte de l’ordre. Pour cela on utilise #uwN(...) avec N-2 représentant le nombre maximum de termes entre chaque terme de la requête.

Synonymes

Il est possible de faire une recherche en indiquant des synonymes, on peut attribuer un poids à chaque synonyme. Il suffira de trouver un des termes synonymes dans le document, comme un OU booléen, le véritable avantage est la possibilité d’attribuer un poids différent à chaque synonyme, cela permet de donner plus ou moins d’importance à chacun.

Cette fonctionnalité très utile pour de la recherche de texte dans des documents ne sera pas utilisée pour l’indexation de l’entrepôt de données.

Utilisation de jokers pour rechercher des préfixes

Indri permet également de rechercher en utilisant des jokers, c’est à dire accepter n’importe quels caractères après un certain préfixe. On ne peut utiliser de joker que sur la fin d’un mot (impossible de rechercher un suffixe). On peut rechercher tous les termes contenant un certain préfixe avec #wildcard(préfixe) ou plus simplement avec préfixe*. Indri va créer une liste de synonymes pour le préfixe donné, par défaut cette liste est limitée à 100 termes, ce maximum peut être modifié à l’aide de l’option <maxWildcardTerms>, si le maximum est atteint une exception est levée.

Utilisation des balises

Indri permet de limiter la recherche à une balise donnée, correspondant à un context. On peut par exemple rechercher n’importe quel texte obligatoirement contenu dans une certaine balise, on utilise pour cela #any:balise ou #any(balise). Cet opérateur n’est utile qu’avec d’autres termes, pour compléter ces termes par une information inconnue mais contenue par un type de balises connu.

Exemple : #od1(Napoléon est mort en #any:date) —> trouvera toute phrase possédant exactement cette forme : "Napoléon est mort en <date>...</date>".

Indri permet aussi d’utiliser les balises de manière plus complexe. On peut préciser pour une requête (ou une partie d’une requête), dans quel(s) type(s) de balise(s) doivent se trouver les termes. Pour cela on utilise cette écriture requête.balise1,balise2,...baliseN . On peut également préciser dans quel(s) context(s) effectuer la recherche, et même préciser à la fois le(s) context(s) et la/les balise(s) contenant la chaîne recherchée. La syntaxe complète est la suivante requête.balise1,balise2,...baliseN(contexte1,contexte2,...contexteM). La requête peut être un terme ou une opération (ou combinaison d’opérations) vues dans les paragraphes précédents.

Autres fonctionnalités

Indri offre d’autres fonctionnalités permettant d’attribuer des poids différents à des sous parties de la requête, selon les termes, selon la position dans le document, d’évaluer les documents contenant certains termes et pas d’autres... Toutes ces possibilités ne seront pas utilisées pour l’entrepôt de données, où seules des correspondances exactes sont recherchées. L’opérateur combinant différentes expressions est #combine(exp1 exp2 ...) qui correspond par exemple à une suite de mots clés, mais les expressions peuvent être tout ce qui a été vu auparavant.

Sélection de passages

Il est possible d’appliquer une requête sur des passages distincts, on obtiendra alors en sortie un score pour chacun des passages correspondant à la requête. On peut définir les passages soit comme un certain context (la requête sera appliquée sur chaque extent du context) avec #combine[balise](...) ; soit comme des bloc de texte de longueur fixe avec #combine[passageX:Y](...), où on précise la longueur du bloc X et le pas de décalage Y en nombre de termes.

Il est aussi possible de faire référence dans le choix des balises à des enfants, parents ou ancêtres avec respectivement .\ ./ et .// .

Opérateurs numériques

Il est possible d’utiliser des opérations numériques sur des nombres et des dates, plus précisément d’appliquer des conditions de comparaison et d’égalité. Ces opérations ne sont possibles que sur des champs indexés comme champs numériques ou champs de date. Il faudra en fait lors de la construction de l’index, préciser certaines balises comme numériques ou de date (plusieurs formats de dates sont compatibles). Dans l’entrepôt de données la colonne des valeurs ne permettra pas cette distinction des types, les comparaisons numériques ne seront donc pas utilisables.

Sources

http://www.lemurproject.org/lemur/IndriQueryLanguage.php
http://lemur.wiki.sourceforge.net/The+Indri+Query+Language