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 Icône de redirection vers des pages externes. 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 Icône de redirection vers des pages externes. 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.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 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 Icône de redirection vers des pages externes. 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ù :

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

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 Icône de redirection vers des pages externes. texte sémantique dans Elasticsearch la documentation.

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