Limitation de la durée des recherches
Bien que l'algorithme de recherche de Texpress permet des recherches très rapides à travers de larges jeux de données, certaines classes de requêtes peuvent prendre plus de temps à être exécutées.
En particulier, les requêtes suivantes peuvent s'exécuter lentement :
Type de recherche |
Explication |
---|---|
Recherche sans le support d'un index |
Cette catégorie de recherches comprend l'interrogation de champs sans support d'index et les recherches par caractères génériques lorsqu'un terme d'index n'a pas été fourni. Par exemple, rechercher tous les noms de famille du module Personnes / Organisations qui commencent par |
Recherches encadrées |
Même si des index existent pour des recherches de plages, ils existent au niveau de la description de l'enregistrement. Une plage de recherche implique la visite de chaque description d'enregistrement et la vérification des données concernées (range bits) pour contrôler si elles tombent dans la plage recherchée. |
Grand nombre de termes OU combinaison de termes avec le terme ET |
Lorsqu'une requête OR est exécutée, le serveur effectue une requête logique par terme OR et fusionne les résultats dans un seul ensemble de correspondance. Comme la requête est très rapide, ce n'est pas un problème. Cependant si une requête contient un grand nombre de termes OU et des termes ET, le requêteur va d'abord optimiser la requête pour la transformer en une combinaison d'expressions de OU qui contiennent une liste de termes ET. Ainsi une requête comme :
est transformé par l'optimiser en :
Si un grand nombre de termes OU et de termes ET existe, l'optimiser risque de prendre un temps considérable pour retravailler la requête originale et la transformer en termes de recherches adéquats pour le moteur de recherche. Une fois l'optimisation terminée, chaque requête OU va très vite (en supposant qu'il existe un index de termes). |
Comme certaines requêtes prenaient du temps sur les grands jeux de données, une fonction a été introduite avec Texpress 8.0.028, qui permet de fixer une limite au temps de recherche : il est possible d'interrompre la recherche après un nombre donné de secondes. Cette fonction permet aussi d'interdire des recherches qui entraîneraient la recherche d'un trop grand nombre de segments (traite les Recherches de plages et Recherches sans le support d'un index).
Le mécanisme de limitation du temps de recherche fonctionne sous texforms, TexQL et texserver. Des extensions ont été ajoutées en texxmlserver pour bénéficier de cette nouvelle facilité.
Les options Texpress pour contrôler l’expiration des recherches incluent :
Pour contrôler le délai d'expiration des recherches dans Texpress, utiliser :
timeout=x
où :
x
est le nombre de secondes maximales pendant lequel une requête fonctionnera.
Une valeur de zéro désactivera le mécanisme (c'est la valeur par défaut). Après l'écoulement du nombre de secondes spécifiées, une deuxième option est consultée pour déterminer la façon dont le dépassement doit être pris en compte :
timeouthandler=[error|return|continue|ask]
où l'une des valeurs doit être spécifiée. Les options disponibles sont :
|
retourne un message d'erreur indiquant que la recherche a dépassé le temps alloué. |
|
retourne les enregistrements trouvés (ou aucun si aucun a été trouvé) plutôt qu'une erreur. |
|
continue la recherche. Une nouvelle limitation n'est pas fixée. |
|
exécute un appel vers l'utilisateur pour lui demander de répondre (seulement disponible pour texforms ou texserver. En TexQL cette option aura le même comportement que |
Le mécanisme est réglé au niveau de l'application ; cela veut dire des limitations différentes ne peuvent être fixées pour des tables individuelles. Cela est ainsi fait car les requêtes en TexQL recherchent à travers de multiples tables (même des virtuelles). Si cette option est réglée pour une table donnée (ex. en utilisant dbnameopts), la valeur écrasera en écriture la valeur de l'application pour toutes les recherches. La valeur par défaut pour le handler est error
.
Si l'option est réglée sur return
, toute correspondance trouvée sera retournée. Pour le moment il n'y a pas de mécanisme pour signaler si les données retournées sont le résultat d'une recherche complète ou d'une limitation de recherche.
Dans cet exemple, une requête est limitée à deux secondes et retourne un message d'erreur en TexQL :
TEXPRESSOPTS="$TEXPRESSOPTS timeout=2 timeouthandler=error"
export TEXPRESSOPTS
texql
texql 1> select all from eparties;
Error: Your search has taken too long. Please adjust your query.
texql 2>
Pour ajouter des paramètres d’expiration pour EMu, il est recommandé d'ajuster la variable d'environnement TEXPRESSOPTS
dans le fichier .profile-local dans le répertoire d'un client. Les clients antérieurs à EMu 3.1 ne prennent pas en charge le gestionnaire d’expiration ask, c'est plutôt error qui est généré. EMu 3.1 et suivants demandent à l'utilisateur s'il veut abandonner la requête ou continuer. Si la requête est terminée, les enregistrements déjà récupérés sont affichés.
Dans certains cas, notamment les recherches sur le web, il est utile de savoir si une recherche aboutira à un grand nombre de correspondances avant de la lancer. L'option searchlimit
permet de spécifier le nombre maximum de segments [une portion de la base de données] à rechercher pour une requête donnée. Si le nombre de segments est important, il faudra un certain temps pour traiter tous les enregistrements afin de déterminer les correspondances. Heureusement, Texpress peut déterminer très rapidement si une requête donnée entraînera la recherche d'un grand nombre de segments. Cet outil permet de fournir un retour immédiat aux utilisateurs indiquant qu'une recherche est trop vague.
Le format de cette option est :
searchlimit=[x|y%]
où :
x
est le nombre maximum de segments à rechercher. Comme un nombre absolu peut ne pas être utile (car il dépend de la configuration de la base de données), une deuxième forme y% est fournie où y est le pourcentage maximum de segments à rechercher.
Contrairement à l'option timeout
, l'option searchlimit peut être réglée au niveau des tables, il est donc possible de restreindre les recherches dans un nombre de tables sélectionnées, plutôt qu'à l'ensemble du système. Pour des paramétrages particuliers des tables, utiliser les fichiers dbnameopts ou opts dans le répertoire table.
Un handler peut également être spécifié lorsque la limite de recherche est dépassée. Le format du handler est le suivant :
searchlimithandler=[error|return|continue|ask]
où les paramétrages disponibles sont les mêmes que pour timeouthandler
. Le paramétrage par défaut est error.
Dans cet exemple, le nombre de segments consultés dans eparties est limité à 50% et une erreur est retournée en TexQL :
etaxonomyopts='searchlimit=50% searchlimithandler=error'
export etaxonomyopts
texql
texql 1> select all from eparties;
Error: Your search has too many matches. Please adjust your query.
texql 2>
Pour ajouter des paramètres de limite de recherche pour EMu, il est recommandé d'ajuster la variable dbnameopts ou la variable d’environnement TEXPRESSOPTS
dans le fichier .profile-local dans le répertoire d'un client. Les clients antérieurs à EMu 3.1 ne prennent pas en charge le handler de limite de recherche ask, c'est plutôt error qui est généré. EMu 3.1 et suivants demandent à l'utilisateur s'il veut abandonner la requête ou continuer. Si la requête est terminée, l'utilisateur revient au mode Requête.
Des extensions d’expiration sont également disponibles pour texxmlserver :
L'une des raisons de l'introduction des expirations de recherche était de limiter les ressources disponibles pour le traitement des recherches sur le Web. Avant l'introduction de la fonction d’expiration, un utilisateur pouvait lancer une recherche qui prenait un certain temps et occupait les serveurs, même si l'utilisateur avait déjà abandonné la recherche. L’expiration offre trois moyens de restreindre l'accès aux ressources via texxmlserver. Chacun de ces éléments est contrôlé par les options définies dans le fichier texxmlserver.conf (pour EMu, ce fichier se trouve dans le répertoire etc dans le répertoire du client). Ces options ne sont prises en charge qu'à partir de la version 3.1.007 de TexAPI.
Plutôt que de définir les options d’expiration dans le .profile-local,
client EMu, elles peuvent être définies pour texxmlserver uniquement. Tout paramètre dans .profile-local s'appliquera à toutes les instances de texforms, TexQL et texserver et affectera donc le client Windows. Le fichier texxmlserver.conf permet de définir les options suivantes :
Timeout=x
TimeoutHandler=[continue|error|return]
où :
x
est le nombre de secondes avant que la recherche expire. La valeur par défaut est zéro indiquant qu'il n'y a pas de limitation activée.
L'option TimeoutHandler
contrôle ce qui se passe lorsque le délais a expiré. Les valeurs sont les mêmes que pour le réglage de Texpress timeouthandler. La limite utilisée affecte toutes les recherches initiées par texxmlserver mais n'affecte pas les opérations de mise à jour, d'insertion et de suppression.
Il est possible de limiter le nombre de segments de recherche dans une requête. Cette restriction peut être réglée pour toutes les tables ou pour une table individuelle. Le fichier texxmlserver.conf
permet le réglage des options suivantes :
SearchLimit=x[:dbname]
SearchLimit=y%[:dbname]
où :
x
|
est le nombre maximal de segments à rechercher. |
y
|
est le pourcentage maximal de segments à rechercher. |
Si le paramétrage s'applique à une table seulement, la valeur est annexée avec :dbname où dbname est le nom de la table pour lequel les restrictions s'appliquent. Plus d'une SearchLimit
peut être spécifié. Si plus d'une limite est paramétrée, l'ordre des entrées est significatif. L'entrée s'appliquant à l'ensemble du système devra toujours être réglée en premier, suivie des paramètres de tables individuels. La valeur par défaut est zéro indiquant qu'il n'y a pas de limite au nombre de segments consulté pour la recherche.
Par exemple pour seulement rechercher 50 % des segments pour la table etaxonomy, mais 80 % pour la table eparties le réglage suivant pourra être utilisé :
SearchLimit=50%:emultimedia
SearchLimit=80%:eparties
Une fois que le nombre maximum de segments est excédé, une erreur est retournée.
Lors du lancement d'une requête web, il est possible de restreindre le nombre d'enregistrements trouvés correspondants à la recherche. Par exemple, cela n'a pas de sens pour un utilisateur web de retrouver 20 000 enregistrements puisqu'il n'ira jamais tous les consulter. Le fichier texxmlserver.conf permet de restreindre le nombre de correspondances retournées :
MatchLimit=x[:dbname]
où :
x
est le nombre maximal de correspondances à retourner pour une requête donnée.
Il est possible de limiter le nombre de correspondances sur la base d'une table en spécifiant :dbname après la valeur, où dbname est le nom de la table. Plus d'un paramètre MatchLimit
peut être spécifié. Si plus d'une limite est paramétrée, l'ordre des entrées est significatif. L'entrée s'appliquant à l'ensemble du système devra toujours être réglée en premier, suivie des paramètres de tables individuels. Une fois que le nombre maximum de correspondances est atteint, les enregistrements correspondants sont retournés et la requête est terminée. La valeur par défaut est -1 indiquant qu'il n'y a pas de limite.