Al momento ho un singolo campo di ricerca la ricerca contro le colonne multiple utilizzando questo codice:Come fare un multiplo di ricerca colonna di mysql documento in cui le parole parziali sono abbinati
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE ";
$i=0;
foreach ($searchArray as $word) {
if ($i != 0) $query .= " OR ";
$query .= " MATCH (`first_name`, `last_name`, `email`) AGAINST ('".$word."*' IN BOOLEAN MODE)";
$i++;
}
Diciamo che ho queste due righe della tabella:
id | last_name | first_name | email
1 | Smith | John | [email protected]
2 | Smith | Bob | [email protected]
Se si digita "John S", solo il primo risultato mostra qual è il comportamento desiderato.
Se si digita "John Smith", solo il primo risultato mostra qual è il comportamento desiderato.
Se si digita "Smith J", entrambi i risultati mostrano anche se Bob non è una corrispondenza.
Se si digita "Smith John", entrambi i risultati mostrano anche se Bob non è una corrispondenza.
Infine, se si digita "Jo S", non vengono restituiti risultati nonostante la corrispondenza parziale su "Jo" e "S".
Qualcuno può aiutarmi a risolvere la mia query per gestire la funzionalità desiderata dell'ordine che non corrisponde a risultati parziali e importanti? Se può essere ordinato secondo le migliori corrispondenze (vale a dire la parte più lunga della parola, a partire dalla prima lettera solo non una sezione nel mezzo, nel più alto numero di colonne), ciò sarebbe di grande aiuto anche.
UPDATE:
Volevo solo inviare il codice finale che ha lavorato basa sulla soluzione. Il mio ciclo di creazione di più istruzioni di corrispondenza non era corretto come lo era il mio ft_min_word_len.
Il mio codice è ora:
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE MATCH (`first_name`, `last_name`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";
Sembra che ci sia ancora un problema con l'ordine dei termini. Ho aggiunto Pablo Picasso al DB per ottenere un nome più lungo per i test.Il termine "Pablo Pica" restituisce un risultato. "Pica Pablo" no. Devo passare il set completo di termini con un + e un * in una singola istruzione MATCH o eseguire più istruzioni MATCH con un OR come sopra? – Max
@Max: Non riesco a riprodurre questo, sia "Pica Pablo' come' Pablo Pica' (o '+ Pica * + Pablo *'/'+ Pablo * + Pica *') restituisce lo stesso utente per me. Sì, in una singola istruzione 'MATCH() AGAINST()'. Ogni singolo termine in 'MATCH()' richiede molto probabilmente il formato '+ term *'. Leggi anche il commento di @ PatrickB: i nomi <4 caratteri non corrisponderanno mai. – Wrikken
Grazie! La combinazione di ft_min_word_len e la sua modifica in una singola istruzione MATCH lo ha risolto. Aggiornerò la domanda con il mio codice finale – Max