Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] MATCH y AGGAINST

Estas en el tema de MATCH y AGGAINST en el foro de PHP en Foros del Web. Hola, he realizado un buscado que "funciona" correctamente. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original //Buscador de palabras                 ...
  #1 (permalink)  
Antiguo 23/12/2014, 08:57
 
Fecha de Ingreso: febrero-2014
Mensajes: 46
Antigüedad: 10 años, 2 meses
Puntos: 1
MATCH y AGGAINST

Hola, he realizado un buscado que "funciona" correctamente.

Código PHP:
Ver original
  1. //Buscador de palabras
  2.                     $search = mysqli_query($db, "SELECT *, MATCH(title,message) AGAINST ('".urldecode($_GET['s'])."' IN BOOLEAN MODE) AS orden FROM news WHERE MATCH(title,message) AGAINST ('".urldecode($_GET['s'])."' IN BOOLEAN MODE) ORDER BY orden DESC");
  3.                     echo mysqli_error($db);
  4.                     while($search1 = mysqli_fetch_array($search)){
  5.                         echo $search1['title'];
  6.                     }
Lo tengo como FULLTEXT y el Motor de almacenamiento es MyISAM

La base de dato la tengo asin:
Código SQL:
Ver original
  1. Title                  | Message
  2. ___________________________________________
  3. This IS a prueba       | Jajajajaja
  4. Whatja                 | jejejeje
Al realizar esta busqueda "This is a" no me aparece los resultados pero al buscar "Whatja" si aparece los resultados, ¿Porque?
  #2 (permalink)  
Antiguo 23/12/2014, 09:45
Avatar de Mahalo  
Fecha de Ingreso: julio-2004
Ubicación: Mallorca (Illes Balears)
Mensajes: 1.121
Antigüedad: 19 años, 9 meses
Puntos: 12
Respuesta: MATCH y AGGAINST

Yo lo uso de una manera más simple y me va bien:
Código PHP:
$sql "SELECT *
FROM tabla
WHERE MATCH (nombre, texto)
AGAINST ('{$_GET['words']}')"

Como ves, pillo las palabras clave desde el get.
Saludos!
__________________
Los ignorantes se empeñan en enseñar. Los sabios en aprender.
SourceForge
  #3 (permalink)  
Antiguo 23/12/2014, 10:09
 
Fecha de Ingreso: febrero-2014
Mensajes: 46
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: MATCH y AGGAINST

Cita:
Iniciado por Mahalo Ver Mensaje
Yo lo uso de una manera más simple y me va bien:
Código PHP:
$sql "SELECT *
FROM tabla
WHERE MATCH (nombre, texto)
AGAINST ('{$_GET['words']}')"

Como ves, pillo las palabras clave desde el get.
Saludos!
Yo tambien obtengo la palabra con GET.

Sigo obteniendo los mismos resultado si lo hago a tu manera.
  #4 (permalink)  
Antiguo 23/12/2014, 10:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: MATCH y AGGAINST

Necesitas leer un poco más de índices FULLTEXT y el uso de MATCH()... AGAINST(), pero es tema off topic de PHP, es para tratar en el foro de MySQL, porque es de Bases de datos.
La respuesta básica es simple: Los índices FULLTEXT trabajan con una longitud de palabra mínima de cinco (5) caracteres, considerados estos independientemente de si está en una frase buscada o no, porque lo que lo que los índices ordenan son palabras y no textos completos.
Si te fijas con cuidado, ninguna de las palabras de la frase que buscas tiene como mínimo cinco letras, y por tanto la base no puede determinar la relevancia de ninguna. Ergo, no son significativas y las descarta. Por eso no devuelve lo que buscas.
En cambio, la segunda prueba contiene "Whatja", con seis (6) letras y esa si puede ser indexada.

¿Se va entendiendo?

Recuerda: No se categorizan frases, sino palabras. Lo que la query busca es la relevancia combinada entre todos los valores de la frase que se han indexado.

¿Por qué no se ponen menos letras como mínimo? Bueno, es muy simple: Con menos serían tantas las coincidencias que perdería sentido el calculo de relevancia, y sería preferible barrer toda la tabla.... Es un problema de optimización de consultas: Cuando las coincidencias superan cierto límite, MySQL (y cualquier DBMS) descartan el índice y leen las tablas completas, que en tu caso es una muy mala idea...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/12/2014, 11:03
 
Fecha de Ingreso: febrero-2014
Mensajes: 46
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: MATCH y AGGAINST

Ahh, gracias tenia entendido que eran como minimo 3 letras y no 5.
  #6 (permalink)  
Antiguo 23/12/2014, 11:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: MATCH y AGGAINST

No se usan tres (3) letras por default en la configuración de MySQL porque el índice de coincidencias sería altísimo.
Imagíante que quieres buscar la palabra "del".... ¿Cuántas veces te parece que puede usarse "del" en un texto en neustro idioma? ¿O "and" en inglés?

¿Se entiende el problema?

Esto no impllica que nopuedas reconfirgurarlo, pero no se considera conveniente porque le nivel de resultados basura sería enorme.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 23/12/2014, 11:43
 
Fecha de Ingreso: febrero-2014
Mensajes: 46
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: MATCH y AGGAINST

Todo solucionado, muchas gracias

Etiquetas: match, mysql, select
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 22:23.