Sphinx, acts_as_taggable_on_steroids

witam
mam model powiedzmy Element i do niego przypisane są tagi za pomocą pluginu acts_as_taggable_on_steroids, czyli są tabele tags i taggings. Czy jest możliwe za pomocą Spinxa, wyszukanie nie tylko po atrybutach modelu Element ale także po przypisanych tagach ?

Tak, wystarczy odpowiednio kierować dane do Sphinksa. Nie wiem, czy korzystasz z jakiegoś gem/pluginu do obsługi Sphinksa, ale jeszcze kilka wersji temu ThinkingSphinx tego nie potrafił i wygenerowane przez niego pliki konfiguracyjne wymagały drobnych poprawek.

Z tymże działa to tylko dla zwykłych indeksów, w chwili obecnej real-time nie wspiera takich operacji.

Zerknij na sekcję MVA w manualu: http://sphinxsearch.com/docs/current.html#attributes

tak, zapomniałem wspomnieć, używam thinking_sphinx. rzeczywiscie to prostsze niż mi się wydawało :slight_smile:
pytanie, jak najlepiej aktualizować index? jakies zadanie w cronie np co 10 minut ?

Wszystko zależy od ilości danych.

Możesz indeksować całość co 5, 10, 60… minut. O ile dzieje się w akceptowalnym czasie.
Możesz indeksować przyrostowo co 5, 10, 60… minut, a potem na przykład raz na dobę łączyć indeksy.

Tu znów dokumentacja będzie pomocna: http://sphinxsearch.com/docs/current.html#live-updates

próbuje użyć trybu :any, wszystko ok dopuki nie daje :conditions

@elements = Element.search params[:search][:query], :conditions => {:status => 1}, :match_mode => :any,
zwraca mi wtedy wszystko co zawiera słowa podane w zapytaniu lub status 1 (czyli za dużo), a mi potrzeba żeby zwracało elementy które zawierają słowa i mają status 1

w logu:

Dude, przeczytaj dokumentację, ułatwi Ci to życie.

http://freelancing-god.github.com/ts/en/searching.html#matchmodes

dokładnie z tej dokumentacji korzystam ale nadal nie rozumiem dlaczego coś nie tak z tym :conditions.
próbowałem to obejść za pomocą http://freelancing-god.github.com/ts/en/scopes.html ale dalej nic

[quote=Artur79]dokładnie z tej dokumentacji korzystam ale nadal nie rozumiem dlaczego coś nie tak z tym :conditions.
próbowałem to obejść za pomocą http://freelancing-god.github.com/ts/en/scopes.html ale dalej nic[/quote]
Jeżeli status jest atrybutem, to użyj :with.

status to kolumna w tabeli, próbowałem także z with, ale wtedy nie zwraca mi nic. Może w definicji indeksów coś jest nie tak, chociaż nie sądze

define_index do indexes title, :sortable => true indexes tags.name end

[quote=Artur79]status to kolumna w tabeli, próbowałem także z with, ale wtedy nie zwraca mi nic. Może w definicji indeksów coś jest nie tak, chociaż nie sądze

define_index do indexes title, :sortable => true indexes tags.name end
[/quote]
Wszystko po czym chcesz wyszukiwać w sphinxie musi być w define_index. Jeżeli status zawiera integery to powinien być dodany jako atrybut, tzn:

define_index od has status end

Inna sprawa - ThinkingSphinx / UltraSphinx są dobre do momentu, kiedy Sphinx / aplikacja są na jednej maszynie.

Pisanie konfiguracji Sphinksa z palca nie jest trudne, a Riddle jest dobrze udokumentowanym gemem i można spokojnie w kilku linijkach kodów napisać własny “sterownik”.

Ja szczerze mówiąc nie widzę większych problemów w takiej konfiguracji. Jedyne ograniczenie jest takie, że indeksowanie powinno być uruchamiane tylko na jednej maszynie.

Bardziej chodzi mi o to, że potem traci się część z “fajności”, którą te pluginy dają.

Jeśli aplikacja i Sphinx mieszczą Ci się na jednej maszynie to nie ma niczego lepszego. W developmencie także się sprawdza.