Apa itu Pencarian Teks Lengkap vs. LIKE

133

Saya baru saja membaca posting yang menyebutkan "pencarian teks lengkap" dalam SQL.

Saya hanya ingin tahu apa perbedaan antara FTS dan LIKE. Saya memang membaca beberapa artikel tetapi tidak dapat menemukan apa pun yang menjelaskannya dengan baik.

Nathan W
sumber

Jawaban:

164

Secara umum, ada tradeoff antara "presisi" dan "recall". Presisi tinggi berarti bahwa hasil yang tidak relevan lebih sedikit disajikan (tidak ada false positive), sedangkan recall tinggi berarti bahwa lebih sedikit hasil relevan yang hilang (tidak ada negatif palsu). Menggunakan operator LIKE memberi Anda presisi 100% tanpa ada kelonggaran untuk penarikan kembali. Fasilitas pencarian teks lengkap memberi Anda banyak fleksibilitas untuk mengurangi ketelitian untuk mengingat lebih baik.

Sebagian besar implementasi pencarian teks lengkap menggunakan "indeks terbalik". Ini adalah indeks di mana kunci adalah istilah individual, dan nilai terkait adalah kumpulan catatan yang berisi istilah tersebut. Pencarian teks lengkap dioptimalkan untuk menghitung persimpangan, gabungan, dll dari kumpulan catatan ini, dan biasanya menyediakan algoritma peringkat untuk mengukur seberapa kuat catatan yang diberikan cocok dengan kata kunci pencarian.

Operator SQL LIKE bisa sangat tidak efisien. Jika Anda menerapkannya pada kolom yang tidak diindeks, pemindaian lengkap akan digunakan untuk menemukan kecocokan (seperti halnya kueri apa pun pada bidang yang tidak diindeks). Jika kolom diindeks, pencocokan dapat dilakukan terhadap kunci indeks, tetapi dengan efisiensi yang jauh lebih sedikit daripada kebanyakan pencarian indeks. Dalam kasus terburuk, pola LIKE akan memiliki wildcard terkemuka yang mengharuskan setiap kunci indeks untuk diperiksa. Sebaliknya, banyak sistem pencarian informasi dapat memungkinkan dukungan untuk wildcard terkemuka dengan pra-kompilasi pohon sufiks di bidang yang dipilih.

Fitur lain yang khas dari pencarian teks lengkap adalah

  • analisis atau tokenisasi leksikal — memecah blok teks yang tidak terstruktur menjadi kata-kata, frasa, dan token khusus
  • analisis morfologis, atau membendung — meruntuhkan variasi kata tertentu menjadi satu istilah indeks; misalnya, memperlakukan "mouse" dan "mouse", atau "electrification" dan "electric" sebagai kata yang sama
  • peringkat — mengukur kesamaan catatan yang cocok dengan string kueri
erickson
sumber
2
peringkat lebih baik dijelaskan dalam jawaban
ychaouche
39

FTS melibatkan pengindeksan kata-kata individual dalam bidang teks untuk membuat pencarian melalui banyak catatan dengan cepat. Menggunakan LIKE masih mengharuskan Anda untuk melakukan pencarian string (linier atau sejenisnya) di dalam bidang.

Ignacio Vazquez-Abrams
sumber
23

MySQL membuat indeks dari kata-kata kolom pencarian teks lengkap yang diaktifkan dan melakukan pencarian pada indeks ini. MySQL menggunakan algoritma yang canggih untuk menentukan baris yang cocok dengan permintaan pencarian.

Juga, dari jawaban SO ini :

Ada beberapa keuntungan dari pencarian teks lengkap.

Pengindeksan:

Sesuatu seperti:

WHERE Foo LIKE '%Bar';

Tidak dapat memanfaatkan indeks. Itu harus melihat setiap baris, dan melihat apakah itu cocok. Namun, indeks teks lengkap bisa. Bahkan, indeks teks lengkap dapat menawarkan lebih banyak fleksibilitas dalam hal urutan kata-kata yang cocok, seberapa dekat kata-kata itu bersama, dll.

Stemming:

Pencarian teks lengkap dapat membendung kata-kata. Jika Anda mencari lari, Anda bisa mendapatkan hasil untuk "berlari" atau "berlari". Sebagian besar mesin teks lengkap memiliki kamus batang dalam berbagai bahasa.

