InnoDB ile Tam Metin Arama


93

Yüksek hacimli bir web uygulaması geliştiriyorum; bunun bir parçası, sorunsuz bir şekilde 20M + satırlara çıkması gereken bir MySQL tartışma gönderileri veritabanıdır.

Başlangıçta tablolar için MyISAM kullanmayı planlıyordum (yerleşik tam metin arama yetenekleri için ), ancak tek bir yazma işlemi nedeniyle tüm tablonun kilitlenmesi düşüncesi beni kapatıyor. Satır düzeyinde kilitler çok daha mantıklıdır (InnoDB'nin devasa tablolarla uğraşırken sunduğu diğer hız avantajlarından bahsetmiyorum bile). Bu nedenle, InnoDB'yi kullanmaya oldukça kararlıyım.

Sorun şu ki ... InnoDB'nin yerleşik tam metin arama yetenekleri yok.

Üçüncü taraf bir arama sistemi kullanmalı mıyım? Gibi Lucene (c ++) / Sfenks ? Veritabanı ninjalarından herhangi birinin önerisi / yönlendirmesi var mı?LinkedIn'in hayvanat bahçesi (Lucene temelli) şu anda en iyi seçenek gibi görünüyor... gerçek zamanlı yetenekler üzerine inşa edilmiş olmama rağmen (bu, uygulamam için oldukça kritiktir.) Henüz bir kavrayışa sahip olmadan taahhütte bulunmak konusunda biraz tereddütüm var ...

(Bilginize: yüksek bellekli donanımlarla EC2'de olacak, ön uç için PHP kullanarak)


Yanıtlar:


50

MyISAM tam metninin kötü bir seçenek olduğuna kefil olabilirim - genel olarak MyISAM tablolarıyla ilgili çeşitli sorunları bir kenara bıraksak bile, tam metin öğelerinin raydan çıktığını ve düzenli olarak MySQL'i bozmaya başladığını gördüm.

Özel bir arama motoru kesinlikle buradaki en esnek seçenek olacaktır - gönderi verilerini MySQL / innodb'de saklayın ve ardından metni arama motorunuza aktarın. Periyodik bir tam dizin oluşturma / yayınlama işlemini oldukça kolay bir şekilde ayarlayabilir ve ihtiyaç duyuyorsanız ve zamanı harcamak istiyorsanız gerçek zamanlı dizin güncellemeleri ekleyebilirsiniz.

Lucene ve Sphinx , güzel ve hafif olan Xapian gibi iyi seçeneklerdir . Lucene rotasına giderseniz, Java ile güreşmeyi tercih etmeseniz bile Clucene'nin daha iyi olacağını varsaymayın, ancak ben ikisinin de artılarını ve eksilerini tartışmak için gerçekten nitelikli değilim.


7
Solr (Lucene'ye dayanıyor) muazzam ölçeklenebilir ve çok güçlü ve esnektir. Solr'ı (özellikle Solr sürümü için LucidWorks) kullandık ve bunun çok büyük bir kazanç olduğunu söyleyebilirim. Sphinx'in de ciddi bir vaatleri var, ancak sonuçta veri türlerinin olmaması, en azından uygulamamız için rahatsız edici olabilir. Sfenks çok hızlıdır ve ihtiyaçlarınıza uyuyorsa da sağlam bir seçimdir.
Cody Caughlan 04

Siz ikinize çok teşekkürler; harika tepkiler. Solr'un belgelerini inceliyorum ve bu harika bir çözüm gibi görünüyor. Anladığım kadarıyla birkaç büyük web sitesine de güç veriyor. Sanırım bilet Solr. Teşekkürler beyler. Ayrıca, MyISAM baş ağrılarınızı öğrenmek güzel, Ian ... bunları gelecekte aklınızda bulundurmanız iyi olacaktır. Diğer projelerde, tam metin özelliğini kullanmayı denemekten uzaklaşacağım.
brianreavis

11
Ian'ın "Clucene'nin daha iyi olacağını varsaymayın" demesine neyin sebep olduğunu merak ediyor muydunuz? Clucene çekirdek ekibinden biri olarak o kadar objektif olmayabilirim, ancak bana göre herhangi bir Java kütüphanesinin C ++ portu optimize edilmiş, performansını çatıya kadar artıracak gibi görünüyor. Kimseye, onur kırıcı oldukları ürüne en azından bir göz atmadan bu tür yorumlar göndermemelerini tavsiye ederim.
synhershko

4
MyISAM'ı çarptığınızda, gerçekten daha spesifik olmanız gerekir. "Rayların dışında" çok belirsizdir ve muhtemelen kullandığınız yapıdaki tek bir hata düzeltildiğinden beri olabilir.
bobobobo

6
Peki ya sunucuya yazılım yükleme seçeneğiniz yoksa - bu durumda hangi alternatifler var?
acme

57

MyISAM'ın genel aşamalı olarak kaldırılmasıyla birlikte, InnoDB tam metin araması (FTS) nihayet MySQL 5.6.4 sürümünde mevcuttur.

Https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html adresinde birçok ilginç ayrıntı .

Diğer motorların birçok farklı özelliği olsa da, bu InnoDB'dir, bu nedenle yereldir (bu, bir yükseltme yolu olduğu anlamına gelir) ve bu onu değerli bir seçenek haline getirir.


1
Makale bağlantısı 403 yasak
Marco Demaio

11

Bir saat geçirmeli ve Sphinx ve Lucene'nin kurulumunu ve test sürüşünü yapmalısınız. Veri güncellemeleriyle ilgili olarak ihtiyaçlarınızı karşılayıp karşılamadığını görün.

Sphinx ile ilgili beni hayal kırıklığına uğratan şeylerden biri de artımlı ekleri çok iyi desteklememesi. Yani, bir eklemeden sonra yeniden dizine eklemek çok pahalıdır, o kadar pahalıdır ki, önerilen çözümü verilerinizi daha eski, değişmeyen satırlara ve daha yeni, değişken satırlara bölmektir. Dolayısıyla, uygulamanızın yaptığı her aramanın iki kez aranması gerekir: bir kez eski satırlar için daha büyük dizinde ve ayrıca son satırlar için daha küçük dizinde. Bu sizin kullanım kalıplarınızla bütünleşmezse, bu Sfenks iyi bir çözüm değildir (en azından şu anki uygulamasında değil).

Değerlendirebileceğiniz başka bir olası çözümü belirtmek isterim: Google Özel Arama . Web uygulamanıza biraz SEO uygulayabiliyorsanız, indeksleme ve arama işlevini Google'a devredin ve sitenize bir Google arama metni alanı yerleştirin. Sitenizi aranabilir hale getirmenin en ekonomik ve ölçeklenebilir yolu bu olabilir.


Teşekkürler Bill. Evet, Sphinx dokümantasyonu beni dizin güncellemelerini nasıl işlediği konusunda biraz tereddüt ettirdi. Doğrulamak güzel. Bu tür bir sistem muhtemelen benim için bir kabusa dönüşür sanırım. Google Özel Arama'ya gelince, bu bir seçenektir. Bununla birlikte, benim asıl sorunum sadece gerçek zamanlı olmayan endeks ve özelleştirme eksikliği. Sonuçları şekillendirmek ve ek verileri çekmek benim için oldukça önemli olacak. Yine de dinlediğiniz için teşekkürler --- Sfenks bilgisini bilmek kesinlikle iyidir!
brianreavis

3

Belki de MySQL'in FT'sini bu kadar çabuk kapatmamalısınız. Craigslist onu kullanırdı .

MySQL'in hızı ve Tam Metin Araması, craigslist'in kullanıcılarına hizmet vermesini sağladı. Craigslist, saniyede 60 aramaya kadar bir hızda ayda yaklaşık 50 milyon arama sunmak için MySQL kullanıyor. "

Düzenle

Aşağıda yorumladığı gibi, Craigslist gibi görünüyor Sfenks geçiş 2009 başlarında biraz zaman.


Bağlantılı makale ben Sphinx söz etmez, ve Nik Craigslist hiç Sphinx kullanır söyleyerek herhangi bir kaynak alıntı değildir
bobobobo

Örnek olay PDF'si, ayda 50 milyon arama yapıldığı 2004 yılına ait gibi görünüyor. Sfenks sayfasında günde 50 milyon arama belirtiliyor , bu da muhtemelen özel bir arama çözümüne geçmelerinin nedenini açıklıyor.
Halil Özgür

1

Sphinx, belirttiğiniz gibi, bu şeyler için oldukça güzel. Tüm çalışmalar konfigürasyon dosyasındadır. Tablonuzun dizeleriyle ne olursa olsun, benzersiz bir tamsayı kimliği anahtarına sahip olduğundan emin olun ve iyi olmalısınız.


0

bunu dene

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

0

Sphinx'e bir göz atmalısınız. Denemeye değer. Endeksleme süper hızlı ve dağıtılıyor. Bu (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown) webminar'a bir göz atmalısınız. Aramadan bahsediyor ve bazı düzgün kıyaslamaları var. Yararlı bulabilirsin.



0

InnoDB'nin Fulltext aramalarını desteklemediği eski bir MySQL / MariaDB sürümüne takılanlar için (yani CentOS kullanıcıları), InnoDB tablolarını kullanırken benim çözümüm, aramak istediğim şey için ayrı bir MyISAM tablosu oluşturmaktı.

Örneğin, ana InnoDB tablom productsçeşitli anahtarlara ve bilgi bütünlüğüne sahipti. Daha sonra product_searchiki alan içeren product_idve product_nameikincisinin bir FULLTEXTdizine ayarlandığı adında basit bir MyISAM tablosu oluşturdum . Her iki alan da ana producttablodakilerin bir kopyasıdır .

Daha sonra tam metni kullanarak MyISAM tablosunda arama yapıyorum ve InnoDB tablosuna bir iç birleşim yapıyorum.

MyISAM tablosunun içeriği, tetikleyiciler veya uygulamanın modeli aracılığıyla güncel tutulabilir.

Tam metin gerektiren birden çok tablonuz varsa bunu tavsiye etmem, ancak tek bir tablo için yükseltme yapana kadar yeterli bir çalışma gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.