Todos los productos
Search
Centro de documentos

Tablestore:Search index operations

Última actualización: Sep 03, 2026

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

Nota

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.

Nota

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.

Importante

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 admite ARRAY_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

->>

col->>'$.path'

Extrae el valor en la ruta especificada y lo convierte a cadena. Equivale a JSON_UNQUOTE(JSON_EXTRACT()).

JSON_UNQUOTE

JSON_UNQUOTE(json_val)

Elimina las comillas externas de un valor JSON y devuelve una cadena.

JSON_EXTRACT

JSON_EXTRACT(json_doc, path[, path] ...)

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 $. Para consultar la sintaxis detallada, véase la sección Sintaxis de rutas JSON a continuación.

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.

Importante

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 $. Se admiten múltiples rutas. Devuelve NULL si algún argumento es NULL o si la ruta no existe en el documento. Se devuelve un error si la ruta no es una expresión de ruta válida.

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 $."a fish".

[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.