Configuration du corps de la requête pour Elasticsearch
Utilisez un corps de requête pour les requêtes complexes dans lesquelles vous devez combiner plusieurs critères de recherche. La clause d'interrogation permet de déterminer si un document correspond à une recherche afin d'obtenir des résultats plus précis.
L'intégration avec Elasticsearch utilise la recherche par mot-clé, mais vous pouvez configurer le corps de la requête comme un paramètre avancé de Elasticsearch dans vos agents pour activer des techniques de recherche plus avancées, telles que la recherche par mot-clé :
- Recherche sémantique avec ELSER.
- recherche de vecteurs denses par k-plus proches voisins ( kNN ).
- Requête imbriquée pour rechercher des documents imbriqués.
- Recherche hybride.
- Recherche sur un champ textuel sémantique.
Recherche sémantique avec ELSER
Utilisez la recherche sémantique avec ELSER pour améliorer la précision et la pertinence des recherches en comprenant le contexte et l'intention qui sous-tendent les requêtes des utilisateurs. Pour plus d'informations, consultez la section Recherche sémantique avec ELSER dans Elasticsearch la documentation.
L'extrait de code suivant montre un exemple de recherche sémantique avec ELSER. L'exemple utilise une requête booléenne pour trouver les documents qui correspondent aux combinaisons booléennes d'autres requêtes.
{
"query": {
"bool": {
"should": [
{
"text_expansion": {
"ml.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
}
],
"filter": "$FILTER"
}
}
}
Où :
ml.tokensIl s'agit du champ qui stocke les jetons ELSER. Vous devrez peut-être le mettre à jour si vous utilisez un champ différent dans votre index. Si les jetons ELSER ne sont pas disponibles, vous pouvez également utiliser le champ qui contient le texte brut, mais la qualité de la recherche risque de se dégrader.
.elser_model_2_linux-x86-64Il s'agit de l'ID du modèle pour la version optimisée d'ELSER v2, à utiliser si elle est disponible dans votre déploiement Elasticsearch. Sinon, utilisez
.elser_model_2pour le modèle ELSER v2 ou.elser_model_1pour le modèle ELSER v1.$QUERYIl s'agit de la variable permettant d'accéder à la requête de l'utilisateur. Il peut garantir que la requête de l'utilisateur est transmise au corps de la requête.
$FILTERIl s'agit de la variable permettant d'accéder aux filtres personnalisés que vous configurez dans les paramètres avancés de Elasticsearch. Il peut garantir que les filtres personnalisés sont utilisés dans le corps de la requête.
k-nearest neighbor ( kNN ) recherche de vecteurs denses
Utilisez kNN la recherche pour trouver efficacement des éléments similaires à partir d'intégrations vectorielles, comme la recherche textuelle. Pour plus d'informations, consultez la section kNN recherche dans la Elasticsearch documentation.
L'extrait de code suivant montre un exemple de recherche vectorielle dense à l'adresse kNN :
{
"knn": {
"field": "text_embedding.predicted_value",
"query_vector_builder": {
"text_embedding": {
"model_id": "intfloat__multilingual-e5-small",
"model_text": "$QUERY"
}
},
"k": 10,
"num_candidates": 100,
"filter" : "$FILTER"
}
}
Où :
text_embedding.predicted_valueIl fait référence au champ qui stocke les vecteurs denses. Vous devrez peut-être le mettre à jour si vous utilisez un champ différent dans votre index. Pour plus d'informations, consultez la section Définition des intégrations de texte pour la recherche vectorielle dense dans Elasticsearch.
text_embeddingsousquery_vector_builderIl s'agit de la tâche de traitement du langage naturel à exécuter. Il doit être
text_embeddingpour la recherche kNN.intfloat__multilingual-e5-smallIl s'agit de l'ID du modèle d'intégration. Vous devrez peut-être le mettre à jour si vous souhaitez utiliser un modèle d'intégration différent.
$QUERYIl s'agit de la variable permettant d'accéder à la requête de l'utilisateur. Il peut garantir que la requête de l'utilisateur est transmise au corps de la requête.
$FILTERIl s'agit de la variable permettant d'accéder aux filtres personnalisés que vous configurez dans les paramètres avancés de Elasticsearch. Il peut garantir que les filtres personnalisés sont utilisés dans le corps de la requête.
Utilisation d'une requête imbriquée pour rechercher des documents imbriqués avec ELSER
La requête imbriquée enveloppe une autre requête pour rechercher des champs imbriqués dans votre Elasticsearch index lorsqu'il contient des documents imbriqués. Si une correspondance est trouvée, la requête renvoie le document parent racine ainsi que les documents imbriqués correspondants. Lorsque vous appliquez des filtres aux résultats de la recherche, vous pouvez choisir de filtrer soit les documents parents, soit les documents imbriqués.
Interroger les documents externes
L'extrait de code suivant montre un exemple d'interrogation des documents externes d'un index Elasticsearch.
Dans l'exemple, le document externe est le document principal qui contient les documents imbriqués passages . La requête nested effectue une recherche dans les documents imbriqués passages .
Si une correspondance est trouvée dans les documents imbriqués, la requête renvoie le document externe avec les documents imbriqués correspondants.
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "passages",
"query": {
"text_expansion": {
"passages.sparse.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
},
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}
}
}
],
"filter": "$FILTER"
}
},
"_source": false
}
Interroger les documents internes
L'extrait de code suivant montre un exemple d'interrogation des documents internes à l'intérieur des documents imbriqués.
Dans l'exemple, il recherche du texte développé dans des documents imbriqués, applique des filtres et renvoie les documents parents avec les documents imbriqués correspondants, en excluant certains champs de la source.
{
"query": {
"nested": {
"path": "passages",
"query": {
"bool": {
"should": [
{
"text_expansion": {
"passages.sparse.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
}
],
"filter": "$FILTER"
}
},
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}
}
},
"_source": false
}
Où :
passagesIl s'agit du champ imbriqué qui stocke les documents internes à l'intérieur d'un document parent. Vous devrez peut-être le mettre à jour si vous utilisez un champ imbriqué différent dans votre index.
passages.sparse.tokensIl s'agit du champ qui stocke les jetons ELSER ou le texte brut des documents internes. Vous devrez peut-être le mettre à jour si vous utilisez un champ imbriqué différent dans votre index. Si les jetons ELSER ne sont pas disponibles, vous pouvez également utiliser le champ qui contient le texte brut, mais la qualité de la recherche risque de se dégrader.
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}Il exclut les jetons ELSER des documents internes dans les résultats de la recherche.
"_source": falseIl exclut tous les champs de premier niveau des résultats de la recherche, car seuls les documents internes des résultats de la recherche sont utilisés.
$QUERYIl s'agit de la variable permettant d'accéder à la requête de l'utilisateur. Il peut garantir que la requête de l'utilisateur est transmise au corps de la requête.
$FILTERIl s'agit de la variable permettant d'accéder aux filtres personnalisés que vous configurez dans les paramètres avancés de Elasticsearch. Il peut garantir que les filtres personnalisés sont utilisés dans le corps de la requête.
Si appliqué aux documents externes, seuls les champs externes sont disponibles pour être utilisés dans les filtres. S'il est appliqué aux documents internes, seuls les champs internes peuvent être utilisés dans les filtres.
Recherche hybride combinant la recherche par mot-clé et la recherche vectorielle dense
L'extrait de code suivant montre un exemple de requête de recherche complexe sur un index Elasticsearch en combinant la recherche de texte traditionnelle avec une recherche par k-voisins les plus proches ( kNN ) et un classement :
{
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "$QUERY",
"fields": ["$BODY_FIELD_NAME", "$TITLE_FIELD_NAME"],
}
}
],
"filter" : "$FILTER"
}
},
"knn": {
"field": "text_embedding.predicted_value",
"query_vector_builder": {
"text_embedding": {
"model_id": "intfloat__multilingual-e5-small",
"model_text": "$QUERY"
}
},
"k": 10,
"num_candidates": 100,
"filter" : "$FILTER"
},
"rank": {
"rrf": {}
},
"size": 10,
"_source": {"excludes": ["text_embedding.predicted_value"]}
}
Où :
text_embedding.predicted_valueIl fait référence au champ qui stocke les vecteurs denses. Vous devrez peut-être le mettre à jour si vous utilisez un champ différent dans votre index.
text_embeddingsousquery_vector_builderIl s'agit de la tâche de traitement du langage naturel à effectuer. Il doit être
text_embeddingpour la recherche kNN.intfloat__multilingual-e5-smallIl s'agit de l'ID du modèle d'intégration. Vous devrez peut-être le mettre à jour si vous souhaitez utiliser un modèle d'intégration différent.
$QUERYIl s'agit de la variable permettant d'accéder à la requête de l'utilisateur. Il peut garantir que la requête de l'utilisateur est transmise au corps de la requête.
$BODY_FIELD_NAMEet$TITLE_FIELD_NAMEIl s'agit des variables permettant d'accéder aux champs Corps et Titre configurés dans l'intégration de la recherche.
$FILTERIl s'agit de la variable permettant d'accéder aux filtres personnalisés que vous configurez dans les paramètres avancés de Elasticsearch. Il peut garantir que les filtres personnalisés sont utilisés dans le corps de la requête.
rank.rrfIl s'agit de la méthode de fusion des rangs réciproques (rrf) pour combiner les résultats de la recherche par mot-clé et de la recherche vectorielle dense.
"_source": {"excludes": ["text_embedding.predicted_value"]}Il exclut le champ vectoriel dense inutile dans les résultats de la recherche.
Utilisation d'une requête imbriquée pour effectuer une recherche dans un champ de texte sémantique
Utilisez la structure suivante pour interroger des documents imbriqués sur un champ de texte sémantique. Cette structure garantit que la recherche fonctionne correctement avec l'intégration de Elasticsearch.
{
"query": {
"nested": {
"path": "semtext.inference.chunks",
"query": {
"sparse_vector": {
"field": "semtext.inference.chunks.embeddings",
"inference_id": ".elser_model_2_linux-x86_64",
"query": "$QUERY"
}
},
"inner_hits": {"_source": {"excludes": ["semtext.inference.chunks.embeddings"]}}
}
},
"_source": false
}
Où :
semtextIl s'agit du nom du champ sémantique. Vous devrez peut-être le mettre à jour si votre champ sémantique a un nom différent. Pour plus d'informations, consultez la section Type de champ de
texte sémantique dans Elasticsearch la documentation.
semtext.inference.chunksIl s'agit du champ qui stocke les morceaux de texte et les enchâssements.
sparse_vectorIl spécifie le type de la requête, dans ce cas, une requête de type sparse_vector. Il s'agit d'un type de requête similaire, mais plus récent que la requête
text_expansion.semtext.inference.chunks.embeddingsIl s'agit du champ qui stocke les enchâssements pour les textes groupés.