Dlaczego lucene jest potrzebne?
Wyszukiwanie jest jedną z najczęstszych operacji, które wykonujemy wiele razy dziennie. To wyszukiwanie może odbywać się na wielu stronach internetowych, które istnieją w Internecie lub aplikacji muzycznej lub repozytorium kodu lub kombinacja wszystkich z nich. Można pomyśleć, że prosta relacyjna baza danych może również obsługiwać wyszukiwanie. To jest poprawne. Bazy danych, takie jak MySQL obsługuje wyszukiwanie w pełnym teście. Ale co z siecią lub aplikacją muzyczną lub repozytorium kodu lub kombinacją wszystkich z nich? Baza danych nie może przechowywać tych danych w swoich kolumnach. Nawet jeśli tak, uruchomienie tego dużego wyszukiwania zajmie nie do przyjęcia.
Wyszukiwarka w pełnym teście jest w stanie uruchomić zapytanie na miliony plików jednocześnie. Prędkość, w której dane są przechowywane w dzisiejszej aplikacji, jest ogromna. Uruchomienie pełnego tekstu wyszukiwania tego rodzaju ilości danych jest trudnym zadaniem. Wynika to z faktu, że potrzebne informacje mogą istnieć w jednym pliku z miliardów plików przechowywanych w Internecie.
Jak działa Lucene?
Oczywiste pytanie, które powinno przyjechać na twój umysł, brzmi: w jaki sposób Lucene jest tak szybko w uruchomieniu zapytań o pełny tekst? Odpowiedź na to oczywiście jest przy pomocy wskaźników, które tworzy. Ale zamiast tworzyć klasyczny indeks, Lucene korzysta Odwrócone wskaźniki.
W klasycznym indeksie dla każdego dokumentu zbieramy pełną listę słów lub warunków zawiera dokument. W indeksie odwróconym, dla każdego słowa we wszystkich dokumentach, przechowujemy to, co dokument i pozycja tego słowa/termin można znaleźć. Jest to algorytm wysokiego standardu, który sprawia, że wyszukiwanie jest bardzo łatwe. Rozważ następujący przykład tworzenia klasycznego indeksu:
DOC1 -> „this”, „is”, „proste”, „Lucene”, „próbka”, „klasyczna”, „odwrócone”, „indeks”
Doc2 -> „Running”, „ElasticSearch”, „Ubuntu”, „aktualizacja”
Doc3 -> „Rabbitmq”, „Lucene”, „Kafka”, „”, „Spring”, „boot”
Jeśli użyjemy indeksu odwróconego, będziemy mieli wskaźniki takie jak:
Ten -> (2, 71)
Lucene -> (1, 9), (12,87)
Apache -> (12, 91)
Framework -> (32, 11)
Odwrócone indeksy są znacznie łatwiejsze w utrzymaniu. Załóżmy, że jeśli chcemy znaleźć Apache w moich warunkach, będę miał od razu odpowiedzi z odwróconymi indeksami, podczas gdy w przypadku klasycznego wyszukiwania będzie działać na pełnych dokumentach, które mogły nie być możliwe w scenariuszach w czasie rzeczywistym.
LUCENE Workflow
Zanim Lucene będzie faktycznie przeszukać dane, musi wykonywać kroki. Wizualizujmy te kroki w celu lepszego zrozumienia:
LUCENE Workflow
Jak pokazano na schemacie, tak się dzieje w Lucene:
Dzięki temu przepływowi pracy Lucene jest bardzo mocną wyszukiwarką pełnotekstową. Ale to jedyna część Lucene spełnia. Musimy wykonać pracę samodzielnie. Spójrzmy na potrzebne elementy indeksowania.
Komponenty Lucene
W tej sekcji opisamy podstawowe komponenty i podstawowe klasy Lucene używane do tworzenia wskaźników:
Indeksowanie pola
W powyższej tabeli postanowiliśmy przechowywać niektóre pola, a inne nie są przechowywane. Pole nadwozia nie jest przechowywane, ale indeksowane. Oznacza to, że wiadomość e -mail zostanie zwrócona w wyniku uruchomienia zapytania jednego z warunków zawartości ciała.
To tylko normalna odpowiedzialność StandardAnalyzer.
Przykładowa aplikacja
Będziemy używać jednego z wielu archetypów Maven, aby utworzyć przykładowy projekt dla naszego przykładu. Aby utworzyć projekt, wykonaj następujące polecenie w katalogu, którego użyjesz jako obszar roboczy:
MVN ArcheType: Generate -dgroupid = com.Linuxhint.Przykład -DartifactID = LH -Luceneexample -darchetypeartifactID = Maven -ArcheType -QuickStart -dinteractiveMode = false
Jeśli po raz pierwszy uruchomisz Maven, wykonanie polecenia generowania potrwa kilka sekund, ponieważ Maven musi pobrać wszystkie wymagane wtyczki i artefakty, aby zadanie generowania. Oto jak wygląda wyjście projektu:
Konfiguracja projektu
Po utworzeniu projektu możesz otworzyć go w ulubionym IDE. Kolejnym krokiem jest dodanie odpowiednich zależności Maven do projektu. Oto pom.plik XML z odpowiednimi zależnościami:
org.Apache.Lucene Lucene-Core 4.6.0 org.Apache.Lucene Lucene-analizers-common 4.6.0
Wreszcie, aby zrozumieć wszystkie słoiki, które są dodawane do projektu, gdy dodamy tę zależność, możemy uruchomić proste polecenie Maven, które pozwala nam zobaczyć pełne drzewo zależności projektu, gdy dodamy do niego zależności. Oto polecenie, którego możemy użyć:
Zależność MVN: drzewo
Po uruchomieniu tego polecenia pokaże nam następujące drzewo zależności:
Na koniec tworzymy klasę SimpleIndexer, która działa
pakiet com.Linuxhint.przykład;
Importuj Java.io.Plik;
Importuj Java.io.FileReader;
Importuj Java.io.IoException;
import org.Apache.Lucene.analiza.Analizator;
import org.Apache.Lucene.analiza.standard.StandardAnalyzer;
import org.Apache.Lucene.dokument.Dokument;
import org.Apache.Lucene.dokument.STEARDFIELD;
import org.Apache.Lucene.dokument.Pole tekstowe;
import org.Apache.Lucene.indeks.IndideWriter;
import org.Apache.Lucene.indeks.IndexWriterConfig;
import org.Apache.Lucene.sklep.FSDirectory;
import org.Apache.Lucene.Util.Wersja;
Klasa publiczna SimpleIndexer
Private static Final String indexDirectory = "/Users/Shubham/Somethere/Lh-LuceeEXample/index";
Private Static Final String dirtobeIndexed = "/Users/Shubham/Somethere/Lh-LuceeEXample/src/main/java/com/linuxhint/example";
public static void main (string [] args) rzuca wyjątek
Plik indexDir = nowy plik (indeksDirectory);
Plik datadir = nowy plik (dirtobeIndexed);
SimpleIndexer indexer = new SimpleIndexer ();
int numdexed = indekser.index (indexDir, dataDir);
System.na zewnątrz.println („Całkowite pliki indeksowane” + numdexed);
indeks private int indeks (indeksowanie plików, plik dataDir) rzuca ioException
Analyzer Analyzer = nowy StandardAnalyzer (wersja.Lucene_46);
IndexWriterConfig config = new indexWriterConfig (wersja.Lucene_46,
analizator);
IndexWriter indexWriter = nowy indeksWiter (FSDirectory.Otwarte (indexDir),
config);
Plik [] pliki = datadir.ListFiles ();
dla (plik f: pliki)
System.na zewnątrz.println („plik indeksujący” + f.getCanonicalPath ());
Document doc = new Document ();
Doc.add (nowy tekstfield („content”, nowy FileReader (f)));
Doc.Dodaj (nowy STORODEFFIEL („Filename”, F.getCanonicalPath ()));
indideWriter.addDocument (DOC);
int numIndexed = indideWriter.maxdoc ();
indideWriter.zamknąć();
return numindexed;
W tym kodzie właśnie stworzyliśmy instancję dokumentu i dodaliśmy nowe pole reprezentujące zawartość pliku. Oto dane wyjściowe, które otrzymujemy podczas uruchamiania tego pliku:
Indeksowanie pliku/użytkowników/shubham/gdzieś/lh-luceneexample/src/main/java/com/linuxhint/example/simpleindexer.Jawa
Całkowite pliki indeksowane 1
Ponadto w projekcie powstaje nowy katalog z następującą treścią:
Dane indeksu
Przeanalizujemy, co wszystkie pliki są tworzone w tym indeksie na więcej lekcjach, które pojawią się Lucene.
Wniosek
W tej lekcji przyjrzeliśmy się, jak działa Apache Lucene, a także złożyliśmy prostą przykładową aplikację opartą na Maven i Javie.