2013-05-01 10 views
6

Potrzebuję wykonać wyszukiwanie w Internecie w Solr, np. Użytkownik musi znaleźć listę użytkowników, którzy są online z określonymi kryteriami.Obsługa dużej liczby identyfikatorów w Solr

Jak ja operowania tym: przechowujemy identyfikatory użytkownika w tabeli i wysłać wszystkie Identyfikator online użytkownika w żądanie SOLR jak

&fq=-id:(id1 id2 id3 ............id5000) 

Problem z tego podejścia jest to, że gdy identyfikatory stają się duże, Solr Zajmuje to zbyt dużo czasu na rozwiązanie i musimy przesłać duże żądanie przez sieć.

Jednym z rozwiązań może być użycie sprzężenia w Solr, ale dane online zmieniają się regularnie i nie mogę indeksować danych za każdym razem (powiedzmy 5-10 min, powinno to być co najmniej godzinę).

Inne rozwiązanie Myślę, że uruchamiam to zapytanie wewnętrznie z Solr na podstawie pewnych parametrów w adresie URL. Nie mam pojęcia o wewnętrznych elementach Solr, więc nie wiem, jak postępować.

+1

To jest problem dla większości użytkowników solr i chyba nie zrobili nic w Solr4.0. tutaj potrzebujesz eksperta od wewnętrznego eksperta java lub solr –

Odpowiedz

3

Dzięki łagodnemu zaangażowaniu Solr4, zatwierdzenie stało się na tyle tanie, że faktycznie można zapisać flagę "online" bezpośrednio w rekordzie użytkownika, i po prostu masz & fq = online: true w zapytaniu. Zmniejsza to obciążenie związane z wysyłaniem 5000 identyfikatorów przez przewód i analizowaniem ich, i pozwala Solr zoptymalizować zapytanie nieco. Za każdym razem, gdy ktoś się loguje lub wylogowuje, ustaw ich status i ustaw commitWithin na aktualizacji. W każdym razie warto spróbować.

+0

Spróbowałbym też tego po raz pierwszy, ponieważ łatwiej jest zrobić, niż zaimplementować PostFilter i utrzymywać jakiś rodzaj memcache na bieżąco z użytkownikami, którzy są obecnie online. Więcej szczegółów na temat NearRealtimeSearch można znaleźć na Wiki Solr http://wiki.apache.org/solr/NearRealtimeSearch Ale jeśli to nie zadziała, chciałbym pójść w sposób opisany przez Lexka i Asafa. – cheffe

+2

Nie sądzę, że będzie to rozwiązanie pomysłu, ponieważ wspomniana indeksacja nie jest możliwa i generalnie zajmuje 15-30 minut. – chicharito

+2

Nie powinieneś ponownie tworzyć całego indeksu zgodnie z tym pomysłem. Możesz także aktualizować pojedyncze jednostki. W twoim przypadku, jeśli użytkownik loguje się, tylko jego rekord użytkownika - jego pojedynczy rekord - zostaje zaktualizowany. Aby to zrobić, możesz wysłać np. Żądania aktualizacji json lub xml na serwer Solr. Informacje na temat referencji można znaleźć tutaj: http://yonik.com/solr/atomic-updates/ lub http://wiki.apache.org/solr/UpdateJSON lub http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/ – cheffe

2

Do każdego solidnego rozwiązania należy doprowadzenie danych zbliżonych do SOLR (wsadowych) i używanie ich wewnętrznie. NIE działa bardzo duże żądanie podczas wyszukiwania, co jest małym opóźnieniem. Powinieneś opracować własny filtr; Filtr będzie buforował dane użytkowników online raz na jakiś czas (powiedzmy co minutę). Jeśli dane zmieniają się BARDZO często, rozważ wdrożenie PostFiltera.

Można znaleźć dobry przykład realizacji filtru tutaj: http://searchhub.org/2012/02/22/custom-security-filtering-in-solr/

+0

jak stworzyć własny filtr, to jest rozwiązanie, którego szukam, ale nie wiem jak stworzyć własny filtr – chicharito

+0

Również jak mogę podłączyć mysql z tego filtra, ponieważ jestem programistą PHP, nie mam pojęcia, jak to zrobić za pomocą php – chicharito

+1

Dodałem link do filtra przykładu wdrożenia. – lexk

3

Pracowaliśmy ten problem poprzez wdrożenie sharding danych.

Zasadniczo, bez wchodzenia w dużym stopniu do kodu szczegółach:

  • napisać własny kod indeksujący
    • korzystanie consistent hashing zdecydować, który ID idzie do którego serwera Solr
    • indeks każde dane użytkownika do odpowiedniej odłamek (może to być kilka komputerów)
    • upewnij się, że masz nadmiarowość
  • Zapytanie Solr odłamki
    • uwagi sharded zapytań w Solr pomocą parametru shards
    • rozpocząć EmbeddedSolr i używać go zrobić sharded zapytaniu
    • Solr będzie kwerendy wszystkie odłamki i połączyć wyniki, ale również zapewnia timeoutów jeśli trzeba ograniczyć czas zapytań dla każdego odłamek

Mimo wszystko, co powiedziałem powyżej, ja nie uwierzyć Solr jest dobrym rozwiązaniem dla tego .Solr nie jest zbyt dobrze dostosowany do wyszukiwań indeksów, które ciągle się zmieniają, a także jeśli przeszukujesz głównie przez identyfikatory, a nie wyszukiwarka nie jest potrzebna.

Dla naszego projektu w zasadzie implementujemy wszystkie budowanie indeksu, równoważenie obciążenia i silnik zapytań i używamy Solr głównie jako pamięci masowej. Ale zaczęliśmy używać Solr, gdy odłamywanie było flaky i nie było wydajne, nie jestem pewien, jaki jest obecny stan.

Ostatnia uwaga, gdybym budował ten system dzisiaj od zera bez całej pracy, którą wykonaliśmy w ciągu ostatnich 4 lat, radziłbym używać pamięci podręcznej do przechowywania wszystkich użytkowników, którzy są obecnie online (powiedzmy memcached lub redis) i czas na żądanie Po prostu powtórzę wszystkie i odfiltruję według kryteriów. Filtrowanie według kryteriów może być buforowane niezależnie i aktualizowane przyrostowo, a także powtarzanie ponad 5000 rekordów niekoniecznie jest bardzo czasochłonne, jeśli logika dopasowywania jest bardzo prosta.

0

Jednym z rozwiązań jest zastosowanie przyłączyć SOLR ale danymi w sieci zmieniają regularnie cant wskaźnik każdym danych (powiedzmy 10/5 min, powinno być w temperaturze co najmniej hr)

Myślę, że możesz bardzo dobrze użyć złącz Solr, ale po odrobinie improwizacji.

Rozwiązanie proponuję jest następujący:

You can have 2 Indexes (Solr Cores) 

1. Primary Index (The one you have now) 
2. Secondary Index with only two fields , "ID" and "IS_ONLINE" 

Można teraz zaktualizować indeks wtórny częściej (w kolejności sekund) i utrzymać ją w synchronizacji z tabeli masz, do przechowywania użytkowników online .

UWAGA: Ten wtórny Index nawet jeśli często aktualizowane, nie byłoby żadnej degradacji wydajności dostarczonego robimy niezbędnych poprawek jak wykorzystaniu odpowiednich zapytań podczas delta-import, itp

Można teraz wykonać Solr join na identyfikatorze pole na tych dwóch indeksach, aby osiągnąć to, co chcesz. Oto link, w jaki sposób wykonać Solr łączące Indeksy/Rdzenie Solr.

Powiązane problemy