Będzie to wyszukiwanie po jednej kolumnie z dużą ilością różnych opcji. Nazwijmy to wyszukiwaniem w słowniku, gdyż będzie to spora baza z pojedynczymi wyrazami. Najważniejsze opcje to wyszukiwanie wyrazów “2,3,4,5 - literowych” oraz “zakończonych na…” zaczynających się…".
Czy Searchlogic jest do tego dobry…? Czy polecicie coś innego…?
Searchlogic jest narzędziem do konstruowania zapytań do bazy. Tylko tyle i aż tyle. Albo, jak wolisz, jest to :conditions na sterydach.
Jesteś pewien że dokładnie tego potrzebujesz?
Może potrzebny Ci jakiś wydajny pełnotekstowy indekser z szybkim wyszukiwaniem? Ferret/Acts_As_Ferret będzie tutaj rewelacyjny (chociaż są też fani Sphinxa są w większości chyba na forum ).
Natomiast “literowość” słów to kwestia nietrywialna, chyba najprościej by było trzymać po prostu rozmiar słowa w kolumnie – co ułatwi dalsze zabawy (słowa “co najmniej 3-literowe” itd.).
Jesli zalezy Ci na szybkosci to tylko Sphinx. Acts_as_ferret bedzie indeksowal 2 mln rekordow przez kilkanascie godzin albo kilka dni a sphinx zrobi to w kilka minut.
Sphinx od wersji 0.9.9-rc2 potrafi szukac slow zaczynajacych/konczacych sie na … (^hello world$) - field-start field-end modifiers.
Ilosc slow tez przechowywalbym w osobnej kolumnie (mozesz rowniez uzyc sphinxa do przeszukiwania tego pola). Polecam korzystanie z oficjalnego ruby sphinx api a nie z thinking sphinx.
Dawno nie benchmarkowałeś obu, co?
Generalnie Ferret jest teraz szybszy niż swoja protoplasta, czyli javowy Lucene (!).
Sphinx potrafi być upierdliwy w użyciu (dopiero od niedawna ma delty w indeksach, poprzednio nowo dodane rekordy nie były dostępne w wyszukiwarce dopiero po reindeksie), zwłaszcza na dzielonych hostingach (potrzeba odpalenia procesu w tle).
Najlepiej spróbować obu (można nawet używać obu razem, bo się nie gryzą) i zobaczyć który bardziej leży
Bo trzymanie indeksowanie ferreta w procesie aplikacji jest dobre tylko do deweloperki i do nauki Najlepiej indeksowanie zrzucić na wbudowany mikroserwer DRb (problem: skalowanie, osobny proces) albo do rake taska, odpalanego co jakiś czas.
Dawno nie benchmarkowałeś obu, co? ;)[/quote]
Nie chodzi mi o samą szybkosc wyszukiwania ferreta - nie mam do niej zastrzezen tylko o (re)indeksowanie z uzyciem pluginu acts_as_ferret. Tutaj raczej nic nie pobije Sphinx’a, ktory ma bezposredni interfejs do bazy w tym celu. Mozesz oczywiscie sprobowac napisac swoj plugin, ktory wyeksportuje dane (powiedzmy do pliku tekstowego) i wysle je stamtad do indeksowania i bedzie dzieki temu szybszy, ale to temat na osobna dyskusje.
A nie polecam TS przy rozwiazywaniu tego problemu poniewaz TS sprawdza sie jako dodatek do modeli AR (czyli dodaj FTS’a do modelu). Tutaj mamy do czynienia ze specyficznym problemem dlatego lepiej pominac cala warstwe abstrakcji, ktora daje TS i operowac bezposrednio na API do Sphinx’a IMO.
Co do padania ferret’a na produkcji to z reguly ludzie zapominaja dodac opcji :remote => true korzystajac z AAF i lokalnego indeksu i po pewnym czasie AAF sie wysypuje. Tak jak Tomash napisal DRb (:remote => true) jest rozwiazaniem (z reguly).
A kto z Was korzysta z solr? OK, to jest dodatkowa zależność, ale tak samo jest z de facto wszystkimi rozwiązaniami. Solr jest napisany w javie, i dzięki temu można go zintegrować z lametyzatorem, który dzięki słownikowi robi stemming słów, czyli przekształca je do formy podstawowej, np. lwa -> lew. Czy może istnieją podobne rozwiązania dla ferreta albo sphinxa?
a co powiecie na wyszukiwanie w rekordach schowanych w tabelach tłumaczeń - translations (używam Globalize 2). Próbujemy zaimplementować filtry korzystając z Searchlogic ale nie jesteśmy w stanie przeszukiwać treści… Czy Sphinx albo Ferret byłyby tu lepsze? A może ktoś miał podobny problem?
Seeweer właśnie walczy z podobnym tematem, poproszę go żeby tu jutro wypisał co jest na rzeczy.
A i mnie temat interesuje, bo przechodzę na Globalize2.
Generalnie można to fajnie zrobić dając acts_as_ferret modelowi SomethingTranslation (tabela something_translations już istnieje, wystarczy napisać prosty) i po prostu szukać SomethingTranslation.find_with_ferret (i oczywiście :conditions => {:locale => I18n.locale}) czy coś w tym stylu)
Z tym że Seeweer jeszcze próbuje to pożenić z multi-model searchem i fallbackami…
wyszła właśnie nowa wersja SearchLogic (dwa dni za późno, bu) -> v2.
Wyszukanie po polach z translations mozna zrobic tak: Article.globalize_translations_title_contains("sth")
Testuję thinking_sphinx. Chodzi, ale chyba jest problem z kodowaniem. Miałem plik txt zapisany w ISO-8859-2 ze słowami, wrzuciłem to do bazy jako UTF-8 (baza też jest UTF-8) i teraz w wyszukiwaniu wpisuję: “bąb” a on mi znajduję: “bób”, “bąbel”, “błazen” …?!
Moje dalsze śledztwo wykazuje, że ts nie radzi sobie z polskimi znakami. Wpisuję w wyszukiwaniu “abażur”, “abaąur” w wyniku dostaję zawsze “abażur”. Wygląda, że ignoruje polskie znaki …!?
ts ma domyślnie w konfiguracji UTF-8, nic tam nie ruszałem. Powie mi ktoś o co biega …?
Tak, Sphinx radzi sobie z indeksowaniem tekstu w kilku tylko językach/alfabetach (angielski, niemiecki, rosyjski i chyba jeszcze z jeden czy dwa), pozostałe alfabety/znaki są downgrade’owane do swoich łacińskich (ASCII) odpowiedników.
czyli abażur zostanie zaindeksowany jako “abazur”. Szukanie “abazur” albo “abażur” zwróci wynik. Jeśli chcesz zachować ogonki to albo zbuduj swoją tablicę albo poszukaj w sieci.