2012-04-06 12 views
6

Mi viene un po 'di confusione quando cerco di impostare una ricerca che utilizza la ricerca full-text in modalità booleana. Ecco la domanda che sto usando:Ricerca fulltext di MySQL Confusione in modalità booleana

$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"; 

Quando eseguo una ricerca di +divorce+refinance, i risultati restituiti sono:

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

Ho ragione di pensare che il secondo risultato non deve essere visualizzato, in quanto non ha entrambe le parole? In caso contrario, come posso creare quella funzionalità?

risposta

9

Forse mi sbaglio, ma se cerchi questa stringa +divorce+refinance ottieni uno strano risultato. Se si desidera cercare entrambe le parole, è necessario cercare +divorce +refinance (con uno spazio tra).

ho testato e restituisce una sola riga:

Divorce: Paying Off Spouse = Rate/Term Refinance 
4

vostro problema riguarda il creare una query booleana priorità e per questo tipo di una query deve andare in profondità di ricerca booleana e ora come la ricerca booleana viene eseguita. In parole semplici, ti spiego perché viene mostrato il risultato del secondo numero di risultati.

Una volta deve prima capire che cosa significa Boolean nella programmazione? Significa che la condizione è vera o falsa i, e da 0 a 1.

Ora mi spiego per la ricerca booleana eseguita? Hai dato due parole. Cerchiamo di cercare la riga per riga in modalità booleana. Il motore di ricerca si avvia e ricerca la riga per riga ora dove viene trovata la prima parola, rende il record vero e dà il punteggio come 1 alle righe in cui viene trovata la prima parola e prepara anche il numero di parole trovate nella riga.

Ora sposta la parola successiva e fa lo stesso processo fornisce il record Vero e crea un elenco di record ovunque sia trovata la parola e prepara anche il numero di parole trovate nella riga.

Ora ci sono due righe di risultati disponibili e sono bastonati e con la priorità viene data alle parole con il numero massimo di parole e la riga qui è il problema principale.

Esempio

Prima >>> nos totali. >> Secondo >> numero totale >>> >> finali fila
Word >>> Risultati >> >>>> Parola di parole>>> Risultati >> >> senza risposta


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

Mentre in discoteca due elenchi dei risultati quando il vero aggiunto con false quindi il risultato è vero, come se si aggiungesse 1 + 0 = 1 e i risultati siano shoul d con valore superiore a 1. Quindi, mentre si valuta la rilevanza per le parole trovate, si trova sempre che il motore di ricerca mostra i risultati dove ha trovato una parola.

Le query di rilevanza del calcolo vengono eseguite in due tipi o ignorano i punteggi che sono uguali a uno e fanno solo calcoli sui record il cui punteggio è maggiore di 1. Il secondo è effettuare una query di questo tipo che non mostra mai i record uguali a uno. Come nel tuo caso è possibile in modo che le cose qui sotto anche per ottenere i risultati corretti per due parole:

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; 

so che usare la parola che ha rendere la query po 'lento ma non c'è altra soluzione disponibile. Spero che questo risolva la tua richiesta.

Problemi correlati