MySQL Full Text Search

Oggi ho giocato per ottimizzare un lento SQL Applicazione del genere

SELECT * FROM 'table' WHERE `field` LIKE '%word%'

Dove è il problema ora qui – l'ultima parte '% parola%’ e in caratteri ancora più specifici % prima della parola, che fare. simbolo jolly % ,prima di qualsiasi valore, fa direttamente noi query direttamente in lento, perché in questo modo l'applicazione ci si ferma per usare indici Campo. Decisioni come sempre, ma non sempre chiaro 😆 complesso MySQL Hanno una soluzione a questo problema ricerca del testo completo campo indicizzazione. Come funziona cambiando il campo ha un sacco di documentazione scritta, ma la fretta descriverà come cambiare la richiesta superiore, perché ci arriveremo un po 'di dramma alla fine. Sledka come campo documento applicabile sopra, domanda deve essere cambiamenti nel tipo:

SELECT * FROM `table` WHERE MATCH (field) AGAINST ('word')

Quindi la struttura è evidente e non necessita di discussione inutili. La query sopra entrerà in vigore, se la parola, per si effettua una richiesta di almeno 4 simboli, Il valore di default è, se si desidera modificare deve specificare il valore, която желаете в my.cnf в частта [mysqld] dichiarazione ft_min_word_len= 3 o 2, 1 не е добър избор очевидно 😉 . Dopo aver modificato il valore e riavviare mysql server una necessità di fare riparazioni sulle vostre tavole, Affinché la nuova indicizzazione entrare in vigore. Finora tutto chiaro: apportare modifiche, reset, rebildvam indici e fare la mia richiesta e ritorna 0 Controllo con l'ordine 😀

SHOW VARIABLES

Vedo che i valori, Ho chiesto in vigore, rebildvam ancora indici – stesso risultato. 🙄 sgradevole, molto scomodo. Da qui in poi iniziò un grande maledizione e graffiare la chiave per il capannone 😀 che era abbastanza, piuttosto interessante. nel complesso, Ho iniziato a leggere la documentazione non si sa quale strada e arrivato a un passaggio interessante

Such a technique works best with large collections (infatti, E 'stato accuratamente messo a punto in questo modo). Per molto piccoli tavoli, distribuzione di parola non riflette adeguatamente il loro valore semantico, e questo modello può a volte produrre risultati bizzarri. Per esempio, anche se la parola "MySQL" è presente in ogni riga della tabella articoli mostrato in precedenza, una ricerca per la parola non produce risultati

ГРЕДА 😳 Дам табличката ми беше малка – Eppure era una prova. La nostra applicazione in un grande tavolo su 2 000 000 ordine e lì le cose dormivano. Bene problema ormai chiaro. Per rendere decisione chiara, Ne cito brevemente, che supporta la ricerca testo completo 3 modalità avanzata BOOLEAN , ESPRESSIONI e LINGUAGGIO NATURALE come l'ultimo lavoro di default. Per le modalità in grado di controllare la documentazione, Spiegherò a 2-3 parole BOOLEANI perché è la chiave. Supporta operatori logici quali AND, O , NON e così via e può fare qualche magia con frasi popolari, avere uno, nessun'altra etc.. Mantenere e simboli *, che è equivalente a un simbolo jolly % È utile 😉, quando il termine di ricerca è inferiore alla lunghezza di ft_min_word_len o piccoli vassoi ;). Almeno a me un tavolo con circa 100 ordine fa lavoro perfetto. Lasciando solo vedere e richiesta completato:

SELECT * FROM `table` WHERE MATCH (field)
AGAINST ('*word*' IN BOOLEAN MODE)

Ecco che arriva il momento in cui se la nostra indicizzazione lavora con caratteri jolly – la risposta è che non lo so. Принципно мисля, че да, защото не е казано друго в документацията, но в документацията очевидно не се казват или показват много неща 😀

Arricchito da Zemanta

2 Commenti

    1. Е при големи таблици вече има други решения 😉 partitions да речем или други механизмни за fulltext search като Sphinx

lascia un commento

L'indirizzo email non verrà pubblicato. i campi richiesti sono contrassegnati *

Anti Spam *