Utilice las funciones de consulta del índice de búsqueda en las cláusulas WHERE de SQL para ejecutar consultas de texto completo, matrices, tipos anidados, vectores y JSON en tablas de asignación del índice de búsqueda.
Operaciones compatibles
Antes de utilizar consultas SQL en el índice de búsqueda, cree una tabla de asignación para dicho índice. Para obtener más información, consulte DDL operations.
|
Función |
Tipo de consulta |
Descripción |
|
TEXT_MATCH |
Búsqueda de texto completo |
Coincide con filas que contienen como mínimo un token del texto de consulta. |
|
TEXT_MATCH_PHRASE |
Búsqueda de texto completo |
Coincide con filas donde los tokens aparecen de forma consecutiva y en el orden especificado. |
|
ARRAY_EXTRACT |
Consulta de matriz |
Expande una columna de matriz para aplicar filtros mediante operadores. |
|
NESTED_QUERY |
Consulta de tipo anidado |
Exige que todas las condiciones se cumplan en un único elemento JSON. |
|
VECTOR_QUERY_FLOAT32 |
Búsqueda vectorial |
Ejecuta consultas de vecinos más cercanos aproximados (ANN). |
|
SCORE() |
Búsqueda vectorial |
Devuelve la puntuación de relevancia de un resultado de búsqueda vectorial. |
|
->> |
Función JSON |
Extrae un valor en la ruta especificada y lo convierte a cadena. |
|
JSON_UNQUOTE |
Función JSON |
Elimina las comillas externas de un valor JSON. |
|
JSON_EXTRACT |
Función JSON |
Extrae el subdocumento ubicado en la ruta especificada. |
Búsqueda de texto completo
Busque datos en campos de tipo Text mediante TEXT_MATCH para coincidencia de tokens o TEXT_MATCH_PHRASE para coincidencia de frases.
Antes de usar la búsqueda de texto completo, configure la columna destino como tipo Text en el índice de búsqueda y establezca un Tokenization. Para columnas con tokenización difusa, utilice TEXT_MATCH_PHRASE para lograr consultas difusas de alto rendimiento.
TEXT_MATCH (consulta de coincidencia)
Tokeniza el texto de consulta y busca filas que contengan como mínimo un token. Devuelve un valor booleano: true si hay coincidencia, false en caso contrario.
TEXT_MATCH(fieldName, text [, options])
|
Parámetro |
Tipo |
Descripción |
|
fieldName |
STRING |
Nombre de la columna donde se realizará la búsqueda. La columna debe ser de tipo Text en el índice de búsqueda. |
|
text |
STRING |
Texto de consulta. Este texto se tokeniza y luego se compara con los datos de la fila. Una fila coincide si contiene cualquier token. El tokenizer del índice de búsqueda determina cómo se divide el texto en tokens. Si no se especifica ningún tokenizer, se utiliza la tokenización de carácter único de forma predeterminada. |
|
options |
STRING |
Parámetros de coincidencia opcionales, que incluyen operator (el operador lógico, que puede ser OR o AND, con OR como predeterminado) y minimum_should_match (el número mínimo de tokens coincidentes, con 1 como predeterminado). Si operator es OR, una fila coincide cuando contiene como mínimo minimum_should_match tokens. Si operator es AND, todos los tokens deben estar presentes en la fila. |
TEXT_MATCH_PHRASE (consulta de coincidencia de frase)
Similar a TEXT_MATCH, pero exige que los tokens aparezcan de forma consecutiva y en el mismo orden dentro de los datos de la fila. Devuelve un valor booleano.
TEXT_MATCH_PHRASE(fieldName, text)
Los parámetros son los mismos que en TEXT_MATCH, pero TEXT_MATCH_PHRASE requiere que los tokens coincidan de manera consecutiva y en orden. Por ejemplo, el texto de consulta "this is" coincide con "this is tablestore", pero no coincide con "this table is" ni con "is this".
Ejemplos
Consulte datos en la columna content que contengan el token "tablestore":
SELECT * FROM search_exampletable WHERE TEXT_MATCH(content, 'tablestore') LIMIT 10;
Consulte datos en la columna content que contengan "sql query" como frase consecutiva:
SELECT * FROM search_exampletable WHERE TEXT_MATCH_PHRASE(content, 'sql query') LIMIT 10;
Utilice el parámetro options para buscar datos que contengan como mínimo 2 tokens:
SELECT * FROM search_exampletable WHERE TEXT_MATCH(content, 'tablestore is cool', 'or', '2') LIMIT 10;
Use el operador AND para exigir que todos los tokens estén presentes:
SELECT * FROM search_exampletable WHERE TEXT_MATCH(content, 'tablestore is cool', 'and') LIMIT 10;
Consultas de matriz
Utilice la función ARRAY_EXTRACT para consultar datos en columnas de tipo matriz. Configure la columna como tipo matriz en el índice de búsqueda; para ello, habilite la opción de matriz en la consola o establezca IsArray en true mediante el SDK. Al escribir datos, los valores de la matriz deben tener formato de matriz JSON, por ejemplo ["a","b","c"].
Asignación de tipos de datos
|
Tipo en la tabla de datos |
Tipo en el índice de búsqueda |
Tipo SQL |
|
String |
Tipo real de los elementos de la matriz (Long, Double, Boolean, Keyword o Text), con la propiedad de matriz habilitada para la columna |
VARCHAR (clave principal) o MEDIUMTEXT (columna predefinida) |
ARRAY_EXTRACT(col_name)
ARRAY_EXTRACT expande una columna de matriz y se combina con operadores como condición de la cláusula WHERE. Los operadores compatibles incluyen igualdad (=), rango (>, <) y LIKE.
No es posible usar una columna de matriz directamente con operadores como condición de consulta. Debe utilizar la función ARRAY_EXTRACT.
Límites
ARRAY_EXTRACT solo se puede utilizar en tablas de asignación del índice de búsqueda, y únicamente se permite un parámetro de columna de matriz por llamada. La función solo sirve como condición de la cláusula WHERE. No se admite su uso como expresión SELECT ni para agregaciones u ordenamientos.
Una columna de matriz sin ARRAY_EXTRACT puede usarse como nombre de columna o expresión en SELECT, pero no es válida para agregaciones u ordenamientos.
Cuando ARRAY_EXTRACT se combina con operadores como condición de consulta, no se admite la conversión de tipos de datos. El valor de consulta debe coincidir con el tipo de datos de la columna de matriz. Por ejemplo, una columna de matriz de tipo Long admite
ARRAY_EXTRACT(col) = 1, pero no admiteARRAY_EXTRACT(col) = '1'.Los elementos de matriz de tipo Text deben utilizarse junto con la función TEXT_MATCH o TEXT_MATCH_PHRASE, por ejemplo
TEXT_MATCH(ARRAY_EXTRACT(col_text), 'keyword').
Ejemplos
-- Query rows that contain the value 'apple' in the array
SELECT * FROM search_exampletable WHERE ARRAY_EXTRACT(col_array) = 'apple';
-- Query rows that contain elements starting with 'd' in the array
SELECT * FROM search_exampletable WHERE ARRAY_EXTRACT(col_array) LIKE 'd%';
Consultas de tipo anidado
Las columnas de tipo anidado almacenan matrices JSON donde cada elemento contiene varias subcolumnas. El tipo de datos de la columna en la tabla de datos debe ser String. Configure la columna como tipo Nested y especifique los tipos de datos de las subcolumnas al crear el índice de búsqueda.
Al crear una tabla de asignación, defina las columnas de tipo anidado como MEDIUMTEXT. Las subcolumnas internas se crean automáticamente y pueden consultarse con DESCRIBE, por ejemplo col_nested.name y col_nested.age. En las consultas, los nombres de las subcolumnas siguen el formato nested_column.sub_column, donde los puntos (.) separan múltiples niveles de anidamiento, como en col1.col2.col3.
Asignación de tipos de datos
|
Tipo en la tabla de datos |
Tipo en el índice de búsqueda |
Tipo SQL |
|
String |
Tipo anidado. Los tipos de datos de las subcolumnas coinciden con los tipos reales de los datos escritos. |
VARCHAR (clave principal) o MEDIUMTEXT (columna predefinida) |
Métodos de consulta
Consulta directa de subcolumna
Utilice subcolumnas anidadas directamente con operadores. Una fila coincide si algún elemento JSON de dicha fila tiene una subcolumna que cumple la condición.
SELECT * FROM search_exampletable WHERE `col_nested.age` > 30;
Función NESTED_QUERY
Exige que todas las condiciones se cumplan en un único elemento JSON.
NESTED_QUERY(subcol_column_condition)
subcol_column_condition especifica condiciones de consulta sobre subcolumnas en el mismo nivel de anidamiento. Combine múltiples condiciones con AND u OR.
Diferencia entre ambos métodos
Suponga que la columna anidada tags contiene los siguientes datos de fila: [{"tagName":"tag1", "score":0.8}, {"tagName":"tag2", "score":0.2}]:
tags.tagName— Coincide, porque el primer elemento cumple la condición de tagName y el segundo elemento cumple la condición de score.NESTED_QUERY(— No coincide, porque ningún elemento individual cumple ambas condiciones simultáneamente.
Límites
NESTED_QUERY solo se puede utilizar en tablas de asignación del índice de búsqueda y exclusivamente como cláusula WHERE. No se admite su uso como expresión SELECT ni para agregaciones, agrupaciones u ordenamientos.
Las subcolumnas anidadas no pueden usarse como expresiones SELECT ni para agregaciones, agrupaciones u ordenamientos.
ALTER TABLE no puede agregar ni eliminar subcolumnas anidadas directamente. Solo es posible agregar o eliminar la columna anidada completa, y las subcolumnas se agregan o eliminan automáticamente con ella.
Las subcolumnas anidadas no admiten conversión de tipos de datos ni cálculos de funciones que no puedan delegarse al índice de búsqueda. Asegúrese de que los tipos de datos de las subcolumnas anidadas sean correctos.
Ejemplos
-- Direct subcolumn query: query rows where age > 30 in the nested column
SELECT * FROM search_exampletable WHERE `col_nested.age` > 30;
-- NESTED_QUERY: query rows where a single element has name starting with 'I' and age < 20
SELECT * FROM search_exampletable WHERE NESTED_QUERY(`col_nested.name` LIKE 'I%' AND `col_nested.age` < 20);
-- Multi-level nesting
SELECT * FROM search_exampletable WHERE NESTED_QUERY(`col1.col2` = 1 AND NESTED_QUERY(`col1.col3.col4` = 2));
Consultas de columnas virtuales
Las columnas virtuales del índice de búsqueda permiten consultar nuevos campos y tipos al modificar el esquema del índice, sin alterar la estructura de almacenamiento de la tabla de datos. Las columnas virtuales se definen en la tabla de asignación con sus tipos de datos SQL reales.
Asignación de tipos de datos
Tipo de columna virtual del índice de búsqueda | Tipo SQL | Descripción |
Keyword | MEDIUMTEXT | Las columnas virtuales no tienen una columna correspondiente en la tabla de datos. Solo sus columnas de origen tienen columnas correspondientes. |
Text | MEDIUMTEXT | |
Long | BIGINT | |
Double | DOUBLE |
Usos compatibles
Filtrar datos en cláusulas WHERE. El tipo de datos de la columna virtual en la condición debe coincidir con el tipo del parámetro de consulta.
Utilizar en agregaciones y agrupaciones. El tipo de datos de origen de la columna virtual debe ser compatible con la operación. Por ejemplo, solo los tipos Long y Double admiten SUM. Las columnas virtuales de tipo Keyword no pueden sumarse, y las columnas virtuales de tipo Text no admiten agrupaciones.
Se admiten consultas TopN y ordenamientos. El ordenamiento requiere LIMIT.
Límites
Las columnas virtuales solo pueden utilizarse en tablas de asignación del índice de búsqueda.
Las columnas virtuales solo pueden emplearse en condiciones de consulta. No es posible usarlas en SELECT para devolver valores de columna. Para devolver valores, especifique la columna de origen de la columna virtual.
SELECT *no se ve afectado y excluye automáticamente las columnas virtuales de los resultados.Las columnas virtuales no pueden utilizarse para comparaciones de columnas, cálculos ni JOIN.
Las columnas virtuales no admiten conversión de tipos de datos ni cálculos de funciones que no puedan delegarse al índice de búsqueda. Actualmente, solo las funciones de agregación pueden delegarse en consultas SQL.
Ejemplos
Cree una tabla de asignación del índice de búsqueda que incluya columnas virtuales:
CREATE TABLE search_exampletable(
col_keyword MEDIUMTEXT,
col_keyword_virtual_long BIGINT
)
ENGINE='searchindex',
ENGINE_ATTRIBUTE='{"index_name":"exampletable_index","table_name":"exampletable"}';
Realice consultas con columnas virtuales:
SELECT * FROM search_exampletable WHERE col_keyword_virtual_long > 100 LIMIT 10;
Búsqueda vectorial
Utilice la función VECTOR_QUERY_FLOAT32 para consultas de vecinos más cercanos aproximados (ANN). Los campos vectoriales se almacenan como cadenas en la tabla de datos. Configúrelos como tipo vector en el índice de búsqueda, y especifique las dimensiones, el tipo de datos y la métrica de distancia. El tipo de datos SQL de las columnas vectoriales en la tabla de asignación es MEDIUMTEXT.
VECTOR_QUERY_FLOAT32
VECTOR_QUERY_FLOAT32(fieldName, float32QueryVector, topK, filter)
|
Parámetro |
Obligatorio |
Descripción |
|
fieldName |
Sí |
Nombre de la columna vectorial. La columna debe ser de tipo vector en el índice de búsqueda. |
|
float32QueryVector |
Sí |
Vector de consulta. Las dimensiones deben coincidir con las del campo vectorial en el índice de búsqueda. |
|
topK |
Sí |
Número de resultados más cercanos que se devolverán. Un valor K mayor mejora la recuperación, pero incrementa la latencia y el costo de la consulta. Si topK es menor que el valor de LIMIT, el servidor aumenta automáticamente topK para igualar LIMIT. Para conocer el valor máximo de topK, consulte Search index limits. |
|
filter |
No |
Filtro de consulta que admite cualquier combinación de condiciones de consulta no vectoriales. Las condiciones del filtro se aplican antes de la búsqueda vectorial para reducir el conjunto de candidatos y obtener resultados más precisos. También puede agregar condiciones de filtro en la cláusula WHERE con AND, pero esas condiciones filtran los resultados topK después de la búsqueda vectorial. |
Función SCORE()
Utilice SCORE() junto con VECTOR_QUERY_FLOAT32 como expresión SELECT para devolver la puntuación de relevancia de cada resultado. Una puntuación más alta indica mayor similitud.
SCORE()
Límites
VECTOR_QUERY_FLOAT32 solo se puede utilizar en tablas de asignación del índice de búsqueda y debe usarse con LIMIT. No se admiten cláusulas HAVING.
VECTOR_QUERY_FLOAT32 solo puede emplearse como cláusula WHERE. No se admite su uso como expresión SELECT ni para agregaciones, agrupaciones u ordenamientos.
SCORE() solo puede utilizarse con VECTOR_QUERY_FLOAT32 y exclusivamente como expresión SELECT. No es válido en cláusulas WHERE, agregaciones u ordenamientos.
Las demás condiciones en la cláusula WHERE deben admitir la delegación al índice de búsqueda. De lo contrario, la consulta fallará. Para consultar los operadores que admiten delegación, véase Query optimization.
Ejemplos
Consulte los 10 resultados más similares al vector especificado en la columna col_vector:
SELECT *, SCORE() FROM exampletable WHERE VECTOR_QUERY_FLOAT32(col_vector, '[1.5, -1.5, 2.5, -2.5]', 10) LIMIT 10;
Utilice filter para reducir el conjunto de candidatos antes de la búsqueda vectorial y obtener resultados más precisos:
SELECT *, SCORE() FROM exampletable WHERE VECTOR_QUERY_FLOAT32(col_vector, '[1.5, -1.5, 2.5, -2.5]', 100, col_keyword='cat_a' AND year_num=2024) LIMIT 10;
Utilice AND en la cláusula WHERE para filtrar después de la búsqueda vectorial. Es posible que los resultados topK no incluyan todas las filas coincidentes:
SELECT *, SCORE() FROM exampletable WHERE col_keyword='cat_a' AND VECTOR_QUERY_FLOAT32(col_vector, '[1.5, -1.5, 2.5, -2.5]', 500) LIMIT 10;
Funciones JSON
Las funciones JSON de SQL en Tablestore siguen la sintaxis de MySQL 5.7 y extraen datos de columnas con formato JSON.
|
Función |
Sintaxis |
Descripción |
|
->> |
|
Extrae el valor en la ruta especificada y lo convierte a cadena. Equivale a |
|
JSON_UNQUOTE |
|
Elimina las comillas externas de un valor JSON y devuelve una cadena. |
|
JSON_EXTRACT |
|
Extrae el subdocumento en la ruta especificada. El valor devuelto conserva el formato JSON. |
->> (extracción de ruta JSON)
Extrae el valor en la ruta especificada de una columna JSON y le quita las comillas para convertirlo en cadena. Equivale a JSON_UNQUOTE(JSON_EXTRACT()).
column->>'$.path'
|
Parámetro |
Tipo |
Descripción |
|
column |
STRING |
Nombre de la columna. |
|
path |
STRING |
Expresión de ruta JSON que debe comenzar con |
Ejemplo
SELECT col_json->>'$.city' AS city FROM exampletable LIMIT 10;
JSON_UNQUOTE
Elimina las comillas externas de un valor JSON y devuelve una cadena. Devuelve NULL si el argumento es NULL.
JSON_UNQUOTE(json_val)
|
Parámetro |
Tipo |
Descripción |
|
json_val |
STRING |
Valor JSON, generalmente el valor devuelto por JSON_EXTRACT. Se devuelve un error si el valor comienza y termina con comillas dobles pero no es un literal de cadena JSON válido. |
Ejemplo
SELECT JSON_UNQUOTE(JSON_EXTRACT(col_json, '$.city')) AS city FROM exampletable LIMIT 10;
JSON_EXTRACT
Extrae el subdocumento en la ruta especificada desde una columna JSON. El valor devuelto conserva el formato JSON, con los valores de cadena entre comillas. Es posible especificar múltiples rutas, y los resultados se devuelven en formato de matriz.
Tablestore no admite tipos JSON nativos. JSON_EXTRACT no puede utilizarse por sí solo y devuelve un error invalid column type: json. Utilice JSON_EXTRACT junto con JSON_UNQUOTE.
JSON_EXTRACT(json_doc, path[, path] ...)
|
Parámetro |
Tipo |
Descripción |
|
json_doc |
STRING |
Documento JSON. Se devuelve un error si el valor no es un documento JSON válido. |
|
path |
STRING |
Expresión de ruta JSON que debe comenzar con |
Ejemplos
Extraiga una sola ruta:
SELECT JSON_UNQUOTE(JSON_EXTRACT(col_json, '$.city')) AS city FROM exampletable WHERE pk = 1;
Extraiga múltiples rutas. Los resultados se devuelven en formato de matriz:
-- Assume col_json contains {"a": 1, "b": 2, "c": {"d": 4}}
SELECT JSON_UNQUOTE(JSON_EXTRACT(col_json, '$.a', '$.b', '$.c.d')) AS subdoc FROM exampletable WHERE pk = 1;
-- Result: [1, 2, 4]
Sintaxis de rutas JSON
Las rutas deben comenzar con $, que representa todo el documento JSON. Agregue selectores de ruta después de $. Los selectores pueden combinarse.
|
Selector |
Ejemplo |
Descripción |
|
$.key |
$.a, $.c.d |
Accede a un miembro del objeto. Encierre entre comillas dobles las claves que contengan espacios, por ejemplo |
|
[N] |
$[0], $.f[1] |
Accede a un elemento de la matriz. Los índices comienzan en 0. |
|
.* |
$.* |
Comodín de objeto. Devuelve los valores de todos los miembros. |
|
[*] |
$.arr[*] |
Comodín de matriz. Devuelve los valores de todos los elementos. |
|
prefix**suffix |
$**.d |
Comodín de ruta. Coincide con todas las rutas que comienzan con prefix y terminan con suffix. |
Ejemplos de consulta de objetos JSON
Suponga que la columna JSON contiene {"a": 1, "f": [1, 2, 3], "c": {"d": 4}}:
|
Ruta |
Valor devuelto |
Descripción |
|
$ |
{"a": 1, "c": {"d": 4}, "f": [1, 2, 3]} |
Todo el documento |
|
$.a |
1 |
Miembro directo |
|
$.c |
{"d": 4} |
Objeto anidado |
|
$.c.d |
4 |
Miembro de objeto anidado |
|
$.f[1] |
2 |
Elemento de matriz |
Ejemplos de consulta de matrices JSON
Suponga que la columna JSON contiene [3, {"a": [5, 6], "b": 10}, [99, 100]]. Los valores devueltos no escalares admiten consultas anidadas.
|
Ruta |
Valor devuelto |
Descripción |
|
$[0] |
3 |
Elemento escalar |
|
$[1] |
{"a": [5, 6], "b": 10} |
Valor no escalar. Pueden continuar las consultas anidadas. |
|
$[1].a |
[5, 6] |
Miembro de objeto anidado |
|
$[1].a[1] |
6 |
Elemento de matriz anidada |
|
$[1].b |
10 |
Miembro de objeto anidado |
|
$[2][0] |
99 |
Elemento de matriz anidada |
|
$[3] |
NULL |
Fuera de límites. Devuelve NULL. |