Wydaje się, że twoje pytanie bardziej dotyczy scalania indeksu niż samego indeksowania.
Proces indeksowania jest dość prosty, jeśli ignorujesz szczegóły niskiego poziomu. Lucene tworzy z dokumentów tzw. "Indeks odwrócony". Więc jeśli dokument z tekstem „Być albo nie być”, a id = 1 przychodzi, wskaźnik odwrócony wyglądałby następująco:
[to] → 1
[be] → 1
[or] → 1
[not] → 1
To jest w zasadzie to - indeks od słowa do listy dokumentów zawierające dane słowo. Każda linia tego indeksu (słowo) jest nazywana listą księgową. Ten indeks jest następnie przechowywany w magazynie długoterminowym.
W rzeczywistości oczywiście rzeczy są bardziej skomplikowane:
- Lucene może pominąć kilka słów na podstawie konkretnego analizatora danej;
- słowa mogą być wstępnie przetworzone za pomocą algorytmu rozstrzygania w celu zmniejszenia flexii języka;
- lista księgowań może zawierać nie tylko identyfikatory dokumentów, ale także przesunięcie danego słowa wewnątrz dokumentu (potencjalnie kilka wystąpień) i kilka innych dodatkowych informacji.
Istnieje wiele innych komplikacji, które nie są tak ważne dla podstawowego zrozumienia.
Ważne jest, aby zrozumieć, że indeks Lucene to dołącz tylko. W pewnym momencie aplikacja decyduje się zatwierdzić (opublikować) wszystkie zmiany w indeksie. Lucene zakończy wszystkie operacje serwisowe indeksem i zamknie je, aby można było je przeszukiwać. Po indeksie commit w zasadzie niezmiennym. Ten indeks (lub część indeksu) nazywa się segment. Kiedy Lucene wykona wyszukiwanie zapytania, wyszukuje we wszystkich dostępnych segmentach.
Pojawia się zatem pytanie - jak możemy zmienić już zindeksowany dokument?
Nowe dokumenty lub nowe wersje już zaindeksowanych dokumentów są indeksowane w nowych segmentach i starych wersjach unieważnionych w poprzednich segmentach przy użyciu tak zwanej listy zabitych. Lista zabić jest jedyną częścią zatwierdzonego indeksu, która może ulec zmianie. Jak można się domyślić, wydajność indeksów spada z czasem, ponieważ stare indeksy mogą zawierać głównie usunięte dokumenty.
W tym miejscu pojawia się łączenie. Łączenie - to proces łączenia kilku indeksów w celu uzyskania bardziej wydajnego wskaźnika ogólnego. Zasadniczo dzieje się podczas scalania dokumentów na żywo skopiowanych do nowego segmentu i starych segmentów całkowicie usuniętych.
Korzystanie z tego prostego procesu Lucene jest w stanie utrzymać indeks w dobrej formie pod względem wydajności wyszukiwania.
Mam nadzieję, że pomoże.
Większość odpowiedzi tutaj jest poprawna, że pierwszy Lucene * tworzy * odwrócony indeks, ale to nie wyjaśnia kluczowego punktu, w jaki ten indeks termin później dostaje * wyszukiwanie d * (i, jak sądzę, to, o co faktycznie prosił PO). Poniżej znajduje się nowa odpowiedź na to stare pytanie, które, mam nadzieję, zapewnia lepszy wgląd. – fnl
Zaktualizowałem odpowiedź jeszcze raz, ponieważ obecne odpowiedzi (w tym moje!) Nie są zbyt satysfakcjonujące, aby odpowiedzieć na dwa główne pytania OP (w jaki sposób Lucene zapewnia zoptymalizowane indeksowanie i według którego konkretnego algorytmu - listy pomijania, a nie B-drzewa , BTW). Mam nadzieję, że moje ostatnie aktualizacje odpowiedzą poprawnie na aktualne pytanie! – fnl