Configurazione del corpo della query per Elasticsearch

Utilizzare un corpo di query per le query complesse in cui è necessario combinare più criteri di ricerca. La clausola di interrogazione aiuta a decidere se un documento corrisponde a una ricerca per restituire risultati più precisi.

L'integrazione con Elasticsearch utilizza la ricerca per parole chiave, ma è possibile configurare il corpo della query come impostazione avanzata di Elasticsearch nei propri agenti per abilitare tecniche di ricerca più avanzate, come ad esempio:

  • Ricerca semantica con ELSER.

  • ricerca di vettori densi con k-nearest neighbor ( kNN ).

  • Query annidata per cercare documenti annidati.

  • Ricerca ibrida.

  • Ricerca su un campo di testo semantico.

Ricerca semantica con ELSER

Utilizzate la ricerca semantica con ELSER per migliorare l'accuratezza e la pertinenza della ricerca comprendendo il contesto e l'intento alla base delle query degli utenti. Per ulteriori informazioni, consultare la sezione "Ricerca semantica con ELSER" nella documentazione di Elasticsearch.

Il seguente frammento di codice mostra un esempio di ricerca semantica con ELSER. L'esempio utilizza una query booleana per individuare i documenti che corrispondono a combinazioni booleane di altre query.

{
  "query": {
    "bool": {
      "should": [
        {
          "text_expansion": {
            "ml.tokens": {
              "model_id": ".elser_model_2_linux-x86_64",
              "model_text": "$QUERY"
            }
          }
        }
      ],
      "filter": "$FILTER"
    }
  }
}

dove:

  • ml.tokens

Si riferisce al campo che memorizza i token ELSER. Potrebbe essere necessario aggiornarlo se si utilizza un campo diverso nell'indice. Se i token ELSER non sono disponibili, è possibile utilizzare anche il campo che contiene il testo grezzo, ma la qualità della ricerca potrebbe diminuire.

  • .elser_model_2_linux-x86-64

È l'ID del modello per la versione ottimizzata di ELSER v2, da usare se è disponibile nell'installazione di Elasticsearch. Altrimenti, utilizzare .elser_model_2 per il modello ELSER v2 regolare, o .elser_model_1 per ELSER v1.

  • $QUERY

È la variabile di accesso alla query dell'utente. Può garantire che la query dell'utente venga passata al corpo della query.

  • $FILTER

È la variabile che consente di accedere ai filtri personalizzati configurati nelle impostazioni avanzate di Elasticsearch. Può garantire che i filtri personalizzati siano utilizzati nel corpo della query.

Utilizzo di una query annidata per la ricerca di documenti annidati con ELSER

La query annidata racchiude un'altra query per cercare campi annidati all'interno dell'indice di Elasticsearch quando questo contiene documenti annidati. Se viene trovata una corrispondenza, la query restituisce il documento padre principale e i documenti annidati corrispondenti. Quando si applicano i filtri ai risultati della ricerca, si può scegliere di filtrare i documenti padre o i documenti annidati.

Ricerca nei documenti esterni

Il seguente frammento di codice mostra un esempio di interrogazione dei documenti esterni all'interno di un indice Elasticsearch. Nell'esempio, il documento esterno è il documento principale che contiene i documenti passages annidati. La nested query effettua la ricerca all'interno dei documenti passages annidati. Se viene individuata una corrispondenza all'interno dei documenti nidificati, la query restituisce il documento esterno insieme ai documenti nidificati corrispondenti.

{
  "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
}

Ricerca nei documenti interni

Il seguente frammento di codice mostra un esempio di interrogazione dei documenti interni ai documenti annidati. Nell'esempio, il sistema cerca il testo espanso all'interno dei documenti nidificati, applica dei filtri e restituisce i documenti principali con i documenti nidificati corrispondenti, escludendo determinati campi dalla fonte.

{
  "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
}

dove:

  • passages

Si tratta di un campo annidato che memorizza i documenti interni all'interno di un documento padre. Potrebbe essere necessario aggiornarlo se si utilizza un campo nidificato diverso nell'indice.

  • passages.sparse.tokens

Si riferisce al campo che memorizza i token ELSER o il testo grezzo dei documenti interni. Potrebbe essere necessario aggiornarlo se si utilizza un campo nidificato diverso nell'indice. Se i token ELSER non sono disponibili, è possibile utilizzare anche il campo che contiene il testo grezzo, ma la qualità della ricerca potrebbe diminuire.

  • "inner_hits": {"_source": {"excludes": ["passages.sparse"]}}

Esclude i token ELSER dai documenti interni nei risultati della ricerca.

  • "_source": false

Esclude tutti i campi di primo livello nei risultati della ricerca, perché vengono utilizzati solo i documenti interni nei risultati della ricerca.

  • $QUERY

È la variabile di accesso alla query dell'utente. Può garantire che la query dell'utente venga passata al corpo della query.

  • $FILTER

È la variabile che consente di accedere ai filtri personalizzati configurati nelle impostazioni avanzate di Elasticsearch. Può garantire che i filtri personalizzati siano utilizzati nel corpo della query. Se applicato ai documenti esterni, nei filtri sono disponibili solo i campi esterni. Se applicato ai documenti interni, solo i campi interni sono disponibili per l'uso nei filtri.

Utilizzo di una query annidata per la ricerca in un campo di testo semantico

Utilizzare la seguente struttura per interrogare documenti annidati su un campo di testo semantico. Questa struttura garantisce che la ricerca funzioni correttamente con l'integrazione di 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
}

dove:

  • semtext

È il nome del campo semantico. Potrebbe essere necessario aggiornarlo se il campo semantico ha un nome diverso. Per ulteriori informazioni, consultare la sezione "Tipo di campo di testo semantico" nella documentazione di Elasticsearch.

  • semtext.inference.chunks

Si riferisce al campo in cui sono memorizzati i testi e le incorporazioni.

  • sparse_vector

Specifica il tipo di query, in questo caso una query sparse_vector. Si tratta di un tipo di query simile, ma più recente rispetto alla query text_expansion .

  • semtext.inference.chunks.embeddings

Si riferisce al campo che memorizza le incorporazioni per i testi raggruppati.