2012-06-29 17 views
9

Używamy Sunspot Solr do indeksowania i wyszukiwania w naszej aplikacji Ruby on Rails.Jak ponownie wyświetlić tylko niektóre obiekty w Sunspot Solr

Chcieliśmy ponownie zindeksować niektóre obiekty i ktoś przypadkiem uruchomił komendę Product.reindex z konsoli Rails. W rezultacie indeksowanie wszystkich produktów rozpoczęło się od zera, a nasz katalog wydawał się pusty podczas indeksowania.

Ponieważ mamy ogromną ilość danych, ponowne indeksowanie zostało wykonane trzy dni. Dziś rano, kiedy sprawdzałem postęp reindeksowania, wydaje się, że był jeden uszkodzony wpis danych, który spowodował ponowne indeksowanie zatrzymywania się bez ukończenia.

Nie mogę ponownie uruchomić całej operacji Product.reindex, ponieważ trwa to zbyt długo. Czy istnieje sposób na uruchamianie ponownego indeksowania wybranych produktów? Chcę wybrać zakres produktów, które nie są indeksowane, a następnie po prostu uruchomić indeksowanie na tym. Jak mogę dodać pojedynczy produkt do indeksu bez konieczności wykonywania pełnego reindeksu całego zestawu danych?

+0

Kiedy mówisz - Jak dodać pojedynczy produkt do indeksu bez .. ", masz na myśli pojedynczą kolumnę/pole lub podzbiór dokumentów? – user1452132

Odpowiedz

7

znalazłem odpowiedź na https://github.com/sunspot/sunspot#reindexing-objects

Gdy obiekt zostanie zapisany, jest on automatycznie przeindeksowane w ramach callbacków uratować. Więc wszystko, co było potrzebne, to dodać wszystkie obiekty, które wymagały ponownego indeksowania do tablicy, a następnie przepuścić przez tablicę, wywołując zapis na każdym obiekcie. Pomyślnie zaktualizowano wymagane obiekty w indeksie.

+0

Skąd wiesz, które z nich nie zostały jeszcze zindeksowane? – kidbrax

+0

Zrobiliśmy kilka ręcznych kontroli wyrywkowych. Wiedzieliśmy, że reindeks rozbił się kiedyś po wykonaniu produktów z 2011 roku, więc ręcznie sprawdziliśmy niektóre z naszych produktów od 2012 roku. Następnie wykonaliśmy zapytania w konsoli Rails, aby skonstruować tablicę zawierającą te produkty i ponownie je zapisać, uruchamiając wywołania zwrotne. – Stanley

+1

Jeśli ponowneindeksowanie trwa tak długo, możliwe, że robisz to naiwnie, bez uwzględniania jakichkolwiek skojarzeń, których używasz w definicjach wyszukiwania. Tak działa wbudowane zadanie rake i jest bardzo powolne. Polecenie reindex może przyjmować ActiveRecord, ale pozwala na znacznie większą wydajność. Zrobiłem pełny indeks od 15 minut do 15 sekund. Wypróbuj tę składnię: '' Book.solr_reindex (: batch_size => 1000,: include => [: author, {: chapters =>: paragraphs}]) '' ' Zobacz również, czy niepotrzebnie dopuszczasz częściowe słowo wyszukiwania, które naprawdę zwiększają indeks. –

12

Sunspot indeksuje obiekt w składniku wywołania zwrotnego, dzięki czemu można zapisać każdy obiekt, ale może również wywołać inne wywołania zwrotne. Bardziej precyzyjny sposób to zrobić byłoby

Sunspot.index [post1, post2] 
Sunspot.commit 

lub AUTOCOMMIT

Sunspot.index! [post1, post2] 

Można nawet przejść w relacji z obiektem, ponieważ są one po prostu tablica zbyt

Sunspot.index! post1.comments 
Powiązane problemy