Pencarian Fulltext dengan InnoDB

93

Saya sedang mengembangkan aplikasi web bervolume tinggi, di mana bagiannya adalah database MySQL dari postingan diskusi yang perlu bertambah hingga 20 juta baris, dengan lancar.

Saya awalnya berencana menggunakan MyISAM untuk tabel (untuk kemampuan pencarian teks lengkap built-in ), tetapi pemikiran bahwa seluruh tabel dikunci karena satu operasi tulis membuat saya menutup. Kunci tingkat baris jauh lebih masuk akal (belum lagi keunggulan kecepatan InnoDB lainnya saat menangani tabel besar). Jadi, untuk alasan ini, saya cukup bertekad untuk menggunakan InnoDB.

Masalahnya adalah ... InnoDB tidak memiliki kemampuan pencarian teks lengkap bawaan.

Haruskah saya menggunakan sistem pencarian pihak ketiga? Seperti Lucene (c ++) / Sphinx ? Apakah ada di antara ninja database Anda yang memiliki saran / panduan?Zoie LinkedIn (berdasarkan Lucene) sepertinya merupakan pilihan terbaik saat ini... telah dibangun dengan kemampuan waktu nyata (yang sangat penting untuk aplikasi saya.) Saya agak ragu untuk berkomitmen namun tanpa wawasan ...

(FYI: akan menggunakan EC2 dengan rig memori tinggi, menggunakan PHP untuk melayani frontend)

brianreavis.dll
sumber

Jawaban:

50

Saya dapat menjamin MyISAM fulltext menjadi pilihan yang buruk - bahkan mengesampingkan berbagai masalah dengan tabel MyISAM secara umum, saya telah melihat hal-hal fulltext keluar dari rel dan mulai merusak dirinya sendiri dan menabrak MySQL secara teratur.

Mesin pencari khusus pasti akan menjadi pilihan paling fleksibel di sini - simpan data posting di MySQL / innodb, dan kemudian ekspor teks ke mesin pencari Anda. Anda dapat menyiapkan pembuatan / publikasi indeks penuh berkala dengan cukup mudah, dan menambahkan pembaruan indeks waktu nyata jika Anda merasa perlu dan ingin menghabiskan waktu.

Lucene dan Sphinx adalah pilihan yang bagus, seperti Xapian , yang bagus dan ringan. Jika Anda mengikuti jalur Lucene, jangan berasumsi bahwa Clucene akan lebih baik, bahkan jika Anda memilih untuk tidak bergulat dengan Java, meskipun saya tidak benar-benar memenuhi syarat untuk membahas pro dan kontra keduanya.

Ian Wilkes
sumber
7
Solr (berdasarkan Lucene) dapat berskala besar dan sangat kuat serta fleksibel. Kami telah menggunakan Solr (khususnya edisi LucidWorks untuk Solr) dan saya dapat mengatakan ini adalah kemenangan besar. Sphinx memiliki beberapa janji serius juga, tetapi pada akhirnya kurangnya tipe datanya dapat mengganggu, setidaknya untuk aplikasi kita. Sphinx sangat cepat dan jika sesuai dengan kebutuhan Anda adalah pilihan yang solid juga.
Cody Caughlan
Terima kasih banyak kalian berdua; tanggapan yang bagus. Saya telah membolak-balik dokumen Solr, dan, sepertinya itu solusi yang bagus untuk digunakan. Itu memberdayakan beberapa situs web besar juga, saya mengerti. Saya pikir Solr adalah tiketnya. Terima kasih teman-teman. Juga, itu baik untuk mempelajari sakit kepala MyISAM Anda, Ian ... itu akan baik untuk diingat di masa depan. Pada proyek lain, saya akan menyimpang dari mencoba menggunakan fitur fulltext.
Brianreavis
11
Apakah bertanya-tanya apa yang membuat Ian berkata "jangan berasumsi bahwa Clucene akan lebih baik"? sebagai salah satu tim inti clucene saya mungkin tidak begitu objektif, tetapi bagi saya tampaknya port C ++ dioptimalkan dari perpustakaan Java akan meningkatkan kinerjanya melalui atap. Saya akan merekomendasikan siapa pun untuk tidak memposting komentar semacam itu tanpa setidaknya melihat produk yang mereka hina.
synhershko
4
Saat Anda membanting MyISAM, Anda benar-benar harus lebih spesifik. "Off the rails" sangat kabur, dan mungkin karena satu bug dalam build yang Anda gunakan, mungkin sejak diperbaiki.
bobobobo
6
Tetapi bagaimana jika Anda tidak memiliki opsi untuk menginstal perangkat lunak di server - alternatif apa yang ada dalam kasus ini?
puncak
11

Anda harus menghabiskan waktu satu jam dan menjalani instalasi dan test-drive Sphinx dan Lucene. Lihat apakah memenuhi kebutuhan Anda, sehubungan dengan pembaruan data.

