Jak działa Lucene

90

Chciałbym się dowiedzieć, jak działa wyszukiwarka lucene tak szybko. Nie mogę znaleźć żadnych przydatnych dokumentów w sieci. Jeśli masz coś do przeczytania (oprócz kodu źródłowego Lucene), daj mi znać.

Zapytanie tekstowe przy użyciu wyszukiwania tekstowego mysql5 z indeksem zajmuje w moim przypadku około 18 minut. Wyszukiwanie lucene dla tego samego zapytania zajmuje mniej niż sekundę.

Midhat
źródło
2
Czy mogę poprosić o przekonwertowanie tego pytania na wiki społeczności? Lucene brzmi teraz jak platforma.
asyncwait

Odpowiedzi:

75

Lucene to odwrócony indeks pełnotekstowy. Oznacza to, że pobiera wszystkie dokumenty, dzieli je na słowa, a następnie tworzy indeks dla każdego słowa . Ponieważ indeks jest dokładnie dopasowanym ciągiem, nieuporządkowanym, może być niezwykle szybki. Hipotetycznie, nieuporządkowany indeks SQL na varcharpolu może być równie szybki i myślę, że w takim przypadku duże bazy danych mogą bardzo szybko wykonać proste zapytanie o równość ciągów.

Lucene nie musi optymalizować pod kątem przetwarzania transakcji. Kiedy dodajesz dokument, nie musi się upewnić, że zapytania zobaczą go natychmiast . I nie musi optymalizować pod kątem aktualizacji istniejących dokumentów.

Jednak na koniec dnia, jeśli naprawdę chcesz wiedzieć, musisz przeczytać źródło. W końcu obie rzeczy, do których się odnosisz, są open source.

bmargulies
źródło
Jeśli dobrze rozumiem, to, co wyróżnia wyszukiwarki tekstowe, to sposób, w jaki radzą sobie z wyszukiwaniem wielowyrazowym i łączeniem wyników wyszukiwania z wieloma indeksami w czasie rzeczywistym. Nie sugerowałbym konsultowania się w tej sprawie ze źródłem Lucene. Prawdopodobnie lepiej byłoby poczytać trochę o teorii wyszukiwania tekstu, pomogła mi odpowiedź @ alienCoder.
Chris Dutrow
1
@bmargulies, jeśli indeksowanie jest „według słowa”, to dlaczego wyszukiwanie użytkownika stackoverflow stackoverflow.com/users zezwala na dopasowania podciągów?
Pacerier,
2
To nie jest miejsce na pełne odpowiedzi. Istnieje wiele opracowań dotyczących podstawowej koncepcji.
bmargulies
Co masz na myśli „indeks dla każdego słowa”… jeśli zacznę wpisywać „abc”, w jaki sposób znajdę „abc” w dokumencie?
Alexander Mills,
1
Indeks (B-drzewo) od słowa do dokumentu może wyszukiwać dokumenty według słów w dokumencie, ponieważ tabela takiego indeksu jest (słowo, dokument), gdzie indeks znajduje się w kolumnie słowa. Rozważ zapytanie typu: „Znajdź dokumenty zawierające słowa„ policja ”,„ przestępstwo ”,„ statystyki ””. Przeszukując indeks słów, możesz przeprowadzić trzy wyszukiwania dziennika (N), aby uzyskać O (N) dokumentów zawierających jedno z tych słów. Następnie możesz wykonać dwie pętle O (N), aby zbudować zestaw zawierający dokumenty zawierające wszystkie trzy słowa. Chociaż jest to teoretycznie operacja O (N), większość dokumentów nie ma wszystkich trzech słów, więc jej O (n), gdzie n <N.
Calicoder
34

Lucene tworzy duży indeks. Indeks zawiera identyfikator słowa, liczbę dokumentów, w których słowo jest obecne, oraz pozycję słowa w tych dokumentach. Więc kiedy zadajesz zapytanie o jedno słowo, przeszukuje tylko indeks (złożoność czasowa O (1)). Następnie wynik jest oceniany przy użyciu różnych algorytmów. W przypadku kwerend składających się z wielu wyrazów po prostu weź przecięcie zbioru plików, w których występują słowa. W ten sposób Lucene jest bardzo szybki.

Aby uzyskać więcej informacji, przeczytaj ten artykuł autorstwa programistów Google - http://infolab.stanford.edu/~backrub/google.html

