Trituración JSONCompatible with Milvus 2.6.2+

JSON shredding acelera las consultas JSON convirtiendo el almacenamiento tradicional basado en filas en almacenamiento columnar optimizado. Al tiempo que mantiene la flexibilidad de JSON para el modelado de datos, Milvus realiza entre bastidores una optimización columnar que mejora drásticamente el acceso y la eficiencia de las consultas.

La trituración JSON es eficaz para la mayoría de los escenarios de consulta JSON. Los beneficios de rendimiento se vuelven más pronunciados con

  • Documentos JSON más grandes y complejos - Mayores ganancias de rendimiento a medida que aumenta el tamaño del documento.

  • Cargas de trabajo de lectura intensiva - Filtrado, ordenación o búsqueda frecuentes en claves JSON

  • Patrones de consulta mixtos: las consultas a través de diferentes claves JSON se benefician del enfoque de almacenamiento híbrido.

Cómo funciona

El proceso de trituración de JSON se realiza en tres fases distintas para optimizar los datos y acelerar su recuperación.

Fase 1: Ingestión y clasificación de claves

A medida que se escriben nuevos documentos JSON, Milvus los muestrea y analiza continuamente para construir estadísticas para cada clave JSON. Este análisis incluye el ratio de ocurrencia de la clave y la estabilidad del tipo (si su tipo de datos es consistente en todos los documentos).

Basándose en estas estadísticas, las claves JSON se clasifican en las siguientes categorías para un almacenamiento óptimo.

Categorías de claves JSON

Tipo de clave

Descripción

Claves tipificadas

Claves que existen en la mayoría de los documentos y siempre tienen el mismo tipo de datos (por ejemplo, todos los enteros o todas las cadenas).

Claves dinámicas

Claves que aparecen con frecuencia pero tienen un tipo de datos mixto (por ejemplo, a veces una cadena, a veces un entero).

Claves compartidas

Claves de aparición infrecuente o anidadas que se sitúan por debajo de un umbral de frecuencia configurable.

Ejemplo de clasificación

Considere los datos JSON de ejemplo que contienen las siguientes claves JSON:

{"a": 10, "b": "str1", "f": 1}
{"a": 20, "b": "str2", "f": 2}  
{"a": 30, "b": "str3", "f": 3}
{"a": 40, "b": 1, "f": 4}       // b becomes mixed type
{"a": 50, "b": 2, "e": "rare"}  // e appears infrequently

Basándose en estos datos, las claves se clasificarían de la siguiente manera:

  • Claves mecanografiadas: a y f (siempre un número entero)

  • Claves dinámicas: b (cadena mixta/entero)

  • Clavescompartidas: e (clave que aparece con poca frecuencia)

Fase 2: Optimización del almacenamiento

La clasificación de la fase 1 dicta la disposición del almacenamiento. Milvus utiliza un formato columnar optimizado para las consultas.

Json Shredding Flow Flujo de trituración de Json

  • Columnas trituradas: Para las claves mecanografiadas y dinámicas, los datos se escriben en columnas dedicadas. Este almacenamiento en columnas permite exploraciones rápidas y directas durante las consultas, ya que Milvus puede leer sólo los datos necesarios para una clave determinada sin procesar todo el documento.

  • Columna compartida: Todas las claves compar tidas se almacenan juntas en una única columna binaria JSON compacta. Sobre esta columna se construye un índice invertido de claves compartidas. Este índice es crucial para acelerar las consultas sobre claves de baja frecuencia, ya que permite a Milvus podar rápidamente los datos, reduciendo eficazmente el espacio de búsqueda a sólo aquellas filas que contienen la clave especificada.

Fase 3: Ejecución de consultas

La fase final aprovecha la disposición optimizada del almacenamiento para seleccionar de forma inteligente la ruta más rápida para cada predicado de consulta.

  • Ruta rápida: Las consultas sobre claves mecanografiadas/dinámicas (por ejemplo, json['a'] < 100) acceden directamente a las columnas dedicadas.

  • Ruta optimizada: Las consultas sobre claves compartidas (por ejemplo, json['e'] = 'rare') utilizan un índice invertido para localizar rápidamente los documentos relevantes.

Activar la trituración de JSON

Para activar esta función, defina common.enabledJSONShredding como true en el archivo de configuración milvus.yaml. Los nuevos datos activarán automáticamente el proceso de destrucción.

# milvus.yaml
...
common:
  enabledJSONShredding: true # Indicates whether to enable JSON key stats build and load processes
...

Una vez activada, Milvus comenzará a analizar y reestructurar sus datos JSON en el momento de la ingesta sin ninguna intervención manual adicional.

Ajuste de parámetros

Para la mayoría de los usuarios, una vez activada la destrucción de JSON, la configuración por defecto de los demás parámetros es suficiente. Sin embargo, puede ajustar el comportamiento de la destrucción de JSON utilizando estos parámetros en milvus.yaml.

Parámetro Nombre

Descripción

Valor por defecto

Consejo de ajuste

common.enabledJSONShredding

Controla si los procesos de construcción y carga de trituración JSON están habilitados.

false

Debe establecerse en true para activar la característica.

common.usingjsonShreddingForQuery

Controla si Milvus utiliza datos triturados para la aceleración.

verdadero