Hasil Tertimbang:

Indeks teks lengkap dapat mencakup beberapa kolom. Misalnya, Anda dapat mencari "pai persik", dan indeksnya dapat menyertakan judul, kata kunci, dan isi. Hasil yang cocok dengan judul dapat ditimbang lebih tinggi, karena lebih relevan, dan dapat diurutkan untuk ditampilkan di dekat bagian atas.

Kekurangan:

Indeks teks lengkap berpotensi besar, berkali-kali lebih besar dari indeks B-TREE standar. Karena alasan ini, banyak penyedia yang dihosting yang menawarkan instance basis data menonaktifkan fitur ini, atau setidaknya membebankan biaya tambahan untuk itu. Misalnya, terakhir saya periksa, Windows Azure tidak mendukung kueri teks lengkap.

Indeks teks lengkap juga bisa lebih lambat untuk diperbarui. Jika data banyak berubah, mungkin ada beberapa pembaruan indeks keterlambatan dibandingkan dengan indeks standar.

Vipin Jain
sumber
16

Suka hanya menggunakan wildcard, dan tidak terlalu kuat.

Teks lengkap memungkinkan pencarian yang jauh lebih kompleks, termasuk Dan, Atau, Tidak, bahkan hasil yang serupa (SOUNDEX) dan banyak lagi item lainnya.

Saya akan mulai melihat SQL CONTAINS () FREETEXT () dan item pencarian Teks Lengkap terkait untuk membantu mendapatkan pemahaman yang lebih baik tentang apa yang tersedia.

Penjual Mitchel
sumber
2
Saya sangat merekomendasikan semua orang memeriksa SOUNDEX
sotn
11

Perbedaan sebenarnya adalah metodologi pemindaian. Untuk pencarian teks lengkap, kata-kata (istilah) digunakan sebagai kunci hash - yang masing-masing terkait dengan array dokumen tempat kunci (istilah) muncul. Seperti ini:

Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}

Sekarang term-document matrix (istilah anggota dokumen mana) dapat direpresentasikan sebagai:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

Ketika permintaan datang meminta "Dapatkan saya semua dokumen yang mengandung kata / istilah t1" - maka set dokumen {d1, d5, d9,.. dn } dikembalikan.

Anda bisa meretas skema tabel yang tidak dinormalisasi untuk menyimpan dokumen - setiap baris dalam tabel MySQL akan dianggap sebagai "dokumen" dan kolom TEXT bisa berisi paragraf dll. Indeks terbalik akan berisi istilah sebagai kunci hash dan baris-id sebagai id dokumen.

Ingat bahwa kueri SQL ini akan memiliki lebih banyak atau lebih sedikit kinerja O (1). Kueri akan independen dari

  1. Jumlah kata / istilah di kolom TEXT
  2. Jumlah baris / dokumen yang cocok dengan kriteria
  3. Panjang kata / istilah

Misalnya SQL ini dapat diaktifkan untuk mengekstrak semua baris yang cocok dengan kata yang diberikan XYZ:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

Peringatan: Jika Anda menambahkan ORDER BY ke kueri ini, runtime Anda akan bervariasi berdasarkan pada beberapa parameter, salah satunya adalah jumlah baris / dokumen yang cocok. Waspadalah.

Namun SEPERTI tidak punya apa-apa dari ini. Dipaksa untuk memindai kalimat / string secara linear dan menemukan semua istilah yang cocok. Menambahkan kartu liar menambah kekacauan. Ini berfungsi baik untuk string panjang kecil, seperti yang Anda bayangkan, tetapi akan gagal total untuk kalimat yang lebih lama. Dan jelas tidak sebanding ketika memiliki paragraf atau seluruh halaman teks dll.

Kingz
sumber
3

FTS lebih efisien, kuat (terutama untuk Pemecah Kata dan fungsi stemming) ... tetapi periksa persyaratan Anda karena kadang-kadang DB tidak mendukung semua bahasa misalnya MSSQL tidak mendukung bahasa Yunani (periksa di halaman ini http: // msdn. microsoft.com/en-us/library/ms176076(v=sql.110).aspx )

kamskyleo
sumber