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 la documentation d' Elasticsearch.

L'extrait de code suivant montre un exemple de recherche sémantique avec ELSER. Cet exemple utilise une requête booléenne pour trouver les documents qui correspondent à des 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.tokens

Il 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-64

Il 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_2 pour le modèle ELSER v2 ou .elser_model_1 pour le modèle ELSER v1.

  • $QUERY

Il 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.

  • $FILTER

Il s'agit de la variable permettant d'accéder aux filtres personnalisés que vous configurez dans les paramètres avancés d' 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 englobe une autre requête afin de rechercher des champs imbriqués dans votre index « Elasticsearch » lorsque celui-ci 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.

Interrogation de documents externes

L'extrait de code suivant montre un exemple de requête sur les documents externes au sein d'un index Elasticsearch. Dans cet exemple, le document externe est le document principal qui contient les documents passages imbriqués. La nested requête effectue une recherche dans les documents passages imbriqués. Si une correspondance est trouvée parmi les documents imbriqués, la requête renvoie le document externe ainsi que 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
}

Interrogation des documents internes

L'extrait de code suivant montre un exemple d'interrogation des documents internes à l'intérieur des documents imbriqués. Dans cet exemple, le système recherche du texte développé dans des documents imbriqués, applique des filtres et renvoie les documents parents associés aux 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ù :

  • passages

Il 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.tokens

Il 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": false

Il 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.

  • $QUERY

Il 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.

  • $FILTER

Il s'agit de la variable permettant d'accéder aux filtres personnalisés que vous configurez dans les paramètres avancés d' Elasticsearch. Il peut garantir que les filtres personnalisés sont utilisés dans le corps de la requête. Si cette opération est appliquée aux documents externes, seuls les champs externes peuvent être utilisés dans les filtres. S'il est appliqué aux documents internes, seuls les champs internes peuvent être utilisés dans les filtres.

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ù :

  • semtext

Il 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 la documentation d' Elasticsearch.

  • semtext.inference.chunks

Il s'agit du champ qui stocke les morceaux de texte et les enchâssements.

  • sparse_vector

Il 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.embeddings

Il s'agit du champ qui stocke les enchâssements pour les textes groupés.