hace poco cree un buscador mediante un sistema de busquedas que trabaja con regex desde php. para eso creo un directorio que le llamaremos searcher i otro data base es decir tendriamos por ejemplo en nuestro servidor /www/searcher/ i en el otro /wwww/DBS/ por ejemplo queremos añadir una entrada (desde nivel de usuario con html5/javascript/ajax) entramos la siguiente serie "the big bang theory" -> esto lo recoje el servidor i php crea los siguientes strings:
the(1)big(2)bang(3)theory(4)
big(2)the(1)bang(3)theory(4)
bang(3)the(1)big(2)theory(4)
theory(4)the(1)big(2)bang(3)
luego le sacamos un hash al string "the big bang theory" por ejemplo saldra algo asi ->jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg (bueno en teora saldra hexagesimal pero yo le suelo aplicar una base de 64 es decir 0-9a-zA-Z mas dos caracteres que puedan existir como files por ejemplo $& eso ya depende de que sistema de archivos tengas si es NTFS o EXT# o udf hfs+ ....)
creamos un array de esos strings, mediante bucle for creamos ficheros siguientes (todo desde logicamente php o ruby o el lenguaje de servidores que quieras normalmente son lenguajes creados desde c++) de manera que se crearan los siguientes archivos que seran vacios ya que meter informacion i ver dentro de un fichero siempre es mas lento que buscar directamente en los nombres. tendremos los siguientes ficheros:
/www/searcher/the(1)big(2)bang(3)theory(4)@jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg
/www/searcher/big(2)the(1)bang(3)theory(4)@jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg
/www/searcher/bang(3)the(1)big(2)theory(4)@jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg
/www/searcher/theory(4)the(1)big(2)bang(3)@jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg
a su vez se crea /www/DBS/jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg
dentro de este podemos meterle propiedades que luego recojera AJAX a visualizar o lo que quieras.
esto por lo que hace referencia al input de datos que quieres crear en tu searcher.
luego creamos una pagina searcher simplemente combinando ajax i metiendole evento onchange a la funcion ajax encaso de que el objeto del input es un input.text pero si es un div que sea contentEditable le tienes que añadir el evento mediante ->addEventListener('DOMCharacterDataModified',<funcion ajax>,false);
este te dara normalmente una advertencia de desaprobacion en la consola del browser pero a mi me va mejor ya que puedo modificarlo mas efectivamente que con el input
eso implica que cada vez que varies characters dentro del objetoInput se activara la funcion ajax asincronicamente. en mi caso la funcion ajax la paso por $_POST que implica que el envio de datos cuando escribimos por ejemplo "big" pasa por el header. Eso es recogido por el php que le indicamos dentro de la funcion ajax por ejemplo en mi caso sear.php lo que hace esta funcion es recoger $_POST i le mete un glob() dentro del directorio /www/searcher/ por ejemplo :
glob('/www/searcher/'.'*'.$_POST['<variableinput>']) esto te crea un array de todas las coincidencias de "big" en este caso te sacara las los cuatro strings se le vuelve ha hacer un bucle para que los que tengan apartir del needle "@" igual a jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg le pones que no se almacene en el array nuevo (bueno esto cada uno tiene su tecnica) luego saca un echo file_get_contents('jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg') claro ahi le pones lo que quieras le puedes meter codigo html45 ya directamente o o que quieras , tambien al hacer glob le puedes meter filtros como por ejemplo que el string de busqueda sea '*big' o en caso que sean dos palabras el string para glob sea 'big*bang*' eso cada uno como quiera que sea de preciso o el nivel de exactitud que quieres que trabaje tu buscador, asi puedes crear un sistema de archivos que trabaje como una base de datos parece ser bastante rapido en mi caso como trabajo con bases de datos de teras he creado una funcion que me detecta si el directorio tiene solo directorios o solo archivos en caso de que tengan mas de 1000 entradas los desdoblo es decir /www/searcher/t/h/e/the(1)big(2)bang(3)theory(4)@jifiojieqjhio0trgmkfvo0ijergmvopfenm9jg asi conseguimos que sea ultra rapido cosas a tener en cuenta creacion de nuestros propios characters toquens por ejemplo en el input no podemos poner @ pero en su caso lo podemos transformar el string en urlencoded para que en el input no aparezca "@" por ejemplo, es importante que los needles que utilizemos para nuestras funciones se tengan encuenta para evitar como he visto en algunos buscadores problemas en las busquedas. Luego tambien tened en cuenta el sistema de archivos que teneis metido en /www/searcher/ si el numero de entrada es grande no le pongas ext4 ya que para cada elemento por vacio que este te ocupara 4kb eso implica que en 1tb solo podremos añadir menos de 200 millones de entradas ya que le tienes que sumar la memoria utilizada por el sistema para las localizaciones del sistema de archivos. Esto que explico se puede hacer de muchas maneras i evidentemente mejorar la velocidad i tambien crear incluso sugerencias es decir cuando se escribe mal una palabra google lo primero que busca es en una zona de sugerenciasdonde reemplaza esa por otra que le da muchas mas coincidencias, un ejemplo seria:
/www/sugerencias/de@the
/www/sugerencias/te@the
tambien se puede aplicar eso mismo a las lenguas
/www/idiomas/el@the
/www/idiomas/eL@the
....
bueno el caso es que la rapidez de google es debido a que a la gran cantidad de memoria utilizada para hacer eso cerca de un hexabyte.
LA PREGUNTA:->
como crear el objeto utilizado en input que utilizo como un div contentEditable para que me haga un onchange sin que me de advertencias como en el caso de meterle el evento DOMCharacterDataModified?
[email protected]