2012-04-06 14 views
6

Me estoy confundiendo un poco cuando intento configurar una búsqueda utilizando la búsqueda de texto completo en modo booleano. Ésta es la consulta que estoy usando:Búsqueda de texto completo de MySQL Confusión de modo booleano

$query = "SELECT *, 

     MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score 

     FROM results 

     WHERE MATCH(title) AGAINST('$q' IN BOOLEAN MODE) 

     ORDER BY score DESC"; 

Cuando ejecuto una búsqueda de +divorce+refinance, los resultados devueltos son:

1) Divorce: Paying Off Spouse = Rate/Term Refinance 
2) Divorce - What to Look Out For Regarding Divorced Borrowers 

Estoy en lo cierto al pensar que el segundo resultado no debería aparecer, ya que no tiene ambas palabras? Si no, ¿cómo puedo crear esa funcionalidad?

Respuesta

9

Quizás estoy equivocado, pero si busca esta cadena +divorce+refinance, obtendrá un resultado extraño. Si desea buscar ambas palabras, debe buscar +divorce +refinance (con un espacio entre).

he comprobado y se devuelve una sola fila:

Divorce: Paying Off Spouse = Rate/Term Refinance 
4

Su problema se refiere al crear una consulta booleana prioridad y para este tipo de una consulta tiene que ir a fondo de búsqueda de Boole y ahora cómo la búsqueda booleana se realiza. En palabras simples déjame explicarte por qué se muestra el resultado del segundo número del resultado.

Una vez, primero debe entender qué significa booleano en la programación? Significa que cualquiera de las condiciones es verdadera o falsa i, e 0 a 1.

¿Permítanme explicar por qué se realiza la búsqueda booleana? Usted ha dado dos palabras. Vamos a buscar la fila por fila en modo booleano. El motor de búsqueda inicia y busca la fila por fila ahora donde se encuentre la Primera palabra, hace que el registro sea verdadero y dé como 1 a las filas en las que se encuentra la primera palabra y también prepara el número de palabras encontradas en la fila.

Ahora se mueve la siguiente palabra y hacer el mismo proceso da el registro verdadero y hace una lista de registros dondequiera que se encuentre la palabra y también prepara el número de palabras encontradas en la fila.

Ahora hay dos filas de resultados disponibles y están apalancadas y con la prioridad se da a las palabras con el número máximo de palabras y la fila aquí es el principal problema.

Ejemplo

Primera >>> nos totales. >> Segundo >> total nos. >>> >> Finales fila
Palabra >>> Resultados >> >>>> Palabra de las palabras>>> Resultados >> >> ninguna respuesta


1 2 >>>>>>>> >>>>>>>> 1 >>>>>>>>> 1 >>>>>>>> 1.33 >>>> 1 >>> 1.33
0 >>>>>>>> 0> >>>>>>> 2 >>>>>>>>> 2 >>>>>>>> 1.25 >>>> 2 >>> 1.25
0 >>>>>>>> 0 >> >>>>>> 1 >>>>>>>>> 0 >>>>>>>> 1,25 >>>> 3 >>> 1

Mientras discotecas dos listas de resultados cuando la verdadera añadió con falso, el resultado es verdadero, como si agregas 1 + 0 = 1 y los resultados son d con valor mayor que 1. Por lo tanto, al calificar la relevancia de las palabras encontradas, siempre se encuentra que el motor de búsqueda muestra los resultados donde encontró alguna palabra.

Las consultas de relevancia de puntuación se realizan en dos tipos o bien ignoran los puntajes que son iguales a uno y solo hacen cálculos en los registros cuya puntuación es mayor que 1. Segundo es realizar una consulta que nunca muestre los registros iguales uno. Al igual que en su caso se puede por lo que las cosas de abajo también para obtener los resultados correctos para dos palabras:

SELECT *, ((1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE)))) AS score FROM results WHERE (MATCH(title, text) AGAINST ('+term +term2' IN BOOLEAN MODE)) HAVING relevance > 0 ORDER BY relevance DESC; 

Yo sé que el uso de la palabra tiene compone la consulta poco lento, pero no hay otra solución disponible. Espero que esto resuelva tu consulta.

Cuestiones relacionadas