Buscar palabras de una cadena


([N1] joserb) #1

Hola.

Estoy buscando una forma óptima de una especie de buscador web, donde localizar las distintas palabras en una tabla que tiene una descripción.

He montado una función que elimina los artículos y preposiciones pero no encuentro una función que desgrane las palabras en un array o similar.

¿Sabe alguien si existe algo? (para no romperme los cuernos a lo tonto)

Gracias.


([N4] innovadb) #2

Creo que es mucho mas simple de lo que haces.

 

En la tabla creas un  indice por palabras, le añades el/los campos necesarios y la lista negra de palabras que no quieras indexar.

 

Si haces una busqueda por ese indice ya está.

 

Si buscas pepito, tendrás una lista con todos los registros que contengan esa palabra, da igual que la tengan 1 ó 40 veces.

 

Un saludo

 


([N1] joserb) #3

Gracias innovadb, como me imaginaba me estaba liando ;-)

Para una búsqueda de "todas las palabras" me funciona, pero para que me busque sólo algunas? ¿Se pueden utilizar expresiones regulares o similar?

Gracias de nuevo!!


([N4] innovadb) #4

En el componente de busqueda que usa el indice por palabras le puedes especificar si quieres que busque los registros que contengan todas las palabras o solo alguna de ellas con solo poner un 0 ó un 1.

 

Mira la flecha en la imagen.

 

Un saludo

[attachment=9391,932]


([N1] Rafael) #5

Esta opción valdría si queires buscar la intersección de palabras, es decir: Todos los registros que en dicho campo tengan todas las palabras.

Sin embargo, creo que lo que pretende joserb2.yahoo es tener un campo en el que poner varias palabras y que busque cualquier registro que contenga cualquiera de esas palabras en un campo determinado, ¿No es así?


([N4] innovadb) #6

Si ponemos un 0 en "Todas las palabras" hace precisamente eso, busca cualquier registro que contenga cualquiera de las palabras escritas.

 

Ademas para poner los valores 0 ó 1 podemos usar una formula o una variable, con lo que podemos pasarle un parámetro a un proceso y que funcione de las dos formas.

 

Un saludo


([N1] joserb) #7

Sí, es lo que comenta rzaragoza, pero lo que indica innovadb funciona, con 1 localiza las que tiene todas las palabras y 0 algunas.

Lo que me pasa ahora es que diferencia singulares y plurales, es decir, si "migrañas" y en el campo hay "migraña" no lo da como ok. Creo que además tendré problemas con casos como "colores", si busco "color". Necesitaría el comodín * o % ;-)

Gracias a los dos por vuestra atención!


([N4] innovadb) #8

Para los plurales puedes usar un indice por trozos, el unico inconveniente es que el numero de resultados puede ser mayor de lo esperado.

 

Si buscas "color" aparecerán colores, coloreado, coloreando etc.. pero igual te sirve.

 

Un saludo


([N1] joserb) #9

innovadb, Precisamente es lo que me puse a comprobar y efectivamente es la solución.

Tendré dos botones, uno para buscar todas las palabras, utilizando el índice por palabras y otro para buscar por algunas palabras para lo que se utiliza el índice por trozos.

Muchas gracias de nuevo!!


([N1] joserb) #10

Uhm, tengo que corregirme, no va del todo bien.

Al buscar por trozos me encuentra partes de las palabras que haya buscado pero no "algunas", si no todas! con lo que se reduce el resultado.

Un ejemplo:

  Tengo datos donde se buscará con las siguientes cadenas:

   Hojas de colores con tonos azules
   Color azul
   Hoja arrugada color azul

Si hago una búsqueda por "hoja color", sólo me salen dos resultados, ignorándome el segundo item pues no tiene la palabra hoja.

Yo lo que busco es que encuentre cualquiera de ellas. Para una búsqueda más estricta tendría la búsqueda por el índice por palabras.

Espero haberme explicado


([N1] Velasco) #11

Buenas.

Si buscas por trozos la cosa es que no puedes elegir si quieres o no todas las palabras por lo que al poner mas palabras va cruzando.

Lo mejor es buscar por palabras y poniendo a cero el que busque por todas las palabras.

Pd: Mira que es fácil controlarlo con este valor y yo haciendo búsquedas complejas ;)

Un saludo.

 

 

 


Jorge Velasco Fernández

jvelasco@theseedsc.com

www.theseedsc.com


([N4] innovadb) #12

A ver si esto te sirve.

 

En un proceso creas una cesta local, y por cada trozo a buscar disparas una busqueda y añades los registros a la cesta. Despues la procesas y ya está.

 

Te adjunto una imagen aun que no lo probé.

 

Un saludo

[attachment=9405,934]


([N1] joserb) #13

Bueno, parece que está pero con matices, os explico:

El índice por trozos no tiene Lista Negra, corregirme si me equivoco, con lo que se me vuelve a presentar el problema de las preposiciones, etc., por lo que he vuelto a tirar de la función que hace ese trabajo y "limpia" la cadena a buscar.

El resto, más o menos lo indicado por innovadb salvo que no utilizo la cesta, si no que envío directamente a la rejilla donde muestro las coincidencias.

También he sacado el "Crear manejador" fuera del bucle, pues me imagino que instanciará un objeto cada vez que se llama lo que consumirá recursos (es todo conjeturas mías).

Comentar que dentro del bucle modifico la variable global BUSCA_ALFA pues es la que utiliza el buscador.

PD. Sigo haciendo pruebas pero creo que está bastante afinado.

Saludos y gracias de nuevo a todos!!

[attachment=9410,935]