filtros Bloom, por su naturaleza requieren recorridos de tablas para evaluar partidos. En MySQL no hay ningún tipo de filtro de floración. La solución simple es mapear los bytes del filtro bloom en BitInteger (palabras de 8 bytes) y realizar la verificación en la consulta. Así que asumiendo que la floración filteris 8 bytes o menos (un pequeño filtro) que podría ejecutar una declaración preparada como:
SELECT * FROM test WHERE cast(filter, UNSIGNED) & cast(?, UNSIGNED) = cast(?, UNSIGNED)
y reemplazar los parámetros con el valor que busca. Sin embargo, para filtros más grandes, debe crear múltiples columnas filter
y dividir el filtro de destino en varias palabras. Tienes que lanzar a unsigned para hacer el control correctamente.
Dado que muchos filtros de bloom razonables tienen un tamaño de Kilo a Megabyte, tiene sentido utilizar blobs para almacenarlos.Una vez que cambia a blobs, no hay mecanismos nativos para realizar las comparaciones de nivel de bytes. Y tirando de una tabla completa de blobs grandes a través de la red para hacer el filtro en código localmente no tiene mucho sentido.
La única solución razonable que he encontrado es una UDF. El UDF debe aceptar un char*
y repetirlo lanzando el char*
a un unsigned char*
y realizar el control target & candidate = target
. Este código sería algo como:
my_bool bloommatch(UDF_INIT *initid, UDF_ARGS *args, char* result, unsigned long* length, char *is_null, char *error)
{
if (args->lengths[0] > args->lengths[1])
{
return 0;
}
char* b1=args->args[0];
char* b2=args->args[1];
int limit = args->lengths[0];
unsigned char a;
unsigned char b;
int i;
for (i=0;i<limit;i++)
{
a = (unsigned char) b1[i];
b = (unsigned char) b2[i];
if ((a & b) != a)
{
return 0;
}
}
return 1;
}
Esta solución se implementa y está disponible en https://github.com/Claudenw/mysql_bloom
Gracias por el consejo de consulta. Sin embargo, ¿qué debo hacer si quiero almacenar números "n-bit" que son más largos que Integers (32 bits) ... por ejemplo, 64 o 128 bits? – Sam
El tipo de datos Mysql BIT parece admitir hasta 64 bits. ¿Significa que solo puede almacenar hasta 64 artículos en el filtro bloom? –
Necesito poder almacenar n bits ... esto me limita a 64. – Sam