Wyszukiwanie, czy SearchLogic będzie dobry?

Witam!

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 :wink: ).

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.).

Sprecyzuję. Będzie ponad 2 mln haseł w słowniku. Każde z nich składa się z maksymalnie 2 wyrazów (większość 1 wyrazowe).

Trzymanie rozmiaru w kolumnie(!), dzięki za podpowiedź :slight_smile:

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.

Zacząłem sobie czytać o ferret i sphinx, no i chyba wezmę na warsztat sphinx-a. Dzięki za wskazówki.

Sphinx + Thinking Sphinx to świetne i proste w implementacji/zarządzaniu combo. Jest chyba jeden odcinek Railscasts o tym.

Tak jak hosiawak polecam wersję 0.9.9 - sporo nowych, przydatnych ficzerów.

Dawno nie benchmarkowałeś obu, co? :wink:
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 :slight_smile:

A dlaczego nie polecasz thinking sphinx?

Ferret ma taką brzydką cechę, że jak mu się zepsuje indeks to kładzie praktycznie całą aplikację (mi np. co trzeci request wywoływał 500 error).

Bo trzymanie indeksowanie ferreta w procesie aplikacji jest dobre tylko do deweloperki i do nauki :wink: 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?

Trochę szkoda odpalać całego borga javowego dla prostej wyszukiwarki :wink:

Ale fakt, nie słyszałem o rozwiązaniach stemmingowych dla Ferreta i 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.

Z drugiej strony Ferret… :wink:

Poszukaj pliku konfiguracyjnego do sphinx’a ktory generuje TS (sphinx.conf ? ) i poczytaj o charset_table

Ponizej przyklad dla jezyka polskiego ktory zamienia wszystkie litery z ogonkami na bezogonkowe odpowiedniki:

charset_table = 0..9, A..Z->a..z, -, _, a..z, U+0143->n, U+0104->a, U+0106->c, U+0118->e, U+0141->l, U+00D3->o, U+015A->s, U+0179->z, U+017B->z, U+0105->a, U+0107->c, U+0119->e, U+0142->l, U+00F3->o, U+015B->s, U+017A->z, U+017C->c, U+0144->n

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.