użyję to pytanie udostępnić pewne doświadczenie w pisaniu mały wyszukiwarkę od podstaw (nie szukaj specyficznych biblioteki zostały użyte) na dość mały zbiór danych (w rzeczywistości przeszukuje stackoverflow, ponieważ nie był ani zbyt mały, ani zbyt duży, aby działał na pojedynczym serwerze). Check it out. Poniżej znajdują się moje ustalenia na ten temat.
gąsienicowe
pierwsze, robot jest trudne rzeczy do zrobienia. Prawdziwym problemem jest zapis danych na dysku tak szybko, jak tylko uzyskasz strony internetowe. Główna struktura danych jest odwróconym indeksem, więc kiedy pojawi się słowo "banan", musisz pobrać z dysku indeks "banana" (lista dokumentów, w których występuje - wraz z pozycjami w dokumencie) dołączyć do nowego rekordu i zapisz to z powrotem. W miarę jak lista rośnie, ciągnięcie i zapisywanie jej cofa się coraz wolniej. Jedna sztuczka polegałaby na podzieleniu odwróconych indeksów (i dokumentów) na partycje, powiedzmy 1-1000 dokumentów w pierwszej partycji i tak dalej. Inną "sztuczką" jest podczas indeksowania partycji, aby zachować indeksy w pamięci i wypróżnić je na dysk tylko po wykonaniu partycji.
Ważny bit: co użyć do przechowywania danych? Jest wiele opcji i po wielu eksperymentach odkryłem, że najlepszym wyborem jest dzisiaj. I nie zapomnij dysków SSD!
Tak więc, w ten sposób indeksowanie większości stackoverflow (~ 13 000 000 stron) w ten sposób przy użyciu jednej maszyny (pamięć 4 Gb) trwa około 2 miesięcy. I wynikowe dane (odwrócony indeks, surowy tekst pozbawiony tekstu, itp.) - około 80 GB miejsca na dysku.
Szukaj
Celem jest, aby zrobić to szybko iz wysoką jakością. Jedną rzeczą do zrealizowania jest to, że jeśli chcesz, aby była szybka, nie możesz przeszukiwać całego zestawu danych. Na szczęście wszystko zostało podzielone na partycje, więc wyszukiwanie odbywa się na pierwszych 100 partycjach, w których pojawiają się słowa kluczowe (osobny indeks) i jeśli znajdzie "wystarczająco dobre" wyniki - zatrzymuje się, jeśli nie - bierze kolejne 100 i tak dalej.
Najwolniej jest czytać indeksy z dysku i deseasemalizować go.Leveldb obsługuje szybkie sekwencyjne czytanie, więc dane muszą być przechowywane w taki sposób, aby większość z nich mogła być czytana sekwencyjnie. Po skrzyżowaniu zestawu pamięci jest dość szybko.
Teraz jakość. To jest najtrudniejsze i nigdy wystarczająco dobre. Moją pierwszą próbą było zachowanie odwróconych indeksów nie tylko dla tekstu, ale także dla tytułów, tekstu linku i adresów URL. Każde trafienie w te dodaje kilka punktów do dokumentu. Kolejną kwestią jest przeformułowanie zapytania za pomocą synonimów i sprawdzenie, które zapytanie działa najlepiej. To prawdopodobnie zasługuje na wpis w jego własnym.
W każdym razie, mam nadzieję, że będzie przydatne czytanie!
Dzięki! Widziałem to raz, ale zapomniałem, gdzie to było. – davemackey