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.
k-nearest neighbor ( kNN ) ricerca vettoriale densa
Utilizza la ricerca " kNN " per trovare in modo efficiente articoli simili sulla base di rappresentazioni vettoriali, come nel caso della ricerca testuale. Per ulteriori informazioni, consultare la voce " kNN " nella documentazione di " Elasticsearch ".
Il seguente frammento di codice mostra un esempio di ricerca vettoriale densa 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"
}
}
dove:
text_embedding.predicted_value
Si riferisce al campo che memorizza i vettori densi. Potrebbe essere necessario aggiornarlo se si utilizza un campo diverso nell'indice. Per ulteriori informazioni, consultare la sezione "Impostazione degli embedding di testo per la ricerca vettoriale densa" all'indirizzo Elasticsearch.
text_embeddingsottoquery_vector_builder
È l'attività di elaborazione del linguaggio naturale da eseguire. Deve essere text_embedding per la ricerca su kNN.
intfloat__multilingual-e5-small
È l'ID del modello di incorporazione. Potrebbe essere necessario aggiornarlo se si vuole usare un modello di incorporamento diverso.
$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.
Ricerca ibrida con ricerca combinata di parole chiave e ricerca vettoriale densa
Il seguente snippet di codice mostra un esempio di query di ricerca complessa su un indice Elasticsearch, combinando la ricerca testuale tradizionale con la ricerca e il ranking dei k-nearest neighbors ( kNN ):
{
"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"]}
}
dove:
text_embedding.predicted_value
Si riferisce al campo che memorizza i vettori densi. Potrebbe essere necessario aggiornarlo se si utilizza un campo diverso nell'indice.
text_embeddingsottoquery_vector_builder
È l'attività di elaborazione del linguaggio naturale da eseguire. Deve essere text_embedding per la ricerca su kNN.
intfloat__multilingual-e5-small
È l'ID del modello di incorporazione. Potrebbe essere necessario aggiornarlo se si vuole usare un modello di incorporamento diverso.
$QUERY
È la variabile di accesso alla query dell'utente. Può garantire che la query dell'utente venga passata al corpo della query.
$BODY_FIELD_NAMEe$TITLE_FIELD_NAME
Sono le variabili per accedere al campo Corpo e al campo Titolo configurati nell'integrazione di ricerca.
$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.
rank.rrf
Si tratta del metodo di fusione reciproca dei ranghi (rrf) per combinare i risultati della ricerca per parole chiave e della ricerca vettoriale densa.
"_source": {"excludes": ["text_embedding.predicted_value"]}
Esclude il campo vettoriale denso non necessario nei risultati della ricerca.
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.