2011-08-23 16 views
5

Mam bazę danych mysql, w której stale dodawane są duże ilości tekstu. (10 stron tekstu na godzinę). Tekst jest przechowywany jako tekst jawny w polach tekstowych. Każdy wiersz kontaktuje się ze stroną lub dwoma tekstami.Wyszukiwanie dużej ilości stale aktualizowanego tekstu w mysql

Muszę wykonywać wyszukiwanie pełnotekstowe (wyszukiwanie słowa kluczowego w tekście i wykonywać złożone zapytania) w tej bazie danych w sposób regularny. Muszę po prostu wyszukać nowo dodany tekst. Jednak bardzo ważne jest, aby dodany tekst był natychmiast do przeszukiwania (w ciągu minuty lub dwóch).

Z tego co przeczytałem, fulltext z mysql jest bardzo nieefektywny. Wiem, że lucene jest opcją, ale nie jestem jeszcze pewien, jak szybko może indeksować nowy tekst.

Więc jakie są moje opcje? Czy istnieje sposób na zwiększenie wydajności mysql? czy lucen to moje najlepsze rozwiązanie? coś bardziej odpowiedniego?

dzięki

Odpowiedz

2

Wykonałem testy porównawcze czasów indeksowania dla Sphinx & Solr. Sphinx jest daleko w porównaniu do Solr w odniesieniu do algorytmów indeksowania (bardzo szybkie czasy indeksowania i niewielki rozmiar indeksu).

Kiedy mówisz, że 10 stron tekstu, wydaje się, że nawet nie potrzebujesz indeksowania Sphinx w czasie rzeczywistym. Możesz śledzić schemat indeksowania głównego + trójkąta w Sphinxie (możesz to znaleźć w dokumentacji Sphinx). Byłoby superszybko i prawie w czasie rzeczywistym. Jeśli potrzebujesz więcej pomocy w tym zakresie, prosimy zapytać, chętnie Ci wyjaśnimy.

Solr jest świetny, ale jeśli chodzi o zoptymalizowane skały Sfinksa Algorytmy! Spróbuj Sphinx.

Wychodząc na twoje pytania w komentarzu, Solr/Lucene obsługuje przyrostowe indeksowanie (znane jako import delta w swojej terminologii) i jego ciche łatwe do skonfigurowania, ale są one dość powolne w porównaniu do metody stosowanej przez Sphinx.

Główna + Delta jest wystarczająco szybka, ponieważ możesz zrobić tylko tymczasową tabelę, w której zapisujesz nowy tekst i indeksujesz. Zgodnie z dokumentacją: Sphinx obsługuje aktualizację indeksu "na żywo" (prawie w czasie rzeczywistym) i może być zaimplementowany przy użyciu schematu "główna + trójkąt".Chodzi o to, aby skonfigurować dwa źródła i dwa indeksy, z jednym "głównym" indeksem dla danych i jedną "różnicą" dla nowych dokumentów.

Załóżmy na przykład, że masz 10 milionów rekordów, więc możesz zachować to jako główny indeks, a wszystkie nowe dokumenty zostaną dodane do nowej tabeli, która będzie działała jako delta. Ta nowa tabela może być indeksowana od czasu do czasu (powiedzmy co 1 godzinę), a dane można przeszukiwać w ciągu kilku sekund, ponieważ masz 10 stron tekstu. Teraz po przeszukaniu twoich nowych rekordów możesz scalić dokumenty tabeli głównej i tabeli delta, które można przeprowadzić bez zakłócania wyszukiwania. Po scaleniu dokumentów opróżnij nową tabelę i ponownie po godzinie możesz ponownie wykonać cały proces. Mam nadzieję, że masz to jeszcze, proszę, zadaj dowolne pytanie.

+0

Dziękuję za pomoc. Z tego co przeczytałem main + delta jest dokładnie to, czego potrzebuję. Ale jest jeden punkt, który nie jest jasny w dokumencie; mówią, że zmniejszy czas indeksowania do 30 do 60 sekund. W moim przypadku bardzo ważne jest, aby nowy tekst był gotowy do przeszukiwania w ciągu kilku sekund (maksimum na minutę). Czy main + delta jest wystarczająco szybki? Z tego, co widzę, Sphinx jest w ten sposób. – applechief

+0

Jesteś mile widziany. Możesz zobaczyć moją edytowaną odpowiedź powyżej. Main + Delta powinien działać doskonale, ponieważ indeksowanie Sphinx jest naprawdę szybkie. Jednak jeszcze jedno: Proszę również spojrzeć na indeksy czasu rzeczywistego w Sphinx, jak wspomniano w jednej z powyższych odpowiedzi, nigdy go nie używałem, ale wydaje się obiecujące. Po zastosowaniu obu danych możesz sprawdzić, które rozwiązanie najlepiej Ci odpowiada. – Yavar

2

Masz kilka opcji:

  • Sphinx Search: można zintegrować bezpośrednio z MySQL DB. Obsługuje indeksy czasu rzeczywistego z ograniczeniami:

  • Solr/Lucene: Przesyłaj dane przez JSON lub XML z bazy danych. Ma bogate możliwości wyszukiwania. Obecne wersje nie są w czasie rzeczywistym bez niektórych wersji krawędziowych. Musisz ponownie zindeksować swoje dane i zatwierdzić je, aby pojawiły się zmiany. Co w zależności od ilości danych, możesz zrobić zatwierdzenie co 10 minut. To nie będzie problemem, dopóki nie masz dokumentów 100K/1M +, ponieważ Lucene jest bardzo szybki w indeksowaniu. 10 stron na godzinę jest dość banalne.

  • ElasticSearch: Czy Java jest podobna do Solr/Lucene, ale wygląda na naprawdę "prawie w czasie rzeczywistym". Został zaprojektowany z myślą o dystrybucji i obsługuje liniową skalę. Dostarczasz dane poprzez JSON i zapytania przez JSON.

To naprawdę zależy od Twoich potrzeb i możliwości. Sphinx może być najłatwiejszy w rozpoczęciu. Ale ograniczenia indeksu czasu rzeczywistego mogą nie działać.

+0

Sfinks i ElasticSearch wydają się interesujące. Będę badał ograniczenia czasu rzeczywistego sfinksa. Czy lucene reindeksuje za każdym razem całą bazę danych? czy nie robi przyrostowych aktualizacji swojego indeksu? a co z shinx i elastycznym badaniem? – applechief

+0

1. ElasticSearch jest również oparty na Lucene 2. Lucene może dodawać dokumenty tak, jak są one nowo wyświetlane, więc nie musisz niczego ponownie indindeksować, ale @Code oznaczało, że będziesz musiał podawać dokumenty i wywoływać względnie kosztowne operacje "commit", aby pojawiają się dokumenty - dotyczy to tylko Solr. Lucene i tak ElasticSearch nie potrzebują drogiego "commitowania" 3. ElasticSearch jest bardzo łatwy do rozpoczęcia ... – Karussell

Powiązane problemy