Description de la clause
Les requêtes en couches étendent la syntaxe de requête et vous offrent un meilleur contrôle sur le processus de récupération des documents. Les applications peuvent utiliser les requêtes en couches pour accélérer la récupération des documents et améliorer les performances globales du système. Les principales fonctionnalités étendues sont les suivantes :
Sélectionnez des plages pour la récupération des documents.
Définissez l'ordre de récupération pour différentes plages.
Spécifiez différentes requêtes pour différentes plages afin d'influencer l'ensemble de résultats récupérés.
Syntaxe de la clause
Terminologie
|
name |
description |
|
seek |
L'opération consistant à trouver un document lors d'une requête. |
|
docid |
ID interne d'un document dans HA3. Les requêtes recherchent les documents par ordre croissant de docid. |
|
range |
Une plage de docids pour une requête. Ici, range désigne l'étendue des docids qui seront recherchés. |
|
layer |
Une couche est constituée d'une ou plusieurs plages. L'objectif principal d'une couche est de déterminer la priorité des plages de requête en plaçant différentes plages dans différentes couches. |
Syntaxe de requête
{
"layer" : [
]
}
Sélectionner des plages de récupération
Vous pouvez utiliser la syntaxe layer pour contrôler les plages de récupération.
Une clause layer se compose d'un ou plusieurs éléments single_layer. Chaque élément single_layer comporte deux composants principaux :
-
quota : Définit le nombre recommandé de documents à récupérer pour la couche actuelle. Notez les points suivants :
Relation entre quota et
rank_size: La somme des quotas de toutes les couches ne peut pas dépasserrank_size. Par exemple, sirank_sizeest égal à 10 et que vous avezquota:5etquota:7, le quota de la deuxième couche est tronqué à 5.Si la couche actuelle dispose d'un quota restant, celui-ci est automatiquement ajouté à la couche suivante.
Le quota peut être appliqué de deux manières, car les documents au sein d'une couche ne sont pas toujours triés par pertinence. La première méthode vérifie le quota restant après chaque document trouvé. La seconde ignore la limite de quota au sein de la couche actuelle mais respecte toujours la limite
rank_size. Une fois la recherche de la couche actuelle terminée, tout quota restant est ajouté à la couche suivante.Si vous spécifiez explicitement une clause layer, le quota par défaut pour chaque couche est de 0. La valeur maximale pour quota est la valeur maximale de
uint32_t.
-
range : Détermine la plage de documents pour la couche actuelle. Si ce paramètre n'est pas spécifié, la plage inclut tous les documents, soit
[0, docCount). La syntaxerangecalcule progressivement la plage de documents requise pour la recherche (seek) en fonction des attributs que vous fournissez. Notez les éléments suivants :Vous devez utiliser des attributs dans la syntaxe, et non des expressions nécessitant un calcul.
Les attributs utilisés dans la syntaxe doivent correspondre à la méthode de tri hors ligne. Sinon, la requête recherche automatiquement toute la plage.
Les attributs utilisés dans la syntaxe doivent apparaître de manière consécutive. Vous ne pouvez pas insérer de mots-clés d'extension tels que
%sortedou%docidentre les attributs.En plus des attributs, plusieurs instructions d'extension sont prises en charge. Il s'agit notamment de
%sortedpour interroger les index complets et incrémentiels triés dans cette couche,%unsortedpour interroger des données non triées telles que les données en temps réel dans cette couche,%otherpour la plage excluant les couches précédentes,%docidpour spécifier directement une plage de docid à interroger,%segmentidpour spécifier directement une plage d'ID de segment à interroger, et%percentpour spécifier un pourcentage de la plage à interroger.Si vous ne spécifiez pas les mots-clés
%sortedou%unsorteddans la clause layer, le moteur les ajoute automatiquement. Par défaut, chaque couche est triée. Si un nombre insuffisant de résultats est renvoyé, le moteur interroge une couche supplémentaire de données en temps réel.
Sélectionner différentes requêtes pour différentes plages
Pour différentes couches de requête, vous pouvez utiliser différentes requêtes de recherche ou sélectionner différentes listes inversées en séparant les requêtes par des points-virgules. Si le nombre de couches est supérieur au nombre de requêtes, la dernière requête est automatiquement utilisée pour les couches restantes.
Exemples d'utilisation
Cette section décrit comment utiliser les requêtes en couches avec d'autres fonctionnalités fournies par le moteur.
Trier les documents lors de la création de l'index et interroger des plages de récupération spécifiques
Lorsque vous utilisez la fonctionnalité de tri hors ligne, les documents sont ordonnés globalement. Par exemple, si vous effectuez un tri par site, tous les documents du même site sont regroupés dans l'index. Vous pouvez utiliser cette fonctionnalité pour accélérer les opérations de recherche (seek) lorsque vous interrogez au sein d'un site. Par exemple, supposons que l'attribut de site soit site_id. Pour rechercher « iphone » au sein des ID de site 1 et 7, utilisez la syntaxe suivante :
{
"layer" : [
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [1,7]
}
]
},
"quota" : 5000
}
]
}
Alternativement, si les résultats de requête des sites 1 et 7 sont insuffisants et que vous souhaitez interroger les sites 5 et 10 pour obtenir des résultats supplémentaires, utilisez la syntaxe suivante :
{
"layer" : [
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [1,7]
}
]
},
"quota" : 5000
},
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [5,10]
}
]
},
"quota" : 0
}
]
}
Si vous souhaitez interroger la deuxième couche uniquement lorsque les résultats de la première couche sont insuffisants, vous pouvez définir le quota de la deuxième couche sur 0 ou le laisser non spécifié. Vous pouvez également effectuer une récupération diversifiée :
{
"layer" : [
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [1,7]
}
]
},
"quota" : 4000
},
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [5,10]
}
]
},
"quota" : 1000
}
]
}
Pour le tri hors ligne multidimensionnel, vous pouvez également localiser des plages multidimensionnelles. Par exemple, dans une recherche intra-site, le tri hors ligne est d'abord effectué par site. Pour les pages web du même site, les pages sont ensuite triées par leur score statique. Dans ce cas, pour récupérer les pages web ayant un score statique supérieur à 100, la syntaxe de requête est la suivante :
{
"layer" : [
{
"range" : {
"fields" : [
{
"field" : "site_id",
"values" : [1,7]
},
{
"field" : "static_score",
"values" : "[100,]"
}
]
},
"quota" : 4000
}
]
}
Note: Enclose interval ranges in double quotation marks.
Requêtes multiples
Dans certains cas, les utilisateurs souhaitent récupérer un nombre suffisant d'éléments pour une requête, mais veulent également éviter d'en récupérer trop, ce qui pourrait nuire aux performances de la requête. Un scénario courant pour cela est lorsqu'une requête contient plusieurs termes de recherche, tels que A et B :
|
Query method |
Recall Count |
Performance |
|
A AND B |
Fewest |
Best |
|
A OR B |
Most |
Worst |
|
A RANK B/B RANK A |
Moderate |
Medium |
Les méthodes de requête précédentes produisent différents nombres de récupération et performances pour A et B. La plupart des requêtes nécessitent une bonne récupération, mais le nombre de résultats récupérés n'a pas besoin d'être élevé. Dans ce scénario, il est difficile d'utiliser une seule méthode de requête fixe pour garantir que le nombre de résultats et les performances soient modérés. Une approche multi-requête peut résoudre ce problème en une seule requête :
{
"query": "A OR B;A RANK B;A AND B",
"layer" : [
{
"quota" : 1000
},
{
"quota" : 1000
},
{
"quota" : 1000
}
]
}
Cette méthode de requête équilibre le rappel de documents et les performances. Elle améliore également considérablement la pertinence de la requête de recherche. Pour une récupération à grande échelle, elle peut atteindre certains résultats « A AND B ». Pour une récupération à petite échelle, elle peut utiliser « A OR B » pour rappeler autant de documents que possible.
Requêtes sensibles au temps
Si vous souhaitez privilégier la récence des résultats de requête, vous pouvez d'abord interroger l'index non trié en temps réel avant d'interroger les index complets et incrémentiels triés. Au sein d'un index trié, vous pouvez également utiliser le paramètre percent pour spécifier l'ordre de requête, par exemple en interrogeant une partie plus récente des données avant une partie plus ancienne.
Par exemple, considérons un scénario où vous souhaitez rechercher « iphone ». Vous interrogez d'abord l'index en temps réel le plus récent. Si les résultats sont insuffisants, vous interrogez ensuite les 50 % derniers documents de l'index trié. Enfin, vous interrogez les 50 % premiers documents :
{
"layer" : [
{
"range" : {
"index_type" : "%unsorted"
},
"quota" : 5000
},
{
"range" : {
"index_type" : "%sorted",
"fields" : [
{
"field" : "service_id",
"values" : [1,3]
}
],
"percent" : "[50,100)"
},
"quota" : 0
},
{
"range" : {
"index_type" : "%sorted",
"fields" : [
{
"field" : "service_id",
"values" : [1,3]
}
],
"percent" : "[0,50)"
},
"quota" : 0
}
]
}
Note: You can specify multiple intervals for the `percent` keyword. The intervals are left-closed and right-open.
Notes
La clause layer est facultative.