Se establece en false como medida de recuperación si las consultas fallan, volviendo a la ruta de consulta original.

queryNode.mmap.jsonShredding

Determina si Milvus utiliza mmap al cargar datos triturados.

Para más detalles, consulte Usar mmap.

true

Este ajuste está generalmente optimizado para el rendimiento. Ajústelo sólo si tiene necesidades específicas de gestión de memoria o restricciones en su sistema.

dataCoord.jsonShreddingMaxColumns

El número máximo de claves JSON que se almacenarán en las columnas trituradas.

Si el número de claves que aparecen con frecuencia excede este límite, Milvus dará prioridad a las más frecuentes para su destrucción, y el resto de claves se almacenarán en la columna compartida.

1024

Esto es suficiente para la mayoría de los escenarios. Para JSON con miles de claves que aparecen con frecuencia, puede que necesite aumentar este límite, pero controle el uso del almacenamiento.

dataCoord.jsonShreddingRatioThreshold

El ratio mínimo de aparición que debe tener una clave JSON para ser considerada para ser triturada en una columna triturada.

Se considera que una clave aparece con frecuencia si su ratio está por encima de este umbral.

0.3

Aumenta (por ejemplo, a 0,5) si el número de claves que cumplen los criterios de trituración supera el límite de dataCoord.jsonShreddingMaxColumns. Esto hace que el umbral sea más estricto, reduciendo el número de claves que cumplen los criterios para ser trituradas.

Redúzcalo (por ejemplo, a 0,1) si desea destruir más claves que aparecen con menos frecuencia que el umbral predeterminado del 30%.

Pruebas de rendimiento

Nuestras pruebas demuestran mejoras significativas del rendimiento en diferentes tipos de claves JSON y patrones de consulta.

Entorno y metodología de las pruebas

  • Hardware: clúster de 1 núcleo/8 GB

  • Conjunto de datos: 1 millón de documentos de JSONBench

  • Tamaño medio del documento: 478,89 bytes

  • Duración de la prueba: 100 segundos midiendo QPS y latencia

Resultados: claves mecanografiadas

Esta prueba midió el rendimiento al consultar una clave presente en la mayoría de los documentos.

Expresión de consulta

Tipo de valor de clave

QPS (sin destrucción)

QPS (con destrucción)

Aumento del rendimiento

json['time_us'] > 0

Entero

8.69

287.50

33x

json['kind'] == 'commit'

Cadena

8.42

126.1

14.9x

Resultados: claves compartidas

Esta prueba se centró en la consulta de claves dispersas y anidadas que entran en la categoría de "compartidas".

Expresión de consulta

Tipo de valor de clave

QPS (sin destrucción)

QPS (con destrucción)

Aumento del rendimiento

json['identity']['seq'] > 0

Entero anidado

4.33

385

88.9x

json['identity']['did'] == 'xxxxx'

Cadena anidada

7.6

352

46.3x

Información clave

  • Lasconsultas clave compartidas presentan las mejoras más espectaculares (hasta 89 veces más rápidas).

  • Lasconsultas de claves tipificadas ofrecen un aumento constante del rendimiento de 15 a 30 veces.

  • Todos los tipos de consulta se benefician de JSON Shredding sin regresiones de rendimiento.

PREGUNTAS FRECUENTES

  • ¿Cómo puedo comprobar si la trituración de JSON funciona correctamente?

    1. En primer lugar, compruebe si los datos se han construido utilizando el comando show segment --format table de la herramienta Birdwatcher. Si ha funcionado correctamente, la salida contendrá shredding_data/ y shared_key_index/ en el campo Json Key Stats.

      Birdwatcher Output Salida de Birdwatcher

    2. A continuación, compruebe que los datos se han cargado ejecutando show loaded-json-stats en el nodo de consulta. La salida mostrará detalles sobre los datos triturados cargados para cada nodo de consulta.

  • ¿Qué ocurre si se produce un error?

    Si el proceso de creación o carga falla, puede desactivar rápidamente la función configurando common.enabledJSONShredding=false. Para borrar las tareas restantes, utilice el comando remove stats-task <task_id> en Birdwatcher. Si una consulta falla, configure common.usingjsonShreddingForQuery=false para volver a la ruta de consulta original, omitiendo los datos triturados.

  • ¿Cómo elijo entre la trituración JSON y la indexación JSON?

    • Latrituración de JSON es ideal para las claves que aparecen con frecuencia en los documentos, especialmente en el caso de estructuras JSON complejas. Combina las ventajas del almacenamiento en columnas y de la indexación invertida, por lo que es muy adecuado para situaciones de lectura intensiva en las que se consultan muchas claves diferentes. Sin embargo, no se recomienda para documentos JSON muy pequeños, ya que el aumento de rendimiento es mínimo. Cuanto menor sea la proporción del valor de la clave con respecto al tamaño total del documento JSON, mayor será la optimización del rendimiento gracias a la trituración.

    • La indexación JSON es mejor para la optimización específica de consultas basadas en claves y tiene una menor sobrecarga de almacenamiento. Es adecuado para estructuras JSON más simples. Ten en cuenta que la trituración JSON no cubre las consultas sobre claves dentro de matrices, por lo que necesitas un índice JSON para acelerarlas.

    Para obtener más información, consulta Visión general de los campos JSON.