Mysql
 sql >> Database >  >> RDS >> Mysql

Mistero della ricerca full-text in MySQL

Da Documenti MySQL

  • + Un segno più iniziale indica che questa parola deve essere presente in ogni riga restituita.

  • * L'asterisco funge da operatore di troncamento (o carattere jolly). A differenza degli altri operatori, dovrebbe essere aggiunto alla parola interessata. Le parole corrispondono se iniziano con la parola che precede l'operatore *.

    Se una parola viene specificata con l'operatore di troncamento, non viene eliminata da una query booleana, anche se è troppo breve (come determinato dall'impostazione ft_min_word_len) o stopword. Ciò accade perché la parola non è vista come una parola troppo breve o come una stopword, ma ​​come un prefisso che deve essere presente nel documento sotto forma di una parola che inizia con il prefisso .

Nel contesto:

PARTITA(...) CONTRO(...)

MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE) significa che stai cercando righe in cui una parola nel name colonna deve contenere ski e deve iniziare con la parola ski .

Dal set che hai pubblicato, Dartmouth Skiway è l'unico name conforme a questi requisiti:contiene la parola ski , ed è preceduto dalla parola ski .

L'altro name colonne, anche se corrispondono alla prima regola:deve contenere ski , non sono preceduti da ski , come previsto dalla tua regola. La riga restituita dalla tua ricerca booleana è l'unica con un name colonna che contiene una parola che contiene ski ed è una parola prefissata di ski .

Come suggerito da ajreal, prova a ridurre ft_min_len_word_setting in my.cnf . La tua ricerca potrebbe non riuscire a ottenere i risultati che ti aspetti a causa dell'impostazione predefinita. Prova a ridurlo a 3.

colonna WHERE LIKE %text%

WHERE name LIKE "%ski%" cerca le righe con name colonne che contengono ski , non importa dove ricorre la parola.