2009-10-29 25 views
5

Estoy al corriente en la planificación de la creación de una gran base de datos (más de 2 millones de filas) con una variedad de datos de fuentes separadas. Me gustaría evitar estructurar la base de datos en torno a los identificadores de auto_increment para evitar problemas de sincronización con la replicación, y también porque cada elemento insertado tendrá un código de producto alfanumérico que se garantiza que será único; me parece más sensato usarlo en su lugar.Sphinx sin utilizar un ID de auto_increment

Estoy buscando en un motor de búsqueda para indexar esta base de datos con Sphinx que parece bastante atractivo debido a su diseño alrededor de bases de datos relacionales de indexación. Sin embargo, al mirar varios tutoriales y documentación parece que los diseños de bases de datos dependen de un campo auto_increment de una forma u otra y más bien bold statement en la documentación que dice que los documentos ID deben ser enteros de 32/64bit solamente o cosas se rompen.

¿Hay alguna forma de tener una base de datos indexada por Sphinx sin campos auto_increment como id?

Respuesta

3

sphinx solo requiere que los identificadores sean enteros y únicos, no importa si se incrementan automáticamente o no, para que pueda implementar su propia lógica. Por ejemplo, genere hashes enteros para sus claves de cadena.

+0

Estoy un poco preocupado por tener identificadores de colisión con este enfoque - o tal vez leí que pasa? – squeeks

+1

¿Una idea sería usar unixtime + microtime al momento de la inserción? Podría usar eso como el momento de la inserción, así como la identificación del documento, dos pájaros de un tiro. – squeeks

+0

Creo que sería una buena idea que vale la pena probar. Aclamaciones. – squeeks

1

Sphinx no depende del incremento automático, solo necesita identificadores únicos de documentos enteros. Tal vez puedas tener un ID entero único sustituto en las tablas para trabajar con sphinx. Como es sabido, las búsquedas enteras son mucho más rápidas que las búsquedas alfanuméricas. ¿Por cuánto tiempo es tu código de producto alfanumérico? alguna muestra?

+0

Varían en longitud de 4 a 13 caracteres de longitud. – squeeks

17

Claro, eso es fácil de evitar. Si tiene que tomar su propia identificadores sólo para Esfinge y usted no quiere que chocan entre sí, se puede hacer algo como esto en su sphinx.conf (código de ejemplo para MySQL)

source products { 

    # Use a variable to store a throwaway ID value 
    sql_query_pre = SELECT @id := 0 

    # Keep incrementing the throwaway ID. 
    # "code" is present twice because Sphinx does not full-text index attributes 
    sql_query = SELECT @id := @id + 1, code AS code_attr, code, description FROM products 

    # Return the code so that your app will know which records were matched 
    # this will only work in Sphinx 0.9.10 and higher! 
    sql_attr_string = code_attr 
} 

El único problema es que aún necesita una forma de saber qué registros coinciden con su búsqueda. Sphinx devolverá la identificación (que ahora no tiene sentido) más cualquier columna que marque como "atributos".

Sphinx 0.9.10 y posteriores le devolverán su código de producto como parte de los resultados de la búsqueda porque tiene soporte de atributos de cadena.

0.9.10 no es un lanzamiento oficial todavía, pero se ve genial. Parece Zawodny is running it over at Craig's List así que no estaría demasiado nervioso como para confiar en esta función.

Cuestiones relacionadas