1 .
Introducción
2 .
Índices de texto completo
3 .
MATCH() y AGAINST()
4 .
Relevancia
5 .
Búsquedas en modo booleano
6 .
Anotaciones finales
6.1 .
Restricciones en las búsquedas de texto completo
6.2 .
Afinación de búsquedas de texto completo
Cedido por MySQL Hispano.
Introducción
Seguramente alguna vez hemos tenido la necesidad de hacer algún tipo de búsqueda en nuestra base de datos. De hecho, es muy probable que hayamos hecho alguna búsqueda algo compleja sobre campos de tipo texto y el operador LIKE haya sido nuestra salvación. Pero la pregunta es, ¿sabemos como hacer este tipo de búsquedas de la manera más eficiente?. Vamos a ver si es cierto.
Una consulta tan común como esta:
SELECT * FROM algunaTabla WHERE algunaColumna LIKE "arte%"
MySQL la puede ejecutar muy rápidamente si la columna sobre la que se hace la búsqueda está indexada. En este caso MySQL busca a través del árbol-B que compone el índice para localizar todas las posibles coincidencias, encontrando "arte moderno", "arte culinario", "arte abstracto", etc. Sin embargo, si la búsqueda es menos específica, las cosas ya no son tan rápidas. Por ejemplo, para buscar "todo lo relacionado con arte", lo más probable es que tengamos que escribir una consulta como:
SELECT * FROM algunaTabla WHERE algunaColumna LIKE "%arte%"
En este caso, MySQL tiene mucho más trabajo que hacer. Ya que el texto que se busca no está al comienzo de la cadena, MySQL no puede simplemente buscar en el índice para encontrar las coincidencias. En lugar de esto, MySQL ejecuta un escaneo del índice, esto es, se lee cada nodo del índice y ejecuta una búsqueda en cada uno de ellos. Puesto que el índice es mucho más pequeño que la tabla, finalmente esto es mejor buscar a través de toda la tabla, pero definitivamente esto no es lo más eficiente.
Por otra parte, al ejecutar la consulta anterior, probablemente se encontrarán cadenas como las siguientes "me gusta pegarte", "artefactos explosivos" y "deja de quejarte". Oops. Si lo que estamos buscando es todo lo relacionado con el arte, seguramente no nos interesan estos resultados. En este caso podríamos escribir una expresión regular más compleja y usar RLIKE en lugar de LIKE para especificar exactamente que es lo que buscamos, sin embargo, MySQL no puede optimizar la consulta por las mismas razones expuestas anteriormente.
Aún si MySQL tuviera una manera de optimizar tales consultas, de cualquier manera puede que existan algunas cuestiones que MySQL no pueda resolver. Por ejemplo, si escribimos una consulta para buscar todos los registros donde aparezca "princesita", seguramente no deseamos todos los registros, sino únicamente los registros más relevantes. Si "princesita" ocurre 5 veces en un registro, será probablemente más relevante que otros registros en los que "princesita" ocurra una vez al final de la cadena.
Es más, a menudo una consulta es iniciada por alguién que no conoce nada acerca de MySQL. Por ejemplo, un usuario simplemente teclea alguna palabra en un formulario HTML y listo, espera obtener lo que está buscando. Este usuario puede aún escribir más de una palabra (ej. "linda princesita"), complicando la búsqueda aún más. Obviamente, una coincidencia es más relevante si las palabras son encontradas con cierta proximidad una de la otra, pero el SQL estándar no tiene manera de expresar una consulta de este tipo.
En fin, para tratar de dar solución a este tipo de situaciones, MySQL proporciona los índices y búsquedas de texto completo. Mientras esto no es nada nuevo ya que funciona desde la versión 3.23.23, las búsquedas de texto completo han sido mejoradas sustancialmente con cada nueva versión.
Para los ejemplos presentados en este artículo se usó la versión 4.0.14, la versión más reciente al momento de escribir este artículo.
Índices de texto completo
Los índices de texto completo son del tipo FULLTEXT, se usan en tablas del tipo MyISAM, y pueden contener uno o más campos del tipo CHAR, VARCHAR y TEXT. Un índice de texto completo está diseñado para facilitar y optimizar la búsqueda de palabras clave en tablas que tienen grandes cantidades de información en campos de texto.
Para crear un índice de texto completo tenemos básicamente dos opciones:
- Crear el índice al momento de crear la tabla.
CREATE TABLE nombreTabla( campo1 TIPO, campo2 TIPO,
FULLTEXT [nombreIndice] (campo1 [campo2,...]) );
- Crear el índice una vez que ha sido creada la tabla.
CREATE FULLTEXT INDEX nombreIndice ON nombreTabla(campo1 [,campo2,...]);
La siguiente sentencia también se puede usar para crear un índice cuando la tabla ya existe.
ALTER TABLE nombreTabla ADD FULTEXT [nombreIndice] (campo1 [,campo2,...]);
- Nota: En las instrucciones anteriores los elementos entre paréntesis cuadrados indican que son opcionales.
Cuando se tienen grandes cantidades de datos, es mucho más rápido cargar los datos en una tabla que no tiene índices de texto completo y después crear los índices necesarios, ya que la carga de datos en una tabla que ya tiene índices de este tipo es un proceso lento.
Vamos a crear una tabla e introducir algunos datos para mostrar el funcionamiento de las búsquedas de texto completo.
mysql> CREATE TABLE articulos(
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> titulo VARCHAR(200),
-> contenido TEXT,
-> FULLTEXT indice_tc(titulo,contenido) );
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO articulos VALUES
-> (0,'MySQL con Java en MSWindows',
-> 'En este artículo se explica como combinar las ...');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO articulos VALUES
-> (0,'Manejo de datos BLOB con PHP y MySQL',
-> 'Los detalles del almacenamiento y recuperación de ...');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO articulos VALUES
-> (0,'Tutorial básico de MySQL',
-> 'Se explica el uso del programa cliente mysql ...');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO articulos VALUES
-> (0,'MySQL con Java en Linux',
-> 'Conozca como utilizar estas dos herramientas ...');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO articulos VALUES
-> (0,'Manejo de campos BLOB con MySQL y Visual Basic',
-> 'En este artículo se explican los detalles del manejo ...');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO articulos VALUES
-> (0,'MySQL bajo MSWindows',
-> 'A continuación se explica el procedimiento de ...');
Query OK, 1 row affected (0.00 sec)
MATCH() y AGAINST()
Las búsquedas de texto completo son ejecutadas con la función MATCH(). Esta función ejecuta la búsqueda de una cadena en una colección de texto (un conjunto de una o más columnas incluídas en un índice FULLTEXT). La cadena que se busca es dada como un argumento en la función AGAINST(), y es ejecutada en modo no sensitivo, es decir, no importa el uso de mayúsculas y minúsculas.
- Nota: Por razones de espacio, en los ejemplos que se van a presentar a continuación no se muestra por completo la salida del campo contenido.
Este es el primer ejemplo. En la siguiente consulta se buscarán todos los artículos que hablen acerca de Java.
mysql> SELECT id, titulo, contenido FROM articulos
-> WHERE MATCH(titulo,contenido) AGAINST('Java');
+----+-----------------------------+---------------------------------+
| id | titulo | contenido |
+----+-----------------------------+---------------------------------+
| 1 | MySQL con Java en MSWindows | En este artículo se explica ... |
| 4 | MySQL con Java en Linux | Conozca como utilizar estas ... |
+----+-----------------------------+---------------------------------+
2 rows in set (0.00 sec)
Esta otra consulta busca los artículos que traten acerca de MySQL.
mysql> SELECT id, titulo, contenido FROM articulos
-> WHERE MATCH(titulo,contenido) AGAINST('MySQL');
Empty set (0.00 sec)
IMPORTANTE: en la consulta anterior no se regresó ningún resultado a pesar de que la palabra "MySQL" aparece en todos los registros que insertamos, esto se debe a que las palabras que aparecen en más del 50% de los campos son consideradas palabras que "hacen ruido", y no se toman en cuenta.
Podemos incluir más de una palabra en la búsqueda. En este ejemplo se busca información de Java o Visual.
mysql> SELECT id, titulo, contenido FROM articulos
-> WHERE MATCH(titulo,contenido) AGAINST('Java Visual');
+----+------------------------------------------------+----------------------+
| id | titulo | contenido |
+----+------------------------------------------------+----------------------+
| 5 | Manejo de campos BLOB con MySQL y Visual Basic | En este artículo ... |
| 1 | MySQL con Java en MSWindows | En este artículo ... |
| 4 | MySQL con Java en Linux | Conozca como utiliza |
+----+------------------------------------------------+----------------------+
3 rows in set (0.00 sec)
Debemos observar que al invertir el orden de las palabras de búsqueda se obtiene el mismo resultado.
mysql> SELECT id, titulo, contenido FROM articulos
-> WHERE MATCH(titulo,contenido) AGAINST('Visual Java');
+----+------------------------------------------------+----------------------+
| id | titulo | contenido |
+----+------------------------------------------------+----------------------+
| 5 | Manejo de campos BLOB con MySQL y Visual Basic | En este artículo ... |
| 1 | MySQL con Java en MSWindows | En este artículo ... |
| 4 | MySQL con Java en Linux | Conozca como utiliza |
+----+------------------------------------------------+----------------------+
3 rows in set (0.00 sec)
¿Qué sucede si nos interesa obtener los artículos que hablen acerca de PHP?. Seguramente ejecutaríamos una consulta como esta:
mysql> SELECT id, titulo, contenido FROM articulos
-> WHERE MATCH(titulo,contenido) AGAINST('PHP');
Empty set (0.00 sec)
IMPORTANTE: En la consulta anterior no se obtuvo ningún resultado a pesar de que la palabra "PHP" aparece por lo menos en uno de los registros, esto se debe a que las palabras de 3 o menos caracteres se excluyen de los índices.
Relevancia
Para cada fila de la tabla, la función MATCH() regresa un valor de relevancia, esto es un cierta medida entre la cadena que se busca y el texto en las columnas que se nombran en MATCH().
Cuando MATCH() se usa en una claúsula WHERE, como en los ejemplos anteriores, las filas son ordenadas automáticamente con los valores más altos de relevancia al inicio. En otras palabras, se devolverán primero las filas en las cuales la cadena que se busca presente una mayor coincidencia con los valores de las columnas que se especifican en la función MATCH(). Los valores de relevancia son números de punto flotante no negativos. Una relevancia 0 (cero) significa que no hubo ninguna coincidencia con la cadena buscada.
A continuación se muestra un ejemplo que recupera los valores de relevancia de manera explícita. Si no se especifica una cláusula ORDER BY o WHERE, las filas regresadas no son ordenadas.
mysql> SELECT id, titulo, MATCH(titulo,contenido) AGAINST('Java') AS rel
-> FROM articulos;
+----+------------------------------------------------+------------------+
| id | titulo | rel |
+----+------------------------------------------------+------------------+
| 1 | MySQL con Java en MSWindows | 0.63475016882867 |
| 2 | Manejo de datos BLOB con PHP y MySQL | 0 |
| 3 | Tutorial básico de MySQL | 0 |
| 4 | MySQL con Java en Linux | 0.63475016882867 |
| 5 | Manejo de campos BLOB con MySQL y Visual Basic | 0 |
| 6 | MySQL bajo MSWindows | 0 |
+----+------------------------------------------------+------------------+
6 rows in set (0.01 sec)
El siguiente ejemplo es ligeramente más complejo. Los resultados de la consulta serán ordenados de manera descendente de acuerdo a su valor de relevancia. Nótese que para lograr esto, se debe especificar la función MATCH() dos veces. Cabe mencionar que esto no causa una sobrecarga adicional al momento de ejecutar la consulta, ya que el optimizador de MySQL nota que las dos llamadas a la función MATCH() son idénticas e invoca el código para búsquedas de texto completo sólo una vez.
mysql> SELECT id, titulo,
-> MATCH(titulo,contenido) AGAINST('Java') AS relevancia
-> FROM articulos WHERE MATCH(titulo,contenido) AGAINST('Java');
+----+-----------------------------+------------------+
| id | titulo | relevancia |
+----+-----------------------------+------------------+
| 1 | MySQL con Java en MSWindows | 0.63475016882867 |
| 4 | MySQL con Java en Linux | 0.63475016882867 |
+----+-----------------------------+------------------+
2 rows in set (0.00 sec)
Para este ejemplo ambas filas contienen la palabra "Java", sin embargo el valor de la relevancia es ligeramente distinto. Esto se debe a lo siguiente. La relevancia es calculada basada en el número de palabras en una fila, el número de palabras únicas en esa fila, el número total de palabras en la colección, y el número de documentos (filas) que contienen una palabra en particular.
Este es otro ejemplo.
mysql> SELECT id, titulo,
-> MATCH(titulo,contenido) AGAINST('Java Linux') AS relevancia
-> FROM articulos WHERE
-> MATCH(titulo,contenido) AGAINST('Java Linux');
+----+-----------------------------+------------------+
| id | titulo | relevancia |
+----+-----------------------------+------------------+
| 4 | MySQL con Java en Linux | 2.1085944190665 |
| 1 | MySQL con Java en MSWindows | 0.63475016882867 |
+----+-----------------------------+------------------+
2 rows in set (0.00 sec)
En este caso, la relevancia es mayor para la primera fila ya que incluye ambas palabras que se buscan, Java y Linux.
Búsquedas en modo booleano
Desde la versión 4.0.1 MySQL puede ejecutar búsquedas de texto completo en modo booleano usando el modificador IN BOOLEAN MODE. Con esto, se tiene un mayor control acerca del tipo de tipo de búsquedas que se quieren hacer, por ejemplo, se pueden buscar palabras, combinaciones de palabras, porciones de palabras, etc.
Veamos un ejemplo:
mysql> SELECT id, titulo, contenido FROM articulos
-> WHERE MATCH(titulo,contenido)
-> AGAINST('+Java -Visual' IN BOOLEAN MODE);
+----+-----------------------------+--------------------------+
| id | titulo | contenido |
+----+-----------------------------+--------------------------+
| 1 | MySQL con Java en MSWindows | En este artículo se ... |
| 4 | MySQL con Java en Linux | Conozca como utilizar .. |
+----+-----------------------------+--------------------------+
2 rows in set (0.00 sec)
Esta consulta regresa todas las filas que tiene la palabra Java, pero que no contienen la palabra Visual.
Debemos señalar que las búsquedas en modo booleano no ordenan los resultados automáticamente de manera descendente de acuerdo a su relevancia.
Para las búsquedas en modo booleano se pueden usar los siguiente operadores:
- +
- Indica que la palabra debe estar presente en cada fila regresada.
- -
- Indica que la palabra no debe estar presente en ninguna de las filas regresadas. Por default (cuando no se especifica un signo más o un signo menos) la palabra es opcional, pero las filas que las contienen tendrán una mayor puntuación. Con esto se imita el comportamiento de las funciones MATCH()... AGAINTS() sin el modificador IN BOOLEAN MODE.
- < >
- Son usados para cambiar la contribución de una palabra al valor de relevancia que es asignado a una fila. El operador < decrementa la contribución y el operador > la incrementa.
- ( )
- Son usados para agrupar palabras en subexpresiones.
- ~
- Actua como un operador de negación, causando que la contribución de una palabra al valor de relevancia de una fila sea negativo.
- *
- Indica cero o más caracteres, y debe ser usado únicamente al final de una palabra.
- "
- La frase que es encerrada entre comillas dobles coincide sólo con las filas que contienen dicha frase de manera literal.
A continuación se muestran algunos ejemplos.
- La fila debe contener por lo menos una de estas palabras, mysql o java.
SELECT * FROM articulos WHERE MATCH(titulo,contenido)
AGAINST('mysql java' IN BOOLEAN MODE);
- La fila debe contener ambas palabras, mysql y linux.
SELECT * FROM articulos WHERE MATCH(titulo,contenido)
AGAINST('+mysql +linux' IN BOOLEAN MODE);
- La fila debe contener la palabra mysql, pero tendrá una mayor relevancia si también contiene la palabra java.
SELECT * FROM articulos WHERE MATCH(titulo,contenido)
AGAINST('+mysql java' IN BOOLEAN MODE);
- La fila debe contener la palabra mysql, pero no la palabra visual.
SELECT * FROM articulos WHERE MATCH(titulo,contenido)
AGAINST('+mysql -visual' IN BOOLEAN MODE);
- La fila debe contener mysql y linux, o mysql y mswindows (en cualquier orden), pero tendrá una mayor relevancia mysql linux que mysql mswindows.
SELECT * FROM articulos WHERE MATCH(titulo,contenido)
AGAINST('+mysql +(>linux <mswindows)' IN BOOLEAN MODE);
- La fila puede contener mysql, mysqldump, mysqladmin, mysqlshow, etc.
SELECT * FROM articulos WHERE MATCH(titulo,contenido)
AGAINST('mysql*' IN BOOLEAN MODE);
- La fila debe contener exactamente el texto MySQL con Java en Linux.
SELECT * FROM articulos WHERE
MATCH(titulo,contenido) AGAINST('"MySQL con Java en Linux"' IN BOOLEAN MODE);
Esta última consulta ya la habíamos hecho anteriormente. Buscamos los artículos que traten acerca de mysql, pero ahora en modo booleano.
SELECT * FROM articulos WHERE
MATCH(titulo,contenido) AGAINST('mysql' IN BOOLEAN MODE);
IMPORTANTE: Debemos notar que en modo booleano ya se encuentran resultados para mysql, lo que no sucedió en un ejemplo anterior que presentamos. La consulta que habíamos hecho era:
SELECT * FROM articulos WHERE
MATCH(titulo,contenido) AGAINST('mysql');
La explicación que dimos acerca de porque no se regresaba ningún resultado en esta consulta es que la palabra "MySQL" aparecía en más del 50% de los registros que insertamos, que se le consideraba una palabra que "hacía ruido", y por lo tanto no se le había tomado en cuenta, se le ignoraba.
Para las búsqueda en modo booleano, esto del 50% ya no es válido.
Anotaciones finales
Restricciones en las búsquedas de texto completo
- Todos los parámetros de la función MATCH() deben ser columnas de la misma tabla que es parte del índice FULLTEXT, a menos que la función MATCH() se use en modo booleano.
- La lista de parámetros en la función MATCH() debe coincidir exactamente con la lista de columnas en la definición de algún índice FULLTEXT, a menos que la función MATCH() se use en modo booleano.
- El argumento de AGAINST() debe ser una cadena constante.
Afinación de búsquedas de texto completo
Desafortunadamente las búsquedas de texto completo actualmente tienen pocos parámetros que se pueden afinar o modificar.
La longitud mínima de las palabras para ser indexadas está definida por la variable ft_min_word_len. Este valor se puede cambiar de acuerdo a nuestras preferencias, sin embargo, es necesario reconstruir posteriormente los índices. (Esta variable está disponible únicamente para la versión 4.0 y posteriores)
La lista de palabras stopword puede ser cargada desde un archivo especificado por la variable ft_stopword_file. También es necesario reconstruir los índices después de modificar el valor de esta variable. Las palabras stopword son aquellas que no se indexan por ser demasiado comunes (en inglés, the, and, to, for, so, etc). (Esta variable está disponible a partir de la versión 4.0.10 de MySQL)
Para cuando se requiera volver a construir los índices de texto completo, la manera más fácil de hacer esto es usar la siguiente sentencia:
REPAIR TABLE nombreTabla QUICK
Últimos comentarios
Últimos 5 comentarios
Paga tus estudios o deudas!!! Increible (07/03/2008)
Por
Quieres pagar tus deudas!!!!!!
\"ATENCIÓN: METODO COMPROBADO PARA GANAR DINERO FACIL Y LEGALMENTE\".
La mejor forma de ganar dinero rápido.
Si realmente quiere saber si esto funciona, observa por ti mismo, y solo ve, cuanta gente esta haciendo esto. Si esto no te convence, nada lo hará. No dejes pasar esta oportunidad, yo no lo creía pero me convencí y ahora toda mi familia y amigos estamos mejorando nuestra vida. No tienes nada que perder pero si mucho que ganar. Te darás cuenta que es algo verdaderamente ingenioso y que resulta. Te hará ganar unos cuantos euros y solo cuesta 6 billetes de cinco euros, y eso no es nada comparado con lo que podría reportarte si dedicas un poco de tiempo.
Permíteme decirte como lo encontré. Y eso que detesto esos esquemas de marketing con varios niveles, o de hacer órdenes por correo, o poniendo propagandas en sobres de correo, etc., la lista es interminable. Estaba navegando por los grupos (GOOGLE, YAHOO, ETC.), cuando vi un artículo que decía algo de conseguir dinero rápido. \"Bueno, me dije a mi mismo, tengo que ver que tipo de esquema pueden presentar en Internet\". Este artículo describía la manera de mandar por correo 1 billete de cinco euros a solo 6 personas y ganar 250.000 en efectivo en 4 semanas. Bueno, cuanto más pensé acerca de esto mas ansioso estaba. Así que concluí: claro debe de ser una estafa. Pero, como la mayoría de nosotros, estaba curioso y emocionado, así que seguí leyendo. Después de meditarlo y consultarlo con algunas personas decidí intentarlo. Realmente vale tan solo 6 billetes de cinco euros y 6 sellos de correo. He gastado más comprando la lotería y nunca he ganado.
Esto no es una estafa; no es indecente, no es ilegal, y es 99% libre de riesgo. Realmente funciona si te apegas a las instrucciones, recibirás extraordinarios dividendos. Cabe resaltar, también, que este sistema ha cumplido su ciclo natural, es decir, ha comprobado su efectividad y con excelentes resultados. Asimismo, este sistema no requiere contacto físico con la gente, tampoco requiere de un trabajo pesado o difícil, y no tendrá que salir de casa excepto para recoger su correo. Este es un programa de soporte electrónico que aprovecha la plataforma mundial de Internet, lo que garantiza su funcionamiento en forma perfecta, el 100 % de las veces. Miles de personas han recurrido a este medio para obtener buenos capitales y así iniciar su propio negocio. Básicamente, se hace posible a través de una cadena que se dirige a miles de personas y que se hará realidad también para usted solo con su colaboración.
Por eso le recomiendo SEGUIR CUIDADOSA Y EXACTAMENTE LAS INSTRUCCIONES DE ESTA CARTA, recalcándole una vez. Además, es 100 % seguro y no se arrepentirá de haber leído este artículo y puesto en práctica...
Comparte dinero y reciba dinero rápido... por correo, \"das, y recibirás!\"
Esto realmente funciona. Léelo por favor, te conviene, léelo!! Dinero rápido!! Esto en verdad funciona.
ATENCIÓN: Lee esto cuidadosamente! Es una buena idea imprimir estas hojas como referencia en el caso de que tengas dudas, pero no es que sea necesario.
INSTRUCCIONES:
PASO 1:
Consigue 6 hojas de papel blanco y escribe lo siguiente:
\"Por favor incluya mi nombre en su lista dew correspondencia o e-mail\", o \"Please add my name to your list\".
Luego,w escribe también: tu nombre, dirección y correo electrónico (e-mail).
Yw como un lindo detalle pon también en cual posición figura el destinatario cuando le enviaste tu billete de cinco euros (Ej.: \"Esta en la posición 3\" o \"You are in slot 3\"), como para hacerlo mas completo.
Dobla ésta página donde hazw escrito lo anterior, y mete 1 billete de cinco euros en medio, no mandes cheques ni otro tipo de pagos, solo billetes de cinco euros.
Consigue 6 sobres, yw escribe en cada uno, la dirección de cada una de las personas listadas aquí abajo, y pon adentro las 6 hojas con el billete de cinco euros en medio.
La idea de doblar el papel y de meter el billete de cinco euros en medio es para asegurar que va a llegar a su destino y eso es importante. De otra manera la gente que trabaja en el correo podría detectar que se trata de dinero y quedarse con los miles de sobres que te van llegando; de manera que se recomienda envolver todo, adicionalmente, en un papel oscuro o de carbón para que no se vea a través del sobre.
Lo que estas haciendo es crear un servicio y como tal, lo hace completamente legal. A partir de ahora no estas mandándole un billete de cinco euros a alguna persona sin ningún motivo, estas pagando un billete de cinco euros por un legitimo servicio, \"que incluya tu nombre en su correspondencia!\" (te aseguro, de nuevo, que esto es completamente legal).
Envía los 6 sobres a las siguientes direcciones:
1. FRANCISCO NAVARRO BERNAL
C/ MIGUEL HERNANDEZ Nº 8
LOS TORRAOS - CEUTI
MURCIA
ESPAÑA
2. JUANA GARCIA ROMERO
NTRO. PADRE JESUS NAZARENO,8
11648 ESPERA (CADIZ)
ESPAÑA
3. TERESA ARQUEROS MOLTO
APARTADO DE CORREOS 207
46192 MONSERRAT (VALENCIA)
ESPAÑA
4. JOSE EDUARDO ALFARO FALLAS
50 METROS ESTE DEL BANCO CUSCATLAN
CASA COLOR LADRILLO A MANO DERECHA
ALAJUELA CENTRO, COSTA RICA.
5. MIREN BEJARANO GARCIA
C/ ETXEGORRI Nº10-1D
ASTRABUDUA 48950 BIZKAIA
(ESPAÑA)
6. PEDRO ORLANDO CALLE RUFFO
CALLE ISMAEL VASQUEZ N819 ESQ. PAPA PAULO
COCHABAMBA
BOLIVIA
PASO 2:
En primer lugar, tú no necesitas redactar de nuevo toda esta carta para hacer la tuya propia. Solamente pon el cursor del Mouse o ratón al inicio de esta carta y arrastra hacia abajo de manera que todo el texto quede \"sombreado\". Después, presiona la teclas CTRL+C, de esta forma queda en la memoria de tu computadora. Luego, abre una aplicación preferiblemente Microsoft Word, Bloc de Notas (NOTEPAD) o Wordpad. Luego, una vez abierta cualquiera de estas aplicaciones coloca el cursor al inicio de una hoja en blanco y presiona CTRL+V, y ya tendrás esta carta. Si quieres, cambia, todo lo que creas conveniente de este artículo, pero trata de mantenerlo lo más cercano posible al original. Ahora podrás agregar tu nombre y dirección en el #6 siguiendo las instrucciones siguientes:
Escucha con cuidado, esta es la forma de como vas a recibir dinero por correo.
Mira la lista de las 6 personas, borra el nombre #1 de la lista de arriba, y agrega el tuyo al final de ella. Así que el que era #2 pasa a ser #1, el que era #3 pasa a ser #2, el que era el #4 pasa a ser #3, el que era #5 pasa a ser #4, yo que era en el #6 paso a ser #5, y tu eres ahora el número 6; escribe en la posición 6: tu nombre, dirección, C.P., ciudad, provincia y país.
Por ultimo guarda esta carta con tus cambios en un nuevo archivo de la aplicación. Es todo.
PASO 3:
Ahora pon tu articulo en por lo menos 200 NEWSGROUPS, también llamados Foros de Discusión o Grupos de Noticias (existen más de 24.000 grupos). Solo necesitas 200, pero cuanto mas cantidad pongas, mas dinero te llegara. Aquí van algunas indicaciones de cómo introducirse en los NEWSGROUPS.
COMO MANEJAR LOS NEWSGROUPS:
Todo lo que tienes que hacer ahora es meterte en diferentes \"newsgroups\", foros, clasificados, o anuncios gratis, etc. y publicarlo. Recuerda que cada vez que quieras hacerlo bastara con abrir el archivo guardado, copiarlo y pegarlo en el Área de mensaje del newsgroup, o clasificado, foro o anuncio gratis, etc. Para llegar a ellos en cualquier buscador pon estos términos: newsgroups, foros de discusión, clasificados, anuncios gratis o guestbooks; y aparecerán miles de paginas. No olvides publicar todo el anuncio (esta carta), pero con tu nombre en la posición 6, desapareciendo el 1; cuando ya tengas práctica solo te tomara unos 30 segundos por cada newsgroup.
Se recomienda, además, que cuando publiques la descripción de este articulo trates de darle un nombre que \"atrape\", como \"Necesita dinero rápido ?, lea este articulo\" o \"Necesita dinero para pagar sus deudas?\", \"Baje este archivo y lea como puede recibir dinero por correo\" etc.
Y no así: \"Gana millones en 1 semana\", porque nadie te tomara en serio.
Recuerda, cuantos mas newsgroups consigas, mas respuestas (y dinero) recibirás!! Pero debes entrar por lo menos en 200.¡ya esta! tú estarás recibiendo dinero de todo el mundo, de lugares que ni conoces, y en unos pocos días.
Asegúrate de que todas las direcciones estén correctas!
Ahora el POR QUE se puede ganar tanto:
De 200 anuncios enviados, digamos que solo recibes 6 respuestas (bajísimo ejemplo). Si solo 6 personas responden, esto hace: 6 billetes de cinco euros. Ahora estos 6 mandan a 200 más, y otra vez digamos que solo 6 responden, esto hace 6 x 6 = 36 billetes de cinco euros que vas a recibir, y ya estas a la posición 5. De estos 6, otras 6 respuestas: 36 x 6 = 216 billetes de cinco euros, estas en la posición 4. De estos, 6 mas: 216 x 6 = 1.296 billetes de cinco euros, estas en el 3. De estos 6 mas: 1296 x 6 = 7.776 billetes de cinco euros, estas en el #2. Y finalmente, 46.656 billetes de cinco euros, cuando llegas a la posición #1.
ULTIMO PASO: Y este es el paso que más me gusta
Simplemente siéntate y disfruta, porque el efectivo viene en camino!
Espera ver un poquito de dinero durante la segunda semana, pero a partir de la tercera semana, tormenta de sobres en tu correo. Todo lo que tienes que hacer es recibirlo y trata de no gritar muy fuerte, cuando te des cuenta de que ésta vez lo lograste!
Recuerda! Hacer esto de forma CORRECTA, LIMPIA Y HONESTA y funcionara con toda seguridad. Solamente tienes que ser honesto. No necesitas hacer trucos con la básica de hacer dinero en esto! Dicho sea de paso, que si tu defraudas a las personas poniendo mensajes con tu nombre y no envías ningún dinero a los demás de la lista, tu no recibirás casi NADA!!. He conversado con personas que conocieron personas que hicieron esto y solo llegaron a colectar unos $150.00, y eso después de unas 7 semanas. Algunos decidieron probar otra vez, haciéndolo correctamente, y en 4-5 semanas recibieron más de 100.000 euros Recuerda el dicho: \"Das y recibirás!\" Esta es la más limpia y honesta manera de compartir fortuna que yo jamás haya visto, sin costarnos mucho excepto un poco de tiempo. Cuando te empieces a quedar corto de dinero, reactiva éste archivo y re-publica en los mismos lugares en que los vas a hacer ahora, o nuevos lugares que conocerás en el futuro.
Solo un apunte más, si sabes traducir todo este mensaje a otros
idiomas, puedes además, insértalos en foros de distintos países como,
Francia, Alemania, Rusia (esto lo digo como consejo para expandir las
posibilidades de que lo vea mucha mas gente).
MIL GRACIAS (29/02/2008)
Por
Muchísimas gracias por escribir este articulo, me has salvado la vida, tenía exactamente un problema con la búsqueda de texto completo y no sabia de que forma resolverlo. Soy nueva en todo esto pero se me hace un tema muy interesante y gratificante cuando te corre código. De nuevo muchísimas gracias:)
Gracias por la info (23/05/2007)
Por
Muchas gracias no pensé que se pudiera buscar texto completo en una base de datos, me va a servir mucho.
ElGame - programacion
Increíble - 10 puntos - ¡Felicitaciones! (14/02/2006)
Por
Realmente increíble, está tan sencillo que alguien sin conocimientos de programación pueda hacerlo, y tan profundo que tiene lo que buscaba y no encontraba para mejorar las búsquedas con el \\\"IN BOOLEAN MODE\\\". Mis felicitaciones por un artículo tan completo, tan sencillo y con tantos ejemplos!!!
asas (02/06/2005)
Por
asas