Salah satu hal yang mengecewakan saya tentang Sphinx adalah bahwa Sphinx tidak mendukung penyisipan tambahan dengan sangat baik. Artinya, sangat mahal untuk mengindeks ulang setelah penyisipan, sangat mahal sehingga solusi yang mereka rekomendasikan adalah membagi data Anda menjadi baris yang lebih lama, tidak berubah dan baris yang lebih baru dan mudah menguap. Jadi, setiap penelusuran yang dilakukan aplikasi Anda harus menelusuri dua kali: sekali di indeks yang lebih besar untuk baris lama dan juga di indeks yang lebih kecil untuk baris terbaru. Jika itu tidak terintegrasi dengan pola penggunaan Anda, Sphinx ini bukanlah solusi yang baik (setidaknya tidak dalam implementasi saat ini).

Saya ingin menunjukkan kemungkinan solusi lain yang dapat Anda pertimbangkan: Google Penelusuran Khusus . Jika Anda dapat menerapkan beberapa SEO ke aplikasi web Anda, maka lakukan outsourcing fungsi pengindeksan dan pencarian ke Google, dan sematkan kolom teks pencarian Google ke situs Anda. Ini bisa menjadi cara paling ekonomis dan terukur untuk membuat situs Anda dapat ditelusuri.

Bill Karwin
sumber
Terima kasih, Bill. Ya, dokumentasi Sphinx membuat saya sedikit ragu tentang cara menangani pembaruan indeks. Bagus untuk dikonfirmasi. Sistem semacam itu mungkin akan berubah menjadi mimpi buruk bagiku, aku membayangkan. Adapun Google Custom Search, itu adalah opsi. Namun, masalah utama saya dengan itu hanyalah indeks non-realtime dan kurangnya penyesuaian. Menata hasil dan menarik data tambahan akan sangat penting bagi saya. Terima kasih telah ikut serta --- info Sphinx pasti bagus untuk diketahui!
Brianreavis
3

Mungkin Anda tidak boleh mengabaikan FT MySQL begitu cepat. Craigslist dulu menggunakannya .

Kecepatan MySQL dan Pencarian Teks Lengkap telah memungkinkan craigslist untuk melayani penggunanya .. craigslist menggunakan MySQL untuk melayani sekitar 50 juta pencarian per bulan dengan kecepatan hingga 60 pencarian per detik. "

edit

Seperti yang dikomentari di bawah ini, Craigslist tampaknya telah beralih ke Sphinx di awal tahun 2009.

bobobobo
sumber
Artikel yang saya tautkan tidak menyebutkan Sphinx, dan Nik tidak mengutip sumber apa pun yang mengatakan Craigslist menggunakan Sphinx sama sekali
bobobobo
PDF studi kasus terlihat seperti dari tahun 2004, saat itu terdapat 50 juta pencarian per bulan. Halaman Sphinx menyatakan 50 juta pencarian per hari , yang mungkin menjelaskan alasan mereka beralih ke solusi pencarian khusus.
Halil Özgür
1

Sphinx, seperti yang Anda tunjukkan, cukup bagus untuk benda ini. Semua pekerjaan ada di file konfigurasi. Pastikan apa pun tabel Anda dengan string memiliki beberapa kunci id integer unik, dan Anda akan baik-baik saja.

Gregg Lind
sumber
0

coba ini

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0
Rakesh Ojha
sumber
0

Anda harus melihat Sphinx. Layak dicoba. Pengindeksannya super cepat dan didistribusikan. Anda harus melihat webminar ini (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown). Ini berbicara tentang pencarian dan memiliki beberapa tolok ukur yang rapi. Anda mungkin merasa terbantu.

Muhammad
sumber
0

Jika semuanya gagal, selalu ada soundex_match , yang sayangnya tidak terlalu cepat dan akurat

pengguna1612250
sumber
0

Bagi siapa pun yang terjebak pada versi lama MySQL / MariaDB (yaitu pengguna CentOS) di mana InnoDB tidak mendukung pencarian Fulltext, solusi saya saat menggunakan tabel InnoDB adalah membuat tabel MyISAM terpisah untuk hal yang ingin saya cari.

Misalnya, tabel InnoDB utama saya adalah productsdengan berbagai kunci dan integritas referensial. Saya kemudian membuat tabel MyISAM sederhana yang disebut product_searchberisi dua bidang, product_iddan di product_namemana yang terakhir ditetapkan ke FULLTEXTindeks. Kedua bidang secara efektif merupakan salinan dari apa yang ada di producttabel utama .

Saya kemudian mencari di tabel MyISAM menggunakan fulltext, dan melakukan inner join kembali ke tabel InnoDB.

Isi tabel MyISAM dapat terus diperbarui melalui pemicu atau model aplikasi.

Saya tidak akan merekomendasikan ini jika Anda memiliki beberapa tabel yang memerlukan teks lengkap, tetapi untuk satu tabel sepertinya cukup berhasil sampai Anda dapat memutakhirkan.

MrCarrot
sumber