Carian teks penuh MySQL

Hari ini saya bermain untuk mengoptimumkan perlahan SQL Permohonan genus

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

Mana masalah itu kini di sini – Bahagian terakhir '% perkataan%’ dan walaupun watak-watak yang lebih khusus % sebelum perkataan, yang melakukan. simbol wildcard % ,sebelum apa-apa nilai, langsung membuatkan kita query terus ke dalam perlahan, kerana dengan cara ini permohonan itu menghalang kita untuk menggunakan indeks Field. Keputusan seperti biasa, tetapi tidak sentiasa jelas 😆 keseluruhan MySQL Mereka mempunyai penyelesaian kepada masalah ini carian teks penuh bidang pengindeksan. Bagaimana menukar bidang mempunyai banyak dokumentasi bertulis, tetapi tergesa-gesa akan menerangkan bagaimana untuk menukar permintaan bahagian, kerana kita akan mendapat sebuah drama sedikit akhirnya. Sledka sebagai medan teks penuh berkenaan atas, permohonan hendaklah perubahan dalam jenis yang:

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

Jadi struktur yang jelas dan tidak memerlukan perbincangan yang tidak perlu. Pertanyaan di atas akan berkuatkuasa, jika perkataan, untuk anda membuat permintaan sekurang-kurangnya 4 simbol, Nilai lalai adalah, jika anda mahu untuk mengubah suai mesti menentukan nilai, anda mahu saya. cnf di bahagian [mysqld] pengisytiharan ft_min_word_len= 3 atau 2, 1 tempat letak kenderaan 😉 jelas . Selepas anda menukar nilai dan mulakan semula mysql server-keperluan untuk melakukan pembaikan di atas meja anda, perintah untuk mengindeks baru mula berkuat kuasa. Setakat ini semua jelas: membuat perubahan, menetapkan semula, rebildvam indeks dan melakukan permintaan dan pulangan saya 0 Semakan dengan perintah itu 😀

SHOW VARIABLES

Saya melihat bahawa nilai-nilai, Saya telah meminta berkuat kuasa, rebildvam lagi indeks – keputusan yang sama. 🙄 menyenangkan, sangat tidak selesa. Bermula dari sini ia mula kutuk yang besar dan menggaru kunci kepada kandang 😀 yang agak, cukup menarik. pada keseluruhannya, Saya mula membaca dokumentasi tidak tahu yang mana jalan dan datang kepada laluan yang menarik

Teknik tersebut berfungsi dengan koleksi besar (sebenarnya, ia telah ditala dengan teliti cara ini). Untuk jadual yang sangat kecil, pengedaran perkataan tidak secukupnya mencerminkan nilai semantik mereka, dan model ini kadang-kadang boleh menghasilkan keputusan yang pelik. Sebagai contoh, walaupun perkataan "MySQL" hadir dalam setiap baris jadual artikel yang ditunjukkan sebelum ini, carian perkataan tidak menghasilkan keputusan

RASUK 😳 memberi saya dulang kecil – Namun, ia adalah ujian. Permohonan kami di meja besar lebih 2 000 000 pesanan dan perkara yang ada tidur. Well masalah kini jelas. Untuk membuat keputusan yang jelas, Saya akan menyebut secara ringkas, yang menyokong carian teks penuh 3 mod maju Boolean , UNGKAPAN dan BAHASA ASLI kerana kerja-kerja terakhir secara lalai. Bagi mod boleh menyemak dokumentasi, Saya akan menerangkan kepada 2-3 kata-kata Boolean kerana ia adalah kunci. Ia menyokong operator logik seperti AND, ATAU , TIDAK dan sebagainya dan boleh membuat beberapa silap mata dengan frasa popular, mempunyai satu, tiada lain-lain lain. Mengekalkan dan simbol *, yang bersamaan dengan simbol wildcard % Ia amat berguna 😉, apabila istilah carian adalah kurang daripada panjang ft_min_word_len atau dulang kecil ;). Sekurang-kurangnya kepada saya sebuah meja dengan kira-kira 100 untuk melakukan pekerjaan sempurna. Meninggalkan hanya melihat dan siap permintaan:

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

Di sini datang masa ini sama ada pengindeksan kami bekerja dengan aksara kad bebas – jawapannya adalah saya tidak tahu. Saya rasa secara prinsip, sebagai, kerana ia tidak dinyatakan dalam dokumen, tetapi dalam pendokumenan nampaknya pula tidak berkata atau menunjukkan banyak perkara-perkara 😀

Dipertingkatkan oleh Zemanta

2 Komen

tinggalkan balasan

Alamat e-mel anda tidak akan disiarkan. Medan yang diperlukan akan ditanda *

Anti SPAM *