Configuración del cuerpo de la consulta para Elasticsearch
Utilice un cuerpo de consulta para consultas complejas en las que necesite combinar varios criterios de búsqueda. La cláusula de consulta ayuda a decidir si un documento coincide con una búsqueda para devolver resultados más precisos.
La integración con Elasticsearch utiliza la búsqueda por palabras clave, pero puede configurar el cuerpo de la consulta como un ajuste avanzado de Elasticsearch en sus agentes para habilitar técnicas de búsqueda más avanzadas, como por ejemplo:
- Búsqueda semántica con ELSER.
- búsqueda de vectores densos k-nearest neighbor ( kNN ).
- Consulta anidada para buscar en documentos anidados.
- Búsqueda híbrida.
- Búsqueda en un campo de texto semántico.
Búsqueda semántica con ELSER
Utilice la búsqueda semántica con ELSER para mejorar la precisión y pertinencia de las búsquedas mediante la comprensión del contexto y la intención que subyacen a las consultas de los usuarios. Para obtener más información, consulte Búsqueda semántica con ELSER en Elasticsearch documentación.
El siguiente fragmento de código muestra un ejemplo de búsqueda semántica con ELSER. El ejemplo utiliza una consulta booleana para buscar documentos que coincidan con combinaciones booleanas de otras consultas.
{
"query": {
"bool": {
"should": [
{
"text_expansion": {
"ml.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
}
],
"filter": "$FILTER"
}
}
}
Donde:
ml.tokensSe refiere al campo que almacena los tokens ELSER. Es posible que tenga que actualizarlo si utiliza un campo diferente en su índice. Si los tokens ELSER no están disponibles, también puede utilizar el campo que contiene el texto en bruto, pero la calidad de la búsqueda podría degradarse.
.elser_model_2_linux-x86-64Es el ID del modelo para la versión optimizada de ELSER v2, utilícelo si está disponible en su despliegue de Elasticsearch. En caso contrario, utilice
.elser_model_2para el modelo ELSER normal v2, o.elser_model_1para ELSER v1.$QUERYEs la variable de acceso a la consulta del usuario. Puede garantizar que la consulta del usuario se pasa al cuerpo de la consulta.
$FILTEREs la variable para acceder a los filtros personalizados que se configuran en los ajustes avanzados de Elasticsearch. Puede garantizar que los filtros personalizados se utilicen en el cuerpo de la consulta.
k-nearest neighbor ( kNN ) búsqueda de vectores densos
Utilice kNN la búsqueda para encontrar de manera eficiente elementos similares basados en incrustaciones vectoriales, como la búsqueda de texto. Para obtener más información, consulte kNN buscar en el Elasticsearch documentación.
El siguiente fragmento de código muestra un ejemplo de búsqueda de vectores densos en 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"
}
}
Donde:
text_embedding.predicted_valueSe refiere al campo que almacena los vectores densos. Es posible que tenga que actualizarlo si utiliza un campo diferente en su índice. Para obtener más información, consulte Configuración de incrustaciones de texto para la búsqueda vectorial densa en Elasticsearch.
text_embeddingbajoquery_vector_builderEs la tarea de procesamiento del lenguaje natural que hay que ejecutar. Debe ser
text_embeddingpara la búsqueda kNN.intfloat__multilingual-e5-smallEs el ID del modelo de incrustación. Es posible que tenga que actualizarlo si desea utilizar un modelo de incrustación diferente.
$QUERYEs la variable de acceso a la consulta del usuario. Puede garantizar que la consulta del usuario se pasa al cuerpo de la consulta.
$FILTEREs la variable para acceder a los filtros personalizados que se configuran en los ajustes avanzados de Elasticsearch. Puede garantizar que los filtros personalizados se utilicen en el cuerpo de la consulta.
Utilizar una consulta anidada para buscar en documentos anidados con ELSER
La consulta anidada envuelve otra consulta para buscar campos anidados dentro de su Elasticsearch índice cuando contiene documentos anidados. Si se encuentra una coincidencia, la consulta devuelve el documento raíz padre junto con los documentos anidados coincidentes. Al aplicar filtros a los resultados de la búsqueda, puede optar por filtrar los documentos principales o los documentos anidados.
Consulta de documentos externos
El siguiente fragmento de código muestra un ejemplo de consulta de los documentos externos de un índice Elasticsearch.
En el ejemplo, el documento externo es el documento principal que contiene los documentos anidados passages . La consulta nested busca dentro de los documentos anidados passages .
Si se encuentra una coincidencia dentro de los documentos anidados, la consulta devuelve el documento externo junto con los documentos anidados coincidentes.
{
"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
}
Consulta de documentos internos
El siguiente fragmento de código muestra un ejemplo de consulta de documentos internos dentro de documentos anidados.
En el ejemplo, busca texto expandido dentro de documentos anidados, aplica filtros y devuelve los documentos padre con documentos anidados coincidentes, excluyendo ciertos campos de la fuente.
{
"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
}
Donde:
passagesEs el campo anidado que almacena documentos internos dentro de un documento padre. Es posible que tenga que actualizarlo si utiliza un campo anidado diferente en su índice.
passages.sparse.tokensSe refiere al campo que almacena los tokens ELSER o el texto en bruto de los documentos interiores. Es posible que tenga que actualizarlo si utiliza un campo anidado diferente en su índice. Si los tokens ELSER no están disponibles, también puede utilizar el campo que contiene el texto en bruto, pero la calidad de la búsqueda podría degradarse.
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}Excluye los tokens ELSER de los documentos interiores en los resultados de la búsqueda.
"_source": falseExcluye todos los campos de nivel superior de los resultados de la búsqueda porque sólo se utilizan los documentos interiores de los resultados de la búsqueda.
$QUERYEs la variable de acceso a la consulta del usuario. Puede garantizar que la consulta del usuario se pasa al cuerpo de la consulta.
$FILTEREs la variable para acceder a los filtros personalizados que se configuran en los ajustes avanzados de Elasticsearch. Puede garantizar que los filtros personalizados se utilicen en el cuerpo de la consulta.
Si se aplica a los documentos externos, solo los campos externos estarán disponibles para su uso en los filtros. Si se aplica en los documentos interiores, sólo los campos interiores están disponibles para su uso en los filtros.
Búsqueda híbrida con búsqueda combinada de palabras clave y búsqueda vectorial densa
El siguiente fragmento de código muestra un ejemplo de consulta de búsqueda compleja en un índice Elasticsearch combinando la búsqueda de texto tradicional con una búsqueda y clasificación por 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"]}
}
Donde:
text_embedding.predicted_valueSe refiere al campo que almacena los vectores densos. Es posible que tenga que actualizarlo si utiliza un campo diferente en su índice.
text_embeddingbajoquery_vector_builderEs la tarea de procesamiento del lenguaje natural que hay que realizar. Debe ser
text_embeddingpara la búsqueda kNN.intfloat__multilingual-e5-smallEs el ID del modelo de incrustación. Es posible que tenga que actualizarlo si desea utilizar un modelo de incrustación diferente.
$QUERYEs la variable de acceso a la consulta del usuario. Puede garantizar que la consulta del usuario se pasa al cuerpo de la consulta.
$BODY_FIELD_NAMEy$TITLE_FIELD_NAMESon las variables para acceder al campo Cuerpo y al campo Título configurados en la integración de Búsqueda.
$FILTEREs la variable para acceder a los filtros personalizados que se configuran en los ajustes avanzados de Elasticsearch. Puede garantizar que los filtros personalizados se utilicen en el cuerpo de la consulta.
rank.rrfSe trata del método de fusión de rango recíproco (rrf) para combinar los resultados de la búsqueda por palabras clave y la búsqueda vectorial densa.
"_source": {"excludes": ["text_embedding.predicted_value"]}Excluye el campo vectorial denso innecesario en los resultados de la búsqueda.
Utilizar una consulta anidada para buscar en un campo de texto semántico
Utilice la siguiente estructura para consultar documentos anidados en un campo de texto semántico. Esta estructura garantiza que la búsqueda funcione correctamente con la integración 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
}
Donde:
semtextEs el nombre del campo semántico. Es posible que tenga que actualizarlo si su campo semántico tiene un nombre diferente. Para obtener más información, consulte Tipo de campo de texto
semántico en Elasticsearch la documentación.
semtext.inference.chunksSe refiere al campo que almacena los textos troceados y las incrustaciones.
sparse_vectorEspecifica el tipo de consulta, en este caso, una consulta sparse_vector. Se trata de un tipo de consulta similar, pero más reciente, a la consulta
text_expansion.semtext.inference.chunks.embeddingsSe refiere al campo que almacena las incrustaciones de los textos fragmentados.