Foros del Web » Programación para mayores de 30 ;) » Java »

Buscador Java

Estas en el tema de Buscador Java en el foro de Java en Foros del Web. Hola a todos, tengo una duda existencial: Tengo un buscador de productos implementado con java (javafx) y mysql, es muy simple, detecto el texto introducido ...
  #1 (permalink)  
Antiguo 04/02/2017, 02:38
Usuario no validado
 
Fecha de Ingreso: abril-2012
Mensajes: 134
Antigüedad: 12 años
Puntos: 0
Buscador Java

Hola a todos, tengo una duda existencial:
Tengo un buscador de productos implementado con java (javafx) y mysql, es muy simple, detecto el texto introducido en un textfield y va buscando en la base de datos con like conforme va escribiendo. Hasta ahí todo bien y sencillo. El problema me lo encuentro al mejorar la accesibilidad del usuario, os explico, tengo relacionado los productos con Marcas y Categorías a través de ID, y para que no se vea feo la tabla con números en las columnas Marca y Categoria he creado un método que obtiene el nombre de las categorías por el ID. Hasta ahí entiendo que todo es lógico. Pero me encuentro en la tesitura que para buscar por Categoría o Marca, tengo que realizar una búsqueda previa de los ID a través del nombre de las categorías y esto afecta gravemente al rendimiento.
¿Qué solución aplicariais?, os paso el código

