Lucene - proces indeksowania
Proces indeksowania jest jedną z podstawowych funkcji dostarczanych przez Lucene. Poniższy diagram ilustruje proces indeksowania i użycie klas. IndexWriter jest najważniejszym i podstawowym elementem procesu indeksowania.
Dodajemy Dokument (y) zawierające Pola do IndexWriter, który analizuje Dokument (y) za pomocą Analizatora, a następnie tworzy / otwiera / edytuje indeksy zgodnie z wymaganiami i przechowuje / aktualizuje je w Katalogu . IndexWriter służy do aktualizowania lub tworzenia indeksów. Nie jest używany do odczytywania indeksów.
Teraz pokażemy Ci krok po kroku, jak zacząć rozumieć proces indeksowania na prostym przykładzie.
Utwórz dokument
Utwórz metodę, aby uzyskać dokument Lucene z pliku tekstowego.
Twórz różne typy pól, które są parami klucz-wartość zawierającymi klucze jako nazwy i wartości jako zawartość do indeksowania.
Ustaw pole do analizy lub nie. W naszym przypadku analizujemy tylko treści, ponieważ mogą one zawierać dane takie jak a, am, are, an itp., Które nie są wymagane w operacjach wyszukiwania.
Dodaj nowo utworzone pola do obiektu dokumentu i zwróć je do metody wywołującej.
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS,
new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
Utwórz IndexWriter
Klasa IndexWriter pełni rolę podstawowego składnika, który tworzy / aktualizuje indeksy podczas procesu indeksowania. Wykonaj następujące kroki, aby utworzyć IndexWriter -
Step 1 - Utwórz obiekt IndexWriter.
Step 2 - Utwórz katalog Lucene, który powinien wskazywać lokalizację, w której mają być przechowywane indeksy.
Step 3 - Zainicjuj obiekt IndexWriter utworzony z katalogiem indeksu, standardowym analizatorem posiadającym informacje o wersji i inne wymagane / opcjonalne parametry.
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
Rozpocznij proces indeksowania
Poniższy program pokazuje, jak rozpocząć proces indeksowania -
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
Przykładowa aplikacja
Aby przetestować proces indeksowania, musimy utworzyć test aplikacji Lucene.
Krok | Opis |
---|---|
1 | Utwórz projekt o nazwie LuceneFirstApplication w pakiecie com.tutorialspoint.lucene, jak wyjaśniono w rozdziale Lucene - Pierwsza aplikacja . Możesz również użyć projektu utworzonego w rozdziale Lucene - Pierwsza aplikacja jako takiego w tym rozdziale, aby zrozumieć proces indeksowania. |
2 | Utwórz LuceneConstants.java, TextFileFilter.java i Indexer.java, jak wyjaśniono w rozdziale Lucene - pierwsza aplikacja . Pozostałe pliki nie zmieniaj. |
3 | Utwórz LuceneTester.java, jak wspomniano poniżej. |
4 | Wyczyść i skompiluj aplikację, aby upewnić się, że logika biznesowa działa zgodnie z wymaganiami. |
LuceneConstants.java
Ta klasa jest używana do dostarczania różnych stałych do użycia w przykładowej aplikacji.
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java
Ta klasa jest używana jako .txt filtr plików.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Indexer.java
Ta klasa jest używana do indeksowania surowych danych, dzięki czemu można je przeszukiwać za pomocą biblioteki Lucene.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Indexer {
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
public void close() throws CorruptIndexException, IOException {
writer.close();
}
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS,
new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
public int createIndex(String dataDirPath, FileFilter filter)
throws IOException {
//get all files in the data directory
File[] files = new File(dataDirPath).listFiles();
for (File file : files) {
if(!file.isDirectory()
&& !file.isHidden()
&& file.exists()
&& file.canRead()
&& filter.accept(file)
){
indexFile(file);
}
}
return writer.numDocs();
}
}
LuceneTester.java
Ta klasa jest używana do testowania możliwości indeksowania biblioteki Lucene.
package com.tutorialspoint.lucene;
import java.io.IOException;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.createIndex();
} catch (IOException e) {
e.printStackTrace();
}
}
private void createIndex() throws IOException {
indexer = new Indexer(indexDir);
int numIndexed;
long startTime = System.currentTimeMillis();
numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
long endTime = System.currentTimeMillis();
indexer.close();
System.out.println(numIndexed+" File indexed, time taken: "
+(endTime-startTime)+" ms");
}
}
Tworzenie katalogu danych i indeksów
Użyliśmy 10 plików tekstowych z plików record1.txt do record10.txt zawierających nazwiska i inne dane uczniów i umieściliśmy je w katalogu E:\Lucene\Data. Dane testowe . Ścieżka katalogu indeksu powinna zostać utworzona jakoE:\Lucene\Index. Po uruchomieniu tego programu możesz zobaczyć listę plików indeksu utworzonych w tym folderze.
Uruchomienie programu
Po utworzeniu źródła, surowych danych, katalogu danych i katalogu indeksu, możesz kontynuować kompilację i uruchomienie programu. Aby to zrobić, pozostaw aktywną kartę pliku LuceneTester.Java i użyj plikuRun opcja dostępna w Eclipse IDE lub użyj Ctrl + F11 skompilować i uruchomić LuceneTesterpodanie. Jeśli aplikacja zostanie pomyślnie uruchomiona, wydrukuje następujący komunikat w konsoli Eclipse IDE -
Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms
Po pomyślnym uruchomieniu programu będziesz mieć następującą zawartość w swoim index directory −