Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pencarian Teks Lengkap di MySQL:Yang Baik, yang Buruk dan yang Jelek

Terkadang saat mencari di database MySQL Anda mungkin ingin menjalankan kueri penelusuran teks lengkap terhadap data berbasis karakter. Hari ini kita membahas keuntungan dan kerugian dari metode pencarian tersebut.

Apa itu Pencarian Teks Lengkap di MySQL?

Pencarian teks lengkap adalah teknik yang memungkinkan Anda mencari catatan yang mungkin tidak cocok dengan kriteria pencarian. Pencarian teks lengkap di MySQL dilakukan ketika indeks tertentu sedang digunakan dan indeks tersebut memiliki banyak nuansa unik termasuk yang berikut:

  • Agar indeks dianggap sebagai indeks teks lengkap, indeks harus bertipe FULLTEXT.
  • Indeks FULLTEXT hanya dapat digunakan pada tabel yang menjalankan mesin penyimpanan InnoDB atau MyISAM.
  • Indeks FULLTEXT hanya dapat dibuat untuk kolom CHAR, VARCHAR, atau TEXT.
  • indeks FULLTEXT hanya digunakan bila klausa MATCH() AGAINST() digunakan.
  • Penelusuran teks lengkap memiliki tiga mode:mode bahasa alami, mode boolean, dan mode perluasan kueri.

Indeks FULLTEXT adalah jenis indeks khusus yang menemukan kata kunci dalam teks alih-alih membandingkan nilai dengan nilai dalam indeks. Meskipun pencarian FULLTEXT berbeda dari jenis pencocokan lainnya, perhatikan bahwa Anda dapat memiliki indeks BTREE dan indeks FULLTEXT pada kolom yang sama pada saat yang sama - keduanya tidak akan bertentangan karena cocok untuk tujuan yang berbeda.

Jenis Pencarian Teks Lengkap

Saat menjalankan pencarian teks lengkap di MySQL, perlu diingat bahwa ada tiga jenis pencarian yang dapat dipilih:

  1. Jenis pencarian bahasa alami - mode pencarian seperti itu menginterpretasikan string pencarian sebagai frasa literal. Diaktifkan secara default jika tidak ada pengubah yang ditentukan atau saat pengubah IN NATURAL LANGUAGE MODE ditentukan;
  2. Jenis penelusuran perluasan kueri - mode penelusuran semacam itu melakukan penelusuran dua kali. Saat mencari untuk kedua kalinya, kumpulan hasil menyertakan beberapa dokumen paling relevan dari pencarian pertama. Diaktifkan menggunakan pengubah WITH QUERY EXPANSION;
  3. Jenis pencarian boolean - mode pencarian semacam itu memungkinkan pencarian kueri kompleks yang dapat menyertakan operator boolean seperti operator kurang dari (“<”) dan lebih dari (“>”), subekspresi (“( ” dan “)”)), tanda tambah (+), tanda minus (-), tanda kutip ganda (“”), operator yang menurunkan kontribusi nilai ke hasil (~) dan operator wildcard (*) - operator operator wildcard memungkinkan pencarian dengan pencocokan fuzzy (misalnya, "demo*" juga akan cocok dengan "demonstrasi"). Diaktifkan menggunakan pengubah IN BOOLEAN MODE.

Penelusuran Teks Lengkap dengan Mode Penelusuran Bahasa Alami

Mode pencarian bahasa alami, seperti disebutkan di atas, diaktifkan secara default atau ketika pengubah IN NATURAL LANGUAGE MODE ditentukan. Mode ini melakukan pencarian bahasa alami terhadap kumpulan teks tertentu (satu atau lebih kolom). Format kueri dasar pencarian teks lengkap di MySQL harus serupa dengan berikut ini:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

Bila MATCH() digunakan bersama dengan klausa WHERE, baris secara otomatis diurutkan berdasarkan relevansi tertinggi terlebih dahulu. Untuk mencari string yang tepat, sertakan dengan tanda kutip ganda.

Penelusuran Teks Lengkap dengan Mode Perluasan Kueri

Penelusuran teks lengkap juga mendukung mode perluasan kueri. Mode pencarian seperti itu sering digunakan ketika pengguna mengandalkan pengetahuan tersirat - misalnya, pengguna mungkin mencari "DBMS" dengan harapan melihat "MongoDB" dan "MySQL" di hasil pencarian. Alasan mengapa pengguna mungkin dapat mengandalkan beberapa pengetahuan tersirat saat menggunakan mode pencarian semacam itu cukup sederhana - pencarian teks lengkap dengan mode perluasan kueri bekerja dengan melakukan pencarian dua kali:frase pencarian kedua adalah frase pencarian pertama digabungkan dengan beberapa entri yang paling relevan dari pencarian pertama. Artinya, misalnya, jika dalam pencarian pertama salah satu baris akan berisi kata "DBMS" dan kata "MySQL", pencarian kedua akan menemukan entri yang akan menyertakan kata "MySQL" bahkan jika tidak. berisi "DBMS". Format kueri yang akan menggunakan mode perluasan kueri akan terlihat seperti ini:

SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION); 