alienCoder
źródło
8
Przeglądając ten papier, był całkiem pomocny. W szczególności odpowiedź, której szukałem, znalazła się w sekcji „4.5 Wyszukiwanie”. Konkretnie, wygląda na to, że wyszukiwanie hash O (1) jest używane dla pojedynczych słów, ale następnie skan O (n) jest używany do łączenia wyników z limitem 40 000 dokumentów. Zakładam, że algorytm redukcji mapy jest używany do podziału tej pracy, aby użytkownik uzyskał natychmiastowe wyniki.
Chris Dutrow
Jednym z popularnych algorytmów jest algorytm rankingu gołębi. Chociaż niewiele o tym wiem.
alienCoder
3
Ten artykuł jest zabawny: „W tym artykule przedstawiamy Google, prototyp…”. Myślę, że Google nie zawsze była mega-korporacją.
Przyciski 840
nie znam Lucene, ale jedno pytanie: ranking odbywa się przy każdym wyszukiwaniu? A może utrzymuje wstępnie uszeregowane dokumenty? Jeśli z wyprzedzeniem utrzymuje dokumenty zgodnie z rangą, w jaki sposób zachowuje się przy zapytaniach z wieloma słowami?
Vikas Prasad
Link jest teraz uszkodzony. @alienCoder
CEGRD
20

Jednym słowem: indeksowanie.

Lucene tworzy indeks twojego dokumentu, który pozwala na znacznie szybsze wyszukiwanie.

Jest taka sama różnica między strukturą danych listy O (N) a strukturą danych z tablicy skrótów O (1). Lista musi przejść przez całą kolekcję, aby znaleźć to, czego szukasz. Tabela skrótów ma indeks, który pozwala jej dokładnie ustalić, gdzie znajduje się żądany element i po prostu go pobrać.

Aktualizacja:

Nie jestem pewien, co masz na myśli, mówiąc „Wyszukiwania indeksu Lucene są dużo szybsze niż wyszukiwania indeksu mysql”.

Domyślam się, że używasz MySQL „GDZIE dokument LIKE '% fraza%'” do wyszukiwania dokumentu. Jeśli to prawda, MySQL musi wykonać skanowanie tabeli w każdym wierszu, który będzie O (N).

Lucene może przeanalizować dokument na tokeny, pogrupować je w n-gramach zgodnie z twoim kierunkiem i obliczyć indeksy dla każdego z nich. To O (1), aby znaleźć słowo w zindeksowanym dokumencie Lucene.

duffymo
źródło
10
Tak, rozumiem część dotyczącą indeksowania, ale znowu, wyszukiwania indeksu Lucene są dużo szybsze niż wyszukiwania indeksu mysql. Jak to się dzieje
Midhat
9

Lucene pracuje z częstotliwością terminów i odwrotną częstotliwością dokumentów . Tworzy indeks mapujący każde słowo z dokumentem i jego licznik częstotliwości, który jest niczym innym jak indeksem odwrotnym w dokumencie.

Przykład :

Plik 1: Pamięć o dostępie swobodnym jest pamięcią główną.

Plik 2: Dyski twarde to pamięć dodatkowa.

Lucene tworzy coś w rodzaju odwróconego indeksu

Plik 1:

Termin: losowy

Częstotliwość: 1

Pozycja: 0

Termin: pamięć

Częstotliwość: 2

Miejsce: 3

Miejsce: 6

Dzięki temu jest w stanie szybko wyszukiwać i odzyskiwać wyszukiwane treści. Jeśli dla zapytania wyszukiwania jest zbyt wiele dopasowań, zwraca wynik na podstawie wagi. Rozważ zapytanie wyszukiwania „Pamięć główna”, które wyszukuje wszystkie 4 słowa indywidualnie, a wynik będzie wyglądał następująco:

Główny

Plik 1: Częstotliwość - 1

Pamięć

Plik 1: Częstotliwość - 2

Plik 2: Częstotliwość - 1

Wynik byłby File1 następnie pliku Plik2 . Aby nie dać się ponieść wagom na najpopularniejszych słowach, takich jak „i”, „lub”, „the” bierze pod uwagę odwrotną częstotliwość dokumentu (tj. „Zmniejsza wagę słowa, które jest najpopularniejsze w zestawie dokumentów).

Tom Taylor
źródło