Código:
// Busco al escribir
tfBuscarProducto.setOnKeyReleased ((KeyEvent ke) -> {

        // Indico que buscar
        String valor = tfBuscarProducto.getText();

        // Indico que campo buscar
        String campo = null;

        // Verifico que haya un texto a buscar
        if (!"".equals(valor)) {

            try {
                // Instancio la clase
                ProductoDAO pd = new ProductoDAOImpl();

                if (rbBuscarProductoPorId.isSelected()) {

                    campo = "producto_id";
                    listaProducto = pd.buscarProductoPorSeleccion(campo, valor);

                } else if (rbBuscarProductoPorNombre.isSelected()) {

                    campo = "producto_nombre";
                    listaProducto = pd.buscarProductoPorSeleccion(campo, valor);

                } else if (rbBuscarProductoPorMarca.isSelected()) {

                    // Instancio la clase
                    MarcaDAO md = new MarcaDAOImpl();

                    // Almaceno las marcas
                    listaIdMarcas = md.buscarIdMarcaPorNombre(valor);

                    // Recorro los id
                    for (int i = 0; i < listaIdMarcas.size(); i++) {
                        // añado  los productos
                        listaProducto.addAll(pd.buscarProductoPorMarca(listaIdMarcas.get(i)));
                    }
                }

            } catch (SQLException ex) {
                Logger.getLogger(ProductosControlador.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

);
  #2 (permalink)  
Antiguo 04/02/2017, 20:41
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Buscador Java

Hola, no sé si esto te sirva pero cuando se trata de esas búsquedas uso left join:

"select * from productos p left join marcas m on p.proId = m.proId left join categorias c on p.proId = c.proId
where proNombre like ? or marNombre like ? or catNombre = ?"

eso con la consulta y creo que no eso sería indiferente los botones de opciones (radiobutton)

No sé que piensas, saludos.
  #3 (permalink)  
Antiguo 05/02/2017, 02:23
Usuario no validado
 
Fecha de Ingreso: abril-2012
Mensajes: 134
Antigüedad: 12 años
Puntos: 0
Respuesta: Buscador Java

Ante todo gracias por la respuesta, pero creo que no me he explicado bien, lo pongo esquematizado:

- TABLA PRODUCTOS: almaceno el ID de las MARCAS y CATEGORÍAS (He quitado el código de CATEGORÍAS para que no sea tan denso en el post ya que es igual que MARCAS pero en su tabla correspondiente).

- En teoría el tabla de la aplicación se tendría que mostrar el ID numérico de las MARCAS, pero para que le sea mas fácil a los usuarios, lo convierto en texto con un método que recupera los nombres a través de los id.

Como ejemplo cojo el ID de los PRODUCTOS, podría ser otro campo excepto MARCAS y CATEGORÍAS, cojo el texto introducido y lo busco con este método, donde campo es la columna donde buscar y valor el texto introducido
Código:
if (rbBuscarProductoPorId.isSelected()) {
   campo = "producto_id";
   listaProducto = pd.buscarProductoPorSeleccion(campo, valor);

}
- Ya tenemos en la tabla los nombres de las MARCAS en la tabla producto de la aplicación, ahora cada vez que escribimos una letra realiza el proceso de búsqueda.

- Aquí viene el "problema", que la búsqueda en la tabla PRODUCTOS tiene que ser por valores numéricos para que sea rápida y no afecte al rendimiento, pero eso es para mi como programador, el usuario lo que ve son NOMBRES, entonces lo que hago es que cada letra que escribe consulto en la tabla CATEGORÍA los ID que tienen como nombre esa letra (LIKE) y posteriormente hago el proceso de pasar los ID a la consulta de búsqueda en la tabla PRODUCTOS.

Para el caso de la búsqueda de MARCAS no me vale el código anterior por lo que explico, este es el código:

Código:
if (rbBuscarProductoPorMarca.isSelected()) {

   // Con este metodo busco los ID que contengan el valor que escribe (letra a letra)
   MarcaDAO md = new MarcaDAOImpl();
   listaIdMarcas = md.buscarIdMarcaPorNombre(valor);

  // Recorro los id que obtengo del texto introducido y busco los productos
  for (int i = 0; i < listaIdMarcas.size(); i++) {
      listaProducto.addAll(pd.buscarProductoPorMarca(listaIdMarcas.get(i)));
   }
}
Como veis, este proceso es más lento, ya que cada letra que escribe, instancia una clase, recorreo un bucle y realiza dos consultas a las BBDD.


- Entonces os pregunto si hay alguna alternativa que sea menos pesada u otra forma de realizar la búsqueda.

- La opción mas fácil, pero menos agradable para el usuario, es dejar el código de las categorías y las marcas, y cuando vaya a buscar por ellos consulte el código de la categoría en el apartado "Categorías" (caso menos común, ya que lo normales por nombre de producto o código).

Espero haber sido claro y me hayáis entendido.
  #4 (permalink)  
Antiguo 27/02/2017, 13:21
Avatar de DanX03  
Fecha de Ingreso: septiembre-2007
Ubicación: México D.F.
Mensajes: 148
Antigüedad: 16 años, 6 meses
Puntos: 3
Respuesta: Buscador Java

Por lo que entiendo es optimizar la busqueda que realizas conforme vaya ingresando los caracteres el usuario, lo que yo haria es que el sistema empiece a realizar la busqueda a partir de que haya ingresado n cantidad de caracteres en el campo de busqueda, ya que como lo tienes busca los registros a partir de que se ingresa el primer caracter, haciendo que este proceso se vuelva lento.
  #5 (permalink)  
Antiguo 01/03/2017, 07:45
Usuario no validado
 
Fecha de Ingreso: abril-2012
Mensajes: 134
Antigüedad: 12 años
Puntos: 0
Respuesta: Buscador Java

Cita:
Iniciado por DanX03 Ver Mensaje
Por lo que entiendo es optimizar la busqueda que realizas conforme vaya ingresando los caracteres el usuario, lo que yo haria es que el sistema empiece a realizar la busqueda a partir de que haya ingresado n cantidad de caracteres en el campo de busqueda, ya que como lo tienes busca los registros a partir de que se ingresa el primer caracter, haciendo que este proceso se vuelva lento.
Me gusta esa opción, de momento he dejado los ID numéricos, si no afecta mucho al rendimiento lo aplico.

Gracias

Etiquetas: buscador, set, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:08.