TairSearch es un módulo de búsqueda de texto completo integrado en Tair (compatible con Redis OSS). Utiliza una sintaxis de consulta similar a la de Elasticsearch y ofrece un rendimiento de escritura y búsqueda en el orden de milisegundos.
Descripción general
TairSearch proporciona las siguientes capacidades:
Baja latencia y alto rendimiento: Escritura y búsqueda de texto completo en milisegundos, impulsadas por el motor en memoria de Tair. Para más detalles, consulte TairSearch performance whitepaper.
Actualizaciones incrementales y parciales: Permite agregar, actualizar, eliminar e incrementar automáticamente campos individuales de documentos sin necesidad de reescribirlos por completo.
Sintaxis de consulta similar a Elasticsearch: Query DSL basado en JSON compatible con
bool,match,term, paginación y ordenamiento; resulta familiar para desarrolladores con experiencia en Elasticsearch.Agregación: Agregaciones de
terms, métricas yfilterpara realizar análisis sobre los resultados de búsqueda. Consulte Aggregations.Autocompletado: Coincidencia difusa basada en prefijos para experiencias de búsqueda mientras se escribe.
Analizadores integrados y personalizados: Analizadores integrados para inglés (
standard,stop), chino (jieba,IK) y otros idiomas. También se admiten analizadores personalizados con diccionarios y palabras vacías definidos por el usuario. Para más detalles, consulte Search analyzers.Consulta de índice fragmentado: Búsqueda en varios índices fragmentados mediante
TFT.MSEARCHcon obtención de resultados agregados.Compresión de documentos: Compresión de documentos almacenados para reducir el uso de memoria. Deshabilitada de forma predeterminada.
Caché de consultas: Almacenamiento en caché de resultados de consultas recientes para mejorar el rendimiento en datos de acceso frecuente.
Requisitos previos
La instancia debe ser una Tair memory-optimized instance (basada en DRAM) que ejecute una de las siguientes versiones:
|
Engine version |
Minimum minor version |
|
Compatible con Redis 5.0 |
1.7.27 o posterior |
|
Compatible con Redis 6.0 |
6.2.4.1 o posterior |
|
Compatible con Redis 7.0 |
Todas las versiones menores |
Actualice la instancia a la versión menor más reciente para obtener la mayor cantidad de funciones y la máxima estabilidad. Para obtener instrucciones, consulte Upgrade minor and proxy versions . En instancias de clúster o con división de lectura/escritura, actualice también los nodos proxy a la versión menor más reciente para garantizar que todos los comandos funcionen correctamente.
Notas de la versión
Instancias basadas en DRAM compatibles con Redis 5.0
|
Date |
Version |
Changes |
|
2022-03-11 |
V1.7.27 |
Lanzamiento de TairSearch |
|
2022-05-24 |
V1.8.5 |
Función de agregación |
|
2022-09-06 |
V5.0.15 |
Comando |
|
2023-01-13 |
V5.0.25 |
Analizadores |
|
2023-03-15 |
V5.0.28 |
Caché de consultas, compresión de documentos, comando |
|
2023-06-12 |
V5.0.35 |
Tipo de dato ARRAY, algoritmo de similitud Okapi BM25 |
Instancias basadas en DRAM compatibles con Redis 6.0
|
Date |
Version |
Changes |
|
2023-02-07 |
V6.2.4.1 |
TairSearch (todas las funciones de V5.0.25) |
|
2023-03-14 |
V6.2.5.0 |
Caché de consultas, compresión de documentos, |
|
2023-06-12 |
V6.2.7.3 |
Tipo de dato ARRAY, Okapi BM25 (todas las funciones de V5.0.35) |
|
2023-12-21 |
V23.12.1.2 |
Comando |
Instancias basadas en DRAM compatibles con Redis 7.0
|
Date |
Version |
Changes |
|
2024-07-22 |
V24.7.0.0 |
Compatibilidad con TairSearch |
Mejores prácticas
Notas de uso
Los datos de TairSearch se almacenan en la instancia de Tair y consumen memoria de dicha instancia.
-
Para reducir el uso de memoria:
Establezca
indexentruesolo para los campos que deban ser buscables. Establezcaindexenfalsepara los demás campos.Utilice
_sourcecon patronesincludes/excludespara almacenar únicamente los campos del documento que necesite.Elija un analizador adecuado para evitar tokenizaciones innecesarias y un mayor consumo de memoria.
Habilite la compresión de documentos cuando estos sean grandes.
Mantenga el número de documentos por índice dentro de los 5 millones. Esto evita el desequilibrio de datos en instancias de clúster, equilibra las solicitudes de lectura y escritura, y reduce la presencia de claves grandes y claves de acceso frecuente. Divida conjuntos de datos grandes en varios índices y utilice
TFT.MSEARCHpara consultarlos de forma conjunta.
Convenciones de sintaxis
|
Convention |
Meaning |
|
|
|
Palabra clave del comando |
|
|
cursiva |
Variable |
|
|
|
Parámetro opcional. Los parámetros sin corchetes son obligatorios. |
|
|
`A\ |
B` |
Parámetros mutuamente excluyentes. Especifique solo uno. |
|
|
El parámetro anterior puede repetirse. |
Comandos de búsqueda de texto completo
TFT.CREATEINDEX
Crea un índice con una definición de mapeo. La sintaxis de mapeo es similar al mapeo explícito de Elasticsearch. Debe crearse un índice antes de poder agregar documentos.
Sintaxis
TFT.CREATEINDEX index mappings [settings]
Para evitar claves grandes, divida los índices extensos en índices más pequeños conmappingsysettingsidénticos, y consúltelos de forma conjunta medianteTFT.MSEARCH.
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice que se va a crear. |
|
mappings |
Sí |
Definición de mapeo en formato JSON. Consulte Opciones de mapeo. |
|
settings |
No |
Configuración del índice en formato JSON. Consulte Configuración del índice. |
Opciones de mapeo
El objeto mappings admite los siguientes campos de nivel superior:
dynamic
Modo de mapeo. Valores válidos:
"strict"-- Solo se pueden escribir datos en campos definidos enproperties. La escritura en campos no definidos falla.No especificado (predeterminado) -- Modo no estricto. El sistema no comprueba si los campos escritos están definidos en
properties.
enabled
Controla la validación de tipos para campos no indexados (index establecido en false). Valores válidos: true (predeterminado) y false. Cuando es true, la escritura falla si el tipo del campo no coincide con el definido en properties. Los campos indexados siempre se validan independientemente de esta configuración.
_source
Controla si se almacena el documento original. Esta configuración no afecta la creación del índice.
enabled--true(predeterminado) almacena el documento original.falseno lo almacena.includes-- Matriz de patrones de nombres de campo que se deben incluir. Se admiten comodines.excludes-- Matriz de patrones de nombres de campo que se deben excluir. Se admiten comodines. Si un campo coincide tanto conincludescomo conexcludes,excludestiene prioridad (el campo no se almacena).
Ejemplos:
"_source": {"enabled": true}
Este es el valor predeterminado: almacena todos los campos. Equivale a "_source": {"enabled": true, "excludes": [], "includes": []}.
"_source": {"enabled": true, "excludes": [], "includes": ["id", "name"]}
Almacena únicamente los campos id y name.
properties
Conjunto de definiciones de campos. Cada campo admite los siguientes atributos:
|
Attribute |
Description |
Default |
|
|
Tipo de dato. Consulte Tipos de campo. |
Obligatorio |
|
|
Indica si este campo está indexado (es buscable). |
|
|
|
Peso del campo para la puntuación. Número de punto flotante positivo. |
|
|
|
Algoritmo de similitud: |
|
Tipos de campo
|
Type |
Description |
Type-specific options |
|
|
Cadena que no se tokeniza. Adecuada para consultas de coincidencia exacta. |
|
|
|
Cadena que se tokeniza mediante un analizador antes de la indexación. |
|
|
|
Entero de 64 bits. Adecuado para marcas de tiempo (época Unix). |
-- |
|
|
Entero de 32 bits. |
-- |
|
|
Número de punto flotante de 64 bits. No se admiten |
-- |
Compatibilidad con ARRAY: Todos los tipos de campo admiten variantes de matriz. Agregue [] al nombre del tipo. Por ejemplo, keyword[] declara una matriz de palabras clave.
TFT.CREATEINDEX idx:products '{"mappings":{"properties":{"tags":{"type":"keyword[]"}}}}'
Opciones de analizador de texto
|
Option |
Description |
Default |
|
|
Analizador utilizado para la indexación. Consulte Built-in analyzers. También se pueden especificar analizadores personalizados, configurados mediante la sección |
|
|
|
Analizador utilizado durante la búsqueda. Mismos valores válidos que |
Igual que |
Analizadores integrados
standard (predeterminado), jieba (recomendado para chino, funciona mejor que chinese), stop, IK, pattern, whitespace, simple, keyword, chinese, french, dutch, russian.
Para más detalles, consulte Built-in analyzers.
Configuración del índice
El objeto opcional settings admite los siguientes campos:
analysis
Define analizadores personalizados. Para más detalles, consulte Custom analyzers.
index
Configura algoritmos de similitud personalizados. Utilícelo para personalizar los parámetros de Okapi BM25:
|
Parameter |
Description |
Default |
Valid values |
|
|
Controla cuánto afecta la frecuencia del término a la puntuación. Valores más altos aumentan el efecto. |
|
Mayor que |
|
|
Controla cuánto afecta la longitud del documento a la puntuación. Valores más altos aumentan el efecto. |
|
De |
Ejemplo:
TFT.CREATEINDEX idx:products '{"mappings":{"properties":{"name":{"type":"keyword","similarity":"my_bm25"}}},"settings":{"index":{"similarity":{"my_bm25":{"type":"BM25","k1":1.0,"b":1.0}}}}}'
queries_cache
Configura la caché de resultados de consulta. De forma predeterminada, la caché almacena hasta 10,000 resultados sin límite de memoria. Cuando está llena, los resultados se desalojan mediante el algoritmo Least Recently Used (LRU).
|
Parameter |
Type |
Description |
Default |
|
|
STRING |
Memoria máxima para todas las cachés de consultas. Admite unidades |
Sin límite |
|
|
INTEGER |
Tiempo de vida (TTL) de los resultados en caché, en segundos. |
|
Ejemplo:
"settings": {"queries_cache": {"size": "100mb", "ttl": 3}}
queries_cachees un parámetro a nivel de nodo. Configurar este parámetro en un índice afecta a todos los demás índices del mismo proceso. Utilice la misma configuración dequeries_cacheen todos los índices.
compress_doc
Configura la compresión transparente de documentos. Habilitar la compresión aumenta el consumo de CPU y la latencia de lectura/escritura. Habilite esta opción solo cuando el índice sea grande (kilobytes o más) y el costo de almacenamiento sea la principal preocupación.
|
Parameter |
Type |
Description |
Default |
|
|
STRING |
Umbral de compresión. Los documentos se comprimen solo cuando alcanzan este tamaño. Admite unidades |
|
|
|
BOOLEAN |
Indica si se habilita la compresión. |
|
Ejemplo:
"settings": {"compress_doc": {"size": "1kb", "enable": true}}
La compresión se aplica únicamente a los documentos escritos o actualizados después de habilitar la configuración mediante TFT.UPDATEINDEX . Los documentos existentes no se comprimen retroactivamente.
Valor de retorno
En caso de éxito:
OKEn caso de fallo: Un mensaje de error
Ejemplo
TFT.CREATEINDEX idx:product '{"mappings":{"_source":{"enabled":true},"properties":{"product_id":{"type":"keyword","ignore_above":128},"product_name":{"type":"text"},"product_title":{"type":"text","analyzer":"jieba"},"price":{"type":"double"}}}}'
OK
Consulte también: TFT.UPDATEINDEX, TFT.GETINDEX
TFT.UPDATEINDEX
Agrega nuevos campos al mapeo de un índice o modifica su configuración.
Sintaxis
TFT.UPDATEINDEX index mappings [settings]
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
mappings |
Sí |
Nuevos campos de |
|
settings |
No |
Configuración modificada del índice. Solo se pueden modificar |
Para consultar la sintaxis completa de mappings y settings, consulte TFT.CREATEINDEX.
Valor de retorno
En caso de éxito:
OKEn caso de fallo: Un mensaje de error
Ejemplo
TFT.UPDATEINDEX idx:product '{"mappings":{"properties":{"product_group":{"type":"text","analyzer":"chinese"}}}}'
OK
Consulte también: TFT.CREATEINDEX, TFT.GETINDEX
TFT.GETINDEX
Recupera el mapeo y la configuración de un índice.
Sintaxis
TFT.GETINDEX index
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
Valor de retorno
En caso de éxito: Contenido de mapeo del índice en formato JSON
En caso de fallo: Un mensaje de error
Ejemplo
TFT.GETINDEX idx:product
{"idx:product0310":{"mappings":{"_source":{"enabled":true,"excludes":[],"includes":["product_id"]},"dynamic":"false","properties":{"price":{"boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"double"},"product_id":{"boost":1.0,"enabled":true,"ignore_above":128,"index":true,"similarity":"classic","type":"keyword"},"product_name":{"boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"text"},"product_title":{"analyzer":"chinese","boost":1.0,"enabled":true,"ignore_above":-1,"index":true,"similarity":"classic","type":"text"}}}}}
Consulte también: TFT.CREATEINDEX, TFT.UPDATEINDEX
TFT.ADDDOC
Agrega un solo documento a un índice.
Sintaxis
TFT.ADDDOC index document [WITH_ID doc_id]
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
document |
Sí |
Documento JSON. Los valores de los campos deben coincidir con los tipos de datos definidos en el mapeo. |
|
|
No |
ID personalizado del documento (cadena). Si se omite, se genera un ID automáticamente. Si el ID especificado ya existe, se sobrescribe el documento existente. |
Si_sourceestá configurado conincludes, solo se almacenan los campos listados enincludesal agregar o actualizar un documento.
Valor de retorno
En caso de éxito: Un objeto JSON que contiene el ID del documento, por ejemplo,
{"_id":"00001"}En caso de fallo: Un mensaje de error
Ejemplos
Agregar un documento con un ID personalizado:
TFT.ADDDOC idx:product '{"product_id":"product test"}' WITH_ID 00001
{"_id":"00001"}
Agregar un documento con un campo de matriz:
TFT.ADDDOC idx:product '{"product_id":["an","2","3df"]}' WITH_ID 00001
Consulte también: TFT.MADDDOC, TFT.UPDATEDOCFIELD, TFT.DELDOC
TFT.MADDDOC
Agrega varios documentos a un índice en una sola operación atómica. Si algún documento tiene un formato no válido, no se agrega ninguno.
Sintaxis
TFT.MADDDOC index document doc_id [document1 doc_id1] ...
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
document |
Sí |
Documento JSON. Los valores de los campos deben coincidir con los tipos de datos definidos en el mapeo. |
|
doc_id |
Sí |
ID del documento (cadena). |
Si_sourceestá configurado conincludes, solo se almacenan los campos listados enincludesal agregar o actualizar un documento.
Valor de retorno
En caso de éxito:
OKEn caso de fallo: Un mensaje de error
Ejemplo
TFT.MADDDOC idx:product '{"product_id":"test1"}' 00011 '{"product_id":"test2"}' 00012
OK
Consulte también: TFT.ADDDOC, TFT.DELDOC
TFT.UPDATEDOCFIELD
Actualiza campos específicos en un documento. Si el documento no existe, se crea (equivale a TFT.ADDDOC). Si un campo no existe, se agrega.
Sintaxis
TFT.UPDATEDOCFIELD index doc_id document
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
doc_id |
Sí |
ID del documento que se va a actualizar. |
|
document |
Sí |
Objeto JSON que contiene los campos por actualizar. Los campos indexados deben coincidir con los tipos de datos definidos en el mapeo. Los campos no indexados pueden ser de cualquier tipo. |
Si_sourceestá configurado conincludes, solo se almacenan los campos listados enincludesal agregar o actualizar un documento.
Valor de retorno
En caso de éxito:
OKEn caso de fallo: Un mensaje de error
Ejemplo
TFT.UPDATEDOCFIELD idx:product 00011 '{"product_id":"test8","product_group":"BOOK"}'
OK
Consulte también: TFT.ADDDOC, TFT.DELDOCFIELD
TFT.DELDOCFIELD
Elimina uno o más campos de un documento. Si el campo está indexado, también se quita su entrada en el índice.
Sintaxis
TFT.DELDOCFIELD index doc_id field [field1 field2 ...]
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
doc_id |
Sí |
ID del documento. |
|
field |
Sí |
Uno o más nombres de campos por eliminar. |
La operación falla si el campo especificado no existe en el documento (por ejemplo, un campo filtrado por _source ).
Valor de retorno
En caso de éxito: Número de campos eliminados (entero)
En caso de fallo: Un mensaje de error
Ejemplo
TFT.DELDOCFIELD idx:product 00011 product_group
(integer) 1
Consulte también: TFT.UPDATEDOCFIELD
TFT.INCRLONGDOCFIELD
Incrementa un campo entero en un documento. El campo debe ser de tipo LONG o INTEGER. No se admite el tipo de dato ARRAY.
Sintaxis
TFT.INCRLONGDOCFIELD index doc_id field increment
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
doc_id |
Sí |
ID del documento. |
|
field |
Sí |
Campo por incrementar. Debe ser de tipo |
|
increment |
Sí |
Valor de incremento. Puede ser un entero positivo o negativo. |
Si el documento no existe, se crea automáticamente con el campo inicializado en0antes de aplicar el incremento. La operación falla si el campo no existe en el documento (por ejemplo, un campo filtrado por_source).
Valor de retorno
En caso de éxito: Valor actualizado del campo (entero)
En caso de fallo: Un mensaje de error
Ejemplo
TFT.INCRLONGDOCFIELD idx:product 00011 stock 100
(integer)100
Consulte también: TFT.INCRFLOATDOCFIELD, TFT.UPDATEDOCFIELD
TFT.INCRFLOATDOCFIELD
Incrementa un campo de punto flotante en un documento. El campo debe ser de tipo DOUBLE. No se admite el tipo de dato ARRAY.
Sintaxis
TFT.INCRFLOATDOCFIELD index doc_id field increment
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
doc_id |
Sí |
ID del documento. |
|
field |
Sí |
Campo por incrementar. Debe ser de tipo |
|
increment |
Sí |
Valor de incremento. Puede ser un número de punto flotante positivo o negativo. |
Si el documento no existe, se crea automáticamente con el campo inicializado en0antes de aplicar el incremento. La operación falla si el campo no existe en el documento (por ejemplo, un campo filtrado por_source).
Valor de retorno
En caso de éxito: Valor actualizado del campo (cadena)
En caso de fallo: Un mensaje de error
Ejemplo
TFT.INCRFLOATDOCFIELD idx:product 00011 stock 299.6
"299.6"
Consulte también: TFT.INCRLONGDOCFIELD, TFT.UPDATEDOCFIELD
TFT.GETDOC
Recupera un documento por su ID.
Sintaxis
TFT.GETDOC index doc_id
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
doc_id |
Sí |
ID del documento. |
Valor de retorno
En caso de éxito: Un objeto JSON con el ID y el contenido del documento
En caso de fallo: Un mensaje de error
Ejemplo
TFT.GETDOC idx:product 00011
{"_id":"00011","_source":{"product_id":"test8"}}
Consulte también: TFT.EXISTS, TFT.SEARCH
TFT.EXISTS
Comprueba si un documento existe en un índice.
Sintaxis
TFT.EXISTS index doc_id
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
Nombre del índice. |
|
doc_id |
Sí |
ID del documento. |
Valor de retorno
1si el documento existe0si el índice o el documento no existenEn caso de fallo: Un mensaje de error
Ejemplo
TFT.EXISTS idx:product 00011
(integer) 1
Consulte también: TFT.GETDOC, TFT.DOCNUM
TFT.DOCNUM
Obtiene la cantidad de documentos en un índice.
Sintaxis
TFT.DOCNUM index
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
Valor de retorno
En caso de éxito: el recuento de documentos (entero)
En caso de error: un mensaje de error
Ejemplo
TFT.DOCNUM idx:product
(integer) 3
Consulte también: TFT.EXISTS, TFT.SCANDOCID
TFT.SCANDOCID
Explora los ID de documentos en un índice mediante un cursor, de forma similar al comando SCAN de Redis.
Sintaxis
TFT.SCANDOCID index cursor [MATCH *value*] [COUNT count]
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
|
cursor |
Sí |
La posición del cursor. Use |
|
|
No |
Un patrón de estilo glob para filtrar los ID de documentos. Ejemplo: |
|
|
No |
El número máximo de elementos que se devuelven por exploración. Valor predeterminado: |
Valor de retorno
Un arreglo de dos elementos:
El cursor para la siguiente iteración.
0indica que la exploración finalizó.Un arreglo con los ID de documentos.
Ejemplo
TFT.SCANDOCID idx:product 0 COUNT 3
1) "0"
2) 1) "00001"
2) "00011"
3) "00012"
Consulte también: TFT.DOCNUM, TFT.GETDOC
TFT.DELDOC
Elimina uno o más documentos de un índice según su ID de documento.
Sintaxis
TFT.DELDOC index doc_id [doc_id] ...
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
|
doc_id |
Sí |
Uno o más ID de documentos para eliminar. |
Valor de retorno
En caso de éxito: la cantidad de documentos eliminados realmente (cadena). Los ID inexistentes se ignoran.
En caso de error: un mensaje de error
Ejemplo
TFT.DELDOC idx:product 00011 00014
"1" # Document 00014 does not exist, so only document 00011 is deleted.
Consulte también: TFT.DELALL, TFT.ADDDOC
TFT.DELALL
Elimina todos los documentos de un índice y conserva tanto el índice como su asignación.
Sintaxis
TFT.DELALL index
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
Valor de retorno
En caso de éxito:
OKEn caso de error: un mensaje de error
Ejemplo
TFT.DELALL idx:product
OK
Consulte también: TFT.DELDOC, DEL
TFT.ANALYZER
Prueba cómo tokeniza un analizador un texto determinado.
Sintaxis
TFT.ANALYZER analyzer_name text [INDEX index_name] [SHOW_TIME]
Parámetros
|
Parameter |
Required |
Description |
|
analyzer_name |
Sí |
El nombre de un analizador integrado o personalizado. |
|
text |
Sí |
El texto que se va a tokenizar. Debe tener codificación UTF-8. |
|
|
Condicional |
El índice que contiene la definición del analizador. Es obligatorio cuando se usa un analizador personalizado o un analizador integrado con palabras vacías o diccionarios modificados. |
|
|
No |
Incluye la duración de la tokenización en la salida, expresada en microsegundos. La primera ejecución con un diccionario grande (por ejemplo, Jieba, IK) puede tardar varios segundos debido a la carga del diccionario. |
Valor de retorno
En caso de éxito: un objeto JSON con los detalles de los tokens
En caso de error: un mensaje de error
Ejemplo
TFT.ANALYZER standard "Tair is a nosql database"
{
"tokens": [
{"token": "Tair", "start_offset": 0, "end_offset": 4, "position": 0},
{"token": "nosql", "start_offset": 10, "end_offset": 15, "position": 3},
{"token": "database", "start_offset": 16, "end_offset": 24, "position": 4}
]
}
DEL (Redis nativo)
Use el comando DEL nativo de Redis para eliminar una o más claves de TairSearch (índices).
DEL key [key ...]
Para obtener más información, consulte la referencia del comando DEL.
TFT.SEARCH
Busca documentos en un índice mediante Query DSL.
Sintaxis
TFT.SEARCH index query
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
|
query |
Sí |
Una instrucción JSON de Query DSL. Consulte las secciones siguientes para ver la sintaxis completa. |
La sintaxis de la consulta es similar a Elasticsearch Query DSL.
Valor de retorno
En caso de éxito, devuelve un objeto JSON con los resultados de la búsqueda:
{
"hits": {
"hits": [
{"_id": "...", "_index": "...", "_score": 1.0, "_source": {...}}
],
"max_score": 1.0,
"total": {
"relation": "eq",
"value": 3
}
}
}
El campo total.relation indica cómo se relaciona el recuento con total.value:
"eq"-- El recuento es exacto."gte"-- El recuento es como mínimo este valor (cuandotrack_total_hitsesfalse).
Ejemplo
TFT.SEARCH idx:product '{"sort":[{"price":{"order":"desc"}}]}'
{"hits":{"hits":[{"_id":"fruits_3","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_3","product_name":"orange","price":30.2,"stock":3000}},{"_id":"fruits_2","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_2","product_name":"banana","price":24.0,"stock":2000}},{"_id":"fruits_1","_index":"idx:product","_score":1.0,"_source":{"product_id":"fruits_1","product_name":"apple","price":19.5,"stock":1000}}],"max_score":1.0,"total":{"relation":"eq","value":3}}}
Consulte también: TFT.MSEARCH, TFT.EXPLAINCOST, TFT.EXPLAINSCORE
Tipos de consulta
El campo query en Query DSL admite los siguientes tipos de consulta.
Ordenamiento
Utilice el campo sort para controlar el orden de los resultados. El tipo de datos ARRAY no es compatible con el ordenamiento.
|
Value |
Description |
|
|
Ordena por puntuación de relevancia en orden descendente. |
|
|
Ordena por ID de documento en orden ascendente. |
|
field_name |
Ordena por un campo específico en orden ascendente. El campo debe estar indexado ( |
Para ordenar por varios campos, utilice un arreglo. Controle la dirección del ordenamiento con order ("desc" o "asc"):
{"sort": [{"price": {"order": "desc"}}, {"_doc": {"order": "desc"}}]}
Filtrado de origen
Utilice el campo _source para controlar qué campos del documento aparecen en los resultados:
{"_source": {"includes": ["f0"]}}
Es compatible con includes y excludes mediante patrones de comodines.
Paginación
|
Parameter |
Type |
Description |
Default |
|
|
INTEGER |
El desplazamiento basado en cero del primer resultado que se devolverá. |
|
|
|
INTEGER |
El número máximo de resultados que se devolverán. Valores válidos: de |
|
El uso conjunto defromysizepermite la paginación. El rendimiento de la consulta disminuye a medida que aumentafrom.
track_total_hits
Controla si se cuentan todos los documentos coincidentes para consultas term, terms o match (también se admiten consultas compuestas, pero la coincidencia difusa dentro de match se deshabilita).
|
Value |
Behavior |
|
|
Devuelve únicamente los primeros 100 documentos ordenados por puntuación. |
|
|
Cuenta todos los documentos coincidentes. |
Establecer track_total_hits en true cuando hay una gran cantidad de documentos coincidentes puede provocar consultas lentas. Utilícelo con precaución.
TFT.MSEARCH
Realiza búsquedas en varios índices que comparten asignaciones y configuraciones idénticas; luego agrega y devuelve los resultados combinados.
Sintaxis
TFT.MSEARCH index_count index [index1] ... query
Parámetros
|
Parameter |
Required |
Description |
|
index_count |
Sí |
La cantidad de índices en los que se buscará. Valores válidos: de |
|
index |
Sí |
Uno o más nombres de índices. Todos los índices deben tener |
|
query |
Sí |
Una instrucción JSON de Query DSL. Admite |
TFT.MSEARCHno admite el parámetrofrom. En su lugar, utilice la paginación basada en cursores (consulte a continuación).
Paginación basada en cursores
Utilice size, reply_with_keys_cursor y keys_cursor de forma conjunta para la paginación:
|
Parameter |
Type |
Description |
Default |
|
|
INTEGER |
Cantidad de resultados que se devolverán por página. |
|
|
|
BOOLEAN |
Incluye las posiciones del cursor en la respuesta. |
|
|
|
OBJECT |
Posiciones del cursor de la consulta anterior. Utilice |
|
Funcionamiento:
Primera consulta: Establezca
reply_with_keys_cursorentruey omitakeys_cursor(o establézcalo en0). Tair recuperasizedocumentos de cada índice; luego recopila, puntúa, ordena y agrega los resultados combinados, y devuelve los mejoressizedocumentos. La respuesta incluye las posiciones dekeys_cursorpara cada índice.Siguiente consulta: Pase el valor de
keys_cursordevuelto en la respuesta anterior. Tair continúa la recuperación desde las posiciones del cursor en cada índice.
Comportamiento de agregación
TFT.MSEARCH agrega conjuntos de resultados secundarios de cada índice en lugar de agregar el conjunto de datos combinado:
Rate and sort: Puntúa y ordena los conjuntos de resultados secundarios.
sum, max, min, avg, value_count: Realiza agregaciones en todos los conjuntos de resultados secundarios.
sum_of_squares, variance, std_deviation: Calcula promedios en todos los conjuntos de resultados secundarios.
Terms aggregation y filter aggregation: Realiza agregaciones por separado en todos los conjuntos de resultados secundarios.
Valor de retorno
En caso de éxito, devuelve un objeto JSON similar a la salida de TFT.SEARCH, además de un campo aux_info:
{
"aux_info": {
"index_crc64": 15096806844241479487,
"keys_cursor": {"key0": 2, "key1": 5, "key2": 3},
"field_type": {"f0": "long"}
}
}
|
Field |
Description |
|
|
Hash CRC-64 de las asignaciones y configuraciones. Puede ignorarse en solicitudes de negocio. |
|
|
Posiciones del cursor para la siguiente consulta paginada. Se incluye únicamente cuando |
|
|
Tipos de datos de los campos ordenados. Se incluye únicamente cuando se ordena por un campo del índice. |
Ejemplo
Configure tres índices con la misma asignación:
TFT.CREATEINDEX key0 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.CREATEINDEX key1 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.CREATEINDEX key2 '{"mappings":{"properties":{"f0":{"type":"long"}}}}'
TFT.ADDDOC key0 '{"f0":120}'
TFT.ADDDOC key0 '{"f0":130}'
TFT.ADDDOC key1 '{"f0":140}'
TFT.ADDDOC key1 '{"f0":150}'
TFT.ADDDOC key2 '{"f0":160}'
TFT.ADDDOC key2 '{"f0":170}'
Primera página:
TFT.MSEARCH 3 key0 key1 key2 '{"size":2,"query":{"range":{"f0":{"gt":120,"lte":170}}},"sort":[{"f0":{"order":"desc"}}],"reply_with_keys_cursor":true}'
{"hits":{"hits":[{"_id":"16625439765504840","_index":"key2","_score":1.0,"_source":{"f0":170}},{"_id":"16625439741096630","_index":"key2","_score":1.0,"_source":{"f0":160}}],"max_score":1.0,"total":{"relation":"eq","value":5}},"aux_info":{"index_crc64":10084399559244916810,"keys_cursor":{"key0":0,"key1":0,"key2":2}}}
Segunda página (pase el valor de keys_cursor de la respuesta anterior):
TFT.MSEARCH 3 key0 key1 key2 '{"size":2,"query":{"range":{"f0":{"gt":120,"lte":170}}},"sort":[{"f0":{"order":"desc"}}],"reply_with_keys_cursor":true,"keys_cursor":{"key0":0,"key1":0,"key2":2}}'
{"hits":{"hits":[{"_id":"16625439652681160","_index":"key1","_score":1.0,"_source":{"f0":150}},{"_id":"16625439624704580","_index":"key1","_score":1.0,"_source":{"f0":140}}],"max_score":1.0,"total":{"relation":"eq","value":5}},"aux_info":{"index_crc64":10084399559244916810,"keys_cursor":{"key0":0,"key1":2,"key2":2}}}
Consulte también: TFT.SEARCH
TFT.EXPLAINCOST
Recupera el desglose del tiempo de ejecución de una consulta.
Sintaxis
TFT.EXPLAINCOST index query
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
|
query |
Sí |
Una instrucción de Query DSL (misma sintaxis que |
Valor de retorno
Un objeto JSON con las siguientes secciones:
|
Section |
Description |
|
|
Tiempo de ejecución de la consulta en microsegundos ( |
|
|
Tiempo de agregación en microsegundos. Se omite si no se especifica ninguna agregación. |
|
|
Tiempo dedicado a recopilar y ordenar resultados, en microsegundos, además del tipo de colector: |
Ejemplo
TFT.EXPLAINCOST idx:product '{"sort":[{"price":{"order":"desc"}}]}'
{
"QUERY_COST": {
"query": "MATCHALL_QUERY",
"doc_num": 1,
"time_cost_us": 2
},
"COLLECTOR_COST": {
"collector_type": "CustomSortCollector",
"time_cost_us": 20
}
}
Consulte también: TFT.SEARCH, TFT.EXPLAINSCORE
TFT.EXPLAINSCORE
Recupera desgloses detallados de la puntuación de los resultados de búsqueda y muestra cómo se calculan las puntuaciones de los documentos.
Disponible únicamente para instancias basadas en DRAM compatibles con Redis 6.0 o posterior.
Sintaxis
TFT.EXPLAINSCORE index query [doc_id] ...
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
|
query |
Sí |
Una instrucción de Query DSL (misma sintaxis que |
|
doc_id |
No |
Uno o más ID de documentos. Cuando se especifican, solo estos documentos se incluyen en la salida. |
Valor de retorno
El mismo conjunto de resultados que TFT.SEARCH, además de un objeto _explanation para cada documento que contiene:
|
Field |
Description |
|
|
La puntuación del documento. |
|
|
La fórmula utilizada para calcular la puntuación. |
|
|
El campo del documento que coincide con los términos de la consulta. |
|
|
El término de la consulta encontrado en el documento. |
|
|
El peso de puntuación aplicado a esta cláusula de consulta. |
|
|
Metadatos y el proceso de puntuación paso a paso. |
Ejemplo
TFT.EXPLAINSCORE today_shares '{"query":{"wildcard":{"shares_name":{"value":"*BY"}}}}'
{
"hits": {
"hits": [
{
"_id": "17036492095306830",
"_index": "today_shares",
"_score": 1.0,
"_source": {
"shares_name": "YBY",
"logictime": 14300410,
"purchase_type": 1,
"purchase_price": 11.1,
"purchase_count": 100,
"investor": "Mila"
},
"_explanation": {
"score": 1.0,
"description": "score, computed as query_boost",
"field": "shares_name",
"term": "*BY",
"query_boost": 1.0
}
}
],
"max_score": 1.0,
"total": {"relation": "eq", "value": 1}
}
}
Consulte también: TFT.SEARCH, TFT.EXPLAINCOST
Comandos de autocompletado
TFT.ADDSUG
Agrega una o más entradas de texto de autocompletado con sus pesos asociados.
Sintaxis
TFT.ADDSUG index text weight [text weight] ...
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
|
text |
Sí |
La entrada de texto de autocompletado. |
|
weight |
Sí |
El peso de puntuación (entero positivo). Los pesos más altos obtienen una mejor posición en los resultados. |
Valor de retorno
En caso de éxito: el número de entradas de texto agregadas (entero)
En caso de fallo: un mensaje de error
Ejemplo
TFT.ADDSUG idx:redis 'redis is a memory database' 3 'redis cluster' 10
(integer) 2
Consulte también: TFT.GETSUG, TFT.DELSUG, TFT.SUGNUM
TFT.DELSUG
Elimina una o más entradas de texto de autocompletado de un índice.
Sintaxis
TFT.DELSUG index text [text] ...
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
|
text |
Sí |
La entrada de texto exacta que se va a eliminar. Debe ser una coincidencia completa y exacta. |
Valor de retorno
En caso de éxito: el número de entradas de texto eliminadas (entero)
En caso de fallo: un mensaje de error
Ejemplo
TFT.DELSUG idx:redis 'redis is a memory database' 'redis cluster'
(integer) 2
Consulte también: TFT.ADDSUG, TFT.SUGNUM
TFT.SUGNUM
Obtiene el número de entradas de texto de autocompletado en un índice.
Sintaxis
TFT.SUGNUM index
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
Valor de retorno
En caso de éxito: el recuento de entradas (entero)
En caso de fallo: un mensaje de error
Ejemplo
TFT.SUGNUM idx:redis
(integer) 3
Consulte también: TFT.ADDSUG, TFT.GETSUG
TFT.GETSUG
Recupera sugerencias de autocompletado que coinciden con un prefijo. Los resultados se devuelven en orden descendente según su peso.
Sintaxis
TFT.GETSUG index prefix [MAX_COUNT count] [FUZZY]
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
|
prefix |
Sí |
El prefijo que se debe coincidir. |
|
|
No |
Número máximo de entradas por devolver. Valores válidos: de |
|
|
No |
Habilita la coincidencia difusa. |
Valor de retorno
En caso de éxito: una lista de entradas de texto de autocompletado coincidentes
En caso de fallo: un mensaje de error
Ejemplo
TFT.GETSUG idx:redis res MAX_COUNT 2 FUZZY
1) "redis cluster"
2) "redis lock"
Consulte también: TFT.ADDSUG, TFT.GETALLSUGS
TFT.GETALLSUGS
Recupera todas las entradas de texto de autocompletado de un índice.
Sintaxis
TFT.GETALLSUGS index
Parámetros
|
Parameter |
Required |
Description |
|
index |
Sí |
El nombre del índice. |
Valor de retorno
En caso de éxito: una lista con todas las entradas de texto de autocompletado
En caso de fallo: un mensaje de error
Ejemplo
TFT.GETALLSUGS idx:redis
1) "redis cluster"
2) "redis lock"
3) "redis is a memory database"
Consulte también: TFT.GETSUG, TFT.ADDSUG
Agregaciones
Agregue una cláusula aggs (o aggregations) a una consulta TFT.SEARCH para realizar agregaciones sobre el conjunto de resultados.
Uso básico
Especifique un nombre de agregación personalizado, un tipo de agregación y un field sobre el cual agregar:
TFT.SEARCH shares '{"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Sum":{"sum":{"field":"purchase_price"}}}}'
La respuesta incluye tanto los resultados de búsqueda de query como los resultados de agregación de aggs:
{"hits":{"hits":[{"_id":"16581351808123930","_index":"today_shares0718","_score":1.0,"_source":{"shares_name":"XAX","logictime":14300210,"purchase_type":1,"purchase_price":101.1,"purchase_count":100,"investor":"Jay"}},{"_id":"16581351809626430","_index":"today_shares0718","_score":1.0,"_source":{"shares_name":"XAX","logictime":14300310,"purchase_type":1,"purchase_price":111.1,"purchase_count":100,"investor":"Jay"}}],"max_score":1.0,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Sum":{"value":212.2}}}
Agregue "size": 0 a la consulta para devolver solo los resultados de agregación sin documentos.
Agregación de métricas
Las agregaciones de métricas realizan cálculos numéricos sobre campos numéricos (integer, double, etc.) y no admiten subagregaciones anidadas.
|
Metric |
Description |
Supported field types |
|
|
Suma de los valores del campo |
Numérico |
|
|
Valor máximo |
Numérico |
|
|
Valor mínimo |
Numérico |
|
|
Valor promedio |
Numérico |
|
|
Suma de los valores al cuadrado |
Numérico |
|
|
Varianza estadística |
Numérico |
|
|
Desviación estándar |
Numérico |
|
|
Recuento de valores (sin deduplicación) |
Numérico, |
|
|
Todas las métricas anteriores en una sola respuesta |
Numérico |
Solovalue_countadmite camposkeyword. El resto de las métricas requiere campos numéricos.
Salida: Un valor DOUBLE calculado a partir del campo especificado.
Agregación de términos
Cuenta valores deduplicados en un campo keyword. Admite subagregaciones anidadas.
|
Parameter |
Description |
Default |
|
|
El campo de agregación. Solo se admiten campos |
Obligatorio |
|
|
Número de buckets por devolver. Valores válidos: de |
|
|
|
Orden de clasificación. |
|
|
|
Recuento mínimo de documentos para que un bucket se incluya en los resultados. |
|
|
|
Un patrón de expresión regular o un valor exacto con el que deben coincidir las claves del bucket. Para campos de cadena, se admite la coincidencia mediante expresiones regulares. Para campos de matriz, se requiere una coincidencia exacta. |
-- |
|
|
Un patrón de expresión regular o un valor exacto con el que no deben coincidir las claves del bucket. Si se especifican tanto |
-- |
Salida: Un objeto JSON con buckets. Cada bucket contiene key (el valor del campo) y doc_count (el recuento de documentos):
{
"aggregations": {
"Per_Investor_Freq": {
"buckets": [
{"doc_count": 2, "key": "Jay"},
{"doc_count": 1, "key": "Mila"}
]
}
}
}
Ejemplo:
{"aggs": {"Per_Investor_Freq": {"terms": {"field": "investor"}}}}
Agregación de filtro
Filtra los resultados de la consulta mediante una sentencia de consulta y cuenta los documentos coincidentes. Admite subagregaciones anidadas.
Salida: El número de documentos (doc_count) que cumplen la condición del filtro.
Ejemplos de agregación
Los siguientes ejemplos utilizan un conjunto de datos de operaciones bursátiles.
Paso 1: Crear el índice
TFT.CREATEINDEX today_shares '{"mappings":{"properties":{"shares_name":{"type":"keyword"},"logictime":{"type":"long"},"purchase_type":{"type":"integer"},"purchase_price":{"type":"double"},"purchase_count":{"type":"long"},"investor":{"type":"keyword"}}}}'
Paso 2: Agregar documentos
TFT.ADDDOC today_shares '{"shares_name":"XAX","logictime":14300210,"purchase_type":1,"purchase_price":101.1,"purchase_count":100,"investor":"Jay"}'
TFT.ADDDOC today_shares '{"shares_name":"XAX","logictime":14300310,"purchase_type":1,"purchase_price":111.1,"purchase_count":100,"investor":"Jay"}'
TFT.ADDDOC today_shares '{"shares_name":"YBY","logictime":14300410,"purchase_type":1,"purchase_price":11.1,"purchase_count":100,"investor":"Mila"}'
Paso 3: Ejecutar consultas
sum -- Monto total de compra por inversionista
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Sum":{"sum":{"field":"purchase_price"}}}}'
{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Sum":{"value":212.2}}}
max -- Precio de compra más alto por inversionista
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Max":{"max":{"field":"purchase_price"}}}}'
{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Max":{"value":111.1}}}
avg -- Precio promedio de compra por inversionista
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Avg":{"avg":{"field":"purchase_price"}}}}'
{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Avg":{"value":106.1}}}
std_deviation -- Desviación estándar de los precios de compra
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Std_Deviation":{"std_deviation":{"field":"purchase_price"}}}}'
{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Std_Deviation":{"value":5.0}}}
extended_stats -- Todas las estadísticas a la vez
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"investor":"Jay"}},"aggs":{"Jay_Extended_Stats":{"extended_stats":{"field":"purchase_price"}}}}'
{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":2}},"aggregations":{"Jay_Extended_Stats":{"count":2,"sum":212.2,"max":111.1,"min":101.1,"avg":106.1,"sum_of_squares":10221.21,"variance":25.0,"std_deviation":5.0}}}
terms -- Inversionistas con al menos dos transacciones
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Per_Investor_Freq":{"terms":{"field":"investor","min_doc_count":2,"order":{"_key":"desc"}}}}}'
{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Per_Investor_Freq":{"buckets":[{"key":"Jay","doc_count":2}]}}}
Agregación de términos anidada -- Recuento de transacciones por acción con precio promedio
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Per_Investor_Freq":{"terms":{"field":"shares_name","include":"[A-Z]+","exclude":["XAX"]},"aggs":{"Price_Avg":{"avg":{"field":"purchase_price"}}}}}}'
{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Per_Investor_Freq":{"buckets":[{"key":"YBY","doc_count":1,"Price_Avg":{"value":11.1}}]}}}
Agregación de filtro anidada -- Filtro por inversionista con estadísticas extendidas
TFT.SEARCH today_shares '{"size":0,"query":{"term":{"purchase_type":1}},"aggs":{"Jay_BuyIn_Filter":{"filter":{"term":{"investor":"Jay"}},"aggs":{"Jay_BuyIn_Quatation":{"extended_stats":{"field":"purchase_price"}}}}}}'
{"hits":{"hits":[],"max_score":null,"total":{"relation":"eq","value":3}},"aggregations":{"Jay_BuyIn_Filter":{"doc_count":2,"Jay_BuyIn_Quatation":{"count":2,"sum":212.2,"max":111.1,"min":101.1,"avg":106.1,"sum_of_squares":10221.21,"variance":25.0,"std_deviation":5.0}}}}