Penelusuran Teks Lengkap Menggunakan Mode Boolean

Mode boolean mungkin adalah salah satu hal paling menarik yang ditawarkan pencarian teks lengkap MySQL. Mode ini memiliki banyak peringatan unik karena memungkinkan Anda untuk memperluas kemampuan pencarian menggunakan operator boolean. Saat mode boolean sedang digunakan, karakter tertentu dapat memiliki arti khusus di awal atau akhir kata. Misalnya:

  • “+” artinya DAN;
  • “-” artinya BUKAN;
  • Operator “(“ dan “)” memungkinkan untuk membuat subekspresi;
  • “<” dan ">” operator mengubah peringkat nilai pencarian lebih rendah atau lebih tinggi;
  • “~” menurunkan kontribusi nilai pada hasil penelusuran;
  • Kutipan ganda (“”) hanya cocok dengan nilai literal;
  • “*” adalah operator wildcard (lihat penjelasan di atas).

Operator ini memungkinkan Anda untuk memperluas fungsionalitas pencarian:misalnya, jika Anda ingin mengambil semua baris yang berisi kata "Demo", tetapi bukan "Demo2", Anda dapat menggunakan kueri seperti ini:

SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

Anda juga dapat menggunakan tanda kutip ganda bersamaan dengan tanda kutip tunggal seperti:

SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);

Gotch Pencarian Teks Lengkap

Sebelum menggunakan pencarian teks lengkap di MySQL, perlu diingat bahwa pencarian memiliki beberapa "gotchas":

  • Baik mesin penyimpanan InnoDB maupun MyISAM memiliki daftar stopword masing-masing. Daftar stopword InnoDB dapat ditemukan di sini, daftar stopword MyISAM dapat ditemukan di sini.
    • Untuk menentukan daftar stopword Anda sendiri untuk InnoDB, tentukan tabel dengan struktur yang sama dengan tabel INNODB_FT_DEFAULT_STOPWORD, masukkan stopword di sana, lalu atur nilai opsi innodb_ft_server_stopword_table dalam bentuk db_name/table_name.
    • Untuk menentukan daftar stopword Anda sendiri untuk MyISAM, setel variabel ft_stopword_file ke nama jalur file yang berisi daftar stopword. Di dalam file, stopwords dapat dipisahkan oleh karakter nonalfanumerik apa pun kecuali “_” dan “‘“. File stopword default terletak di storage/myisam/ft_static.c. Stopwords dapat dinonaktifkan dengan menyetel variabel ke string kosong.
  • Penelusuran teks lengkap tidak didukung pada tabel yang dipartisi.
  • Semua kolom dalam indeks FULLTEXT harus menggunakan kumpulan karakter dan susunan yang sama.
  • Operasi pencarian teks lengkap tidak memperlakukan string % sebagai karakter pengganti.

Berikut tangkapan lain:Anda mungkin juga ingin mengingat bahwa pengurai FULLTEXT bawaan menentukan di mana kata-kata dimulai dan diakhiri dengan melihat karakter tertentu termasuk spasi (“ “), koma (“, ”) dan titik (“.”) yang berarti bahwa jika string pencarian Anda berisi satu atau lebih karakter tersebut, hasil pencarian mungkin tidak akurat. Misalnya, jika database Anda berisi 5 baris dengan string "test.demo", kueri pencarian "test.demo" mungkin mengembalikan lebih banyak (10, 15 dll.) hasil termasuk "demo", "string.demo_example" dll. karena itu akan mencari "demo" bukan "test.demo", jadi Anda mungkin terjebak dengan banyak kecocokan yang tidak relevan. MySQL memang menawarkan solusi untuk masalah ini jika Anda ingin menulis plugin Anda sendiri di C atau C++ (lihat dokumentasi MySQL), tetapi sampai saat itu, Anda tidak dapat berbuat banyak.

Daftar lengkap pembatasan teks lengkap MySQL dapat dilihat di halaman dokumentasi MySQL.

Ringkasan

Kemampuan pencarian teks lengkap MySQL menyediakan cara sederhana untuk menerapkan berbagai teknik pencarian (pencarian bahasa alami, pencarian perluasan kueri, dan pencarian boolean) ke dalam aplikasi Anda yang menjalankan MySQL. Masing-masing teknik pencarian tersebut memiliki peringatannya sendiri dan masing-masing mungkin cocok untuk tujuan yang berbeda - ketika memutuskan apakah akan menggunakan pencarian teks lengkap, perlu diingat bahwa jenis pencarian ini memiliki banyak seluk-beluk yang unik untuk dirinya sendiri, ketahui manfaat dan kerugian menggunakan pencarian teks lengkap di MySQL dan memilih dengan bijak.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara terbaik untuk memeriksa apakah mysql_query mengembalikan hasil apa pun?

  2. Bagaimana cara mengatur item yang dipilih dalam kotak drop-down

  3. MySQL – Perbaiki – Kesalahan – Kata Sandi Anda Tidak Memenuhi Persyaratan Kebijakan Saat Ini

  4. Bagaimana Fungsi OCT() Bekerja di MySQL

  5. Prosedur Tersimpan dengan parameter WHERE opsional