Las consultas de rango filtran resultados por valores numéricos, marcas de tiempo o coordenadas geográficas. Entre sus aplicaciones típicas se encuentran filtrar productos por precio, buscar registros dentro de una ventana de tiempo y localizar comercios cercanos en escenarios online-to-offline (O2O).
Para ejecutar una consulta de rango, complete estos pasos en orden:
Defina el tipo de campo en el esquema de la aplicación.
Cree un índice de campo único en el esquema de índices con el analizador correcto.
Escriba una consulta de rango con la sintaxis correspondiente a su tipo de campo.
Tipos de campo compatibles
Las consultas de rango solo admiten tres tipos de campo. Cada uno requiere un índice de campo único dedicado; los índices compuestos no son compatibles con estos tipos.
|
Tipo de campo |
Descripción |
Límite |
|
|
Entero de 64 bits |
Máximo 4 campos |
|
|
Marca de tiempo entera en milisegundos (≥ 0). La precisión de almacenamiento es de milisegundos, pero la de las consultas es de segundos. Durante las consultas, los últimos tres dígitos se tratan como |
Máximo 4 campos |
|
|
Cadena con el formato |
Máximo 2 campos |
Cree índices
En el esquema de índices, cree un índice de campo único para cada campo de consulta de rango y asigne el analizador correcto.
|
Tipo de campo |
Analizador |
Comportamiento del índice |
|
|
Análisis numérico |
Sin tokenización; construye un índice numérico para consultas de rango |
|
|
Análisis numérico |
Sin tokenización; construye un índice numérico para consultas de rango |
|
|
Ubicación geográfica |
Sin tokenización; construye un índice numérico para consultas de rango |
Sintaxis de consulta
INT y TIMESTAMP
Ambos tipos de campo usan la misma notación de corchetes. Los corchetes [ ] indican inclusión y los paréntesis ( ) indican exclusión. Omita un límite para dejar ese extremo abierto.
index:[number1,number2] // number1 <= index <= number2
index:[number1,number2) // number1 <= index < number2
index:(number1,number2] // number1 < index <= number2
index:(number1,number2) // number1 < index < number2
index:[number1,) // index >= number1
index:(number1,) // index > number1
index:(,number2] // index <= number2
index:(,number2) // index < number2
No coloque comillas inmediatamente después de los dos puntos del índice.
Ejemplo de rango de precios: busque "dress" con un precio entre 100 y 200:
query=index_text:'dress' AND index_price:[100,200]
Ejemplo de rango de marca de tiempo: busque noticias sobre "Beijing" del 1 al 3 de junio de 2019:
query=index_text:'Beijing' AND index_timestamp:[1559318400000,1559577599000]
En los índices de análisis numérico, el límite superior debe ser mayor o igual que el inferior. Un rango invertido devuelve el error de sintaxis 6112 (Query clause error).
Precisión de TIMESTAMP: la precisión de las consultas se limita a segundos. Durante una consulta, los últimos tres dígitos de cualquier valor de marca de tiempo se establecen en 000. El rango válido es [0, 4102416000000], que corresponde desde 1970-01-01 00:00 hasta 2100-01-01 00:00. Los valores superiores al límite máximo se ajustan a 4102416000000. Para diferenciar valores más allá de este límite, utilice un filtro.
GEO_POINT
Se admiten tres formas de consulta espacial: punto, círculo y rectángulo.
Consulta de punto: busca documentos en una coordenada exacta:
query=spatial_index:'point(LON LAT)'
Ejemplo: busque documentos en la coordenada (116.3906, 39.92324):
query=spatial_index:'point(116.3906 39.92324)'
Consulta de círculo: busca documentos dentro de un radio desde un punto central:
query=spatial_index:'circle(LON LAT,Radius)'
El valor Radius se expresa en metros. El rendimiento de la consulta es óptimo con radios de hasta 10 km y disminuye significativamente si se supera esa distancia.
Ejemplo: busque documentos a menos de 1,000 metros de (116.5806, 39.99624):
query=spatial_index:'circle(116.5806 39.99624, 1000)'
Consulta de rectángulo: busca documentos dentro de un rectángulo delimitador:
query=spatial_index:'rectangle(minX minY,maxX maxY)'
Latitud:
maxYdebe ser ≥minY. Si se invierte el orden, el sistema lo corrige automáticamente.Longitud: el rango de
minXamaxXse interpreta de oeste a este. Si se invierte, la consulta devuelve un rango incorrecto.
Ejemplo: busque documentos dentro del rectángulo definido por (116.3906, 39.92324) y (116.3907, 39.92325):
query=spatial_index:'rectangle(116.3906 39.92324, 116.3907 39.92325)'
Los valores válidos de GEO_POINT son [−180, 180] para la longitud y [−90, 90] para la latitud.