MySQL documento considera la parola e-magazine
in un testo come frase e non come una parola. Per questo motivo risulta lo due parole e
e magazine
. E mentre costruisce l'indice di ricerca non aggiunge il valore e
all'indice a causa dello ft_min_word_len
(il valore predefinito è 4 caratteri).
La stessa limitazione di lunghezza viene utilizzata per la query di ricerca. Questo è il motivo per cui la ricerca di e-magazine
restituisce esattamente gli stessi risultati di a-magazine
perché a
e -
viene completamente ignorata.
Ma ora si desidera trovare la frase esatta e-magazine
.Con utilizzare le virgolette e questo è il modo corretto completo per trovare le frasi, ma MySql non supporta gli operatori per le frasi, solo la parola:
https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html
Con questo modificatore, alcuni caratteri hanno un significato speciale al all'inizio o alla fine di parole nella stringa di ricerca
Alcune persone suggerire di utilizzare la seguente query:
SELECT id, name
FROM company
WHERE MATCH(name) AGAINST('e-magazi*' IN BOOLEAN MODE)
HAVING name LIKE 'e-magazi%';
Come ho detto, MySQL ignora lo e-
e cerca la parola jolly magazi*
. Dopo aver ottenuto questi risultati, utilizza HAVING
per filtrare in modo adizionale i risultati per e-magazi*
incluso lo e-
. In questo modo troverai la frase e-magazine AG
. Ovviamente HAVING
è necessario solo se la frase di ricerca contiene l'operatore jolly e non si dovrebbero mai usare le virgolette. Questo operatore è usato dal tuo utente e non tu!
Nota: Finché non si circonda la frase di ricerca con %
, troverà solo i campi che iniziano con quella parola. E tu non vuoi circondarlo, perché troverà anche bee-magazine
. Quindi forse hai bisogno di un ulteriore OR HAVING name LIKE ' %e-magazi%' OR HAVING NAME LIKE '\\n%e-magazi%'
per renderlo utilizzabile all'interno dei testi.
trucco
Ma alla fine io preferisco un trucco così HAVING
non è necessario a tutti:
- Se si aggiungono testi per la tabella di database, aggiungerli in aggiunta a una colonna separata full-text indicizzata e sostituire parole come
up-to-date
con up-to-date uptodate
.
- Se un utente cerca
up-to-date
sostituirlo nella query con uptodate
.
Con questo si può ancora trovare specific
in user-specific
ma up-to-date
così (e non solo date
).
Bonus
Se un utente cerca -well-known huge ports
MySQL per trattamento che, come not include *well*, could include *known* and *huge*
. Ovviamente lo si può risolvere anche con un'altra variante di interrogazione, ma con il trucco sopra si rimuove il trattino in modo che la query di ricerca appaia semplicemente così:
Interessante domanda. Posso replicarlo qui in un tavolo con un campo simile a uuid. 'SELECT id, bootid FROM socket WHERE MATCH (bootid) AGAINST ('+' 18bda775" 'IN BOOLEAN MODE); 'funzionerà e lo sarà anche se cerco" 18bda775-711c ", ma cerco" 18bda "o" 18bda775 -711 "non funzionerà. il campo 'bootid' in questione contiene: 18bda775-711c-4329-9de2-a3d81dc13d06 –
Abbiamo anche provato a cambiare i caratteri di controllo booleani per usare # invece di - ma non ha avuto alcun effetto (sì, ho riparato l'indice della tabella dopo la modifica) : 'ft_boolean_syntax = + #><() ~ *:" "& |' – hajo