Процесс индексирования является одной из основных функций, предоставляемых Lucene. Следующая диаграмма иллюстрирует процесс индексации и использование классов. IndexWriter является наиболее важным и ключевым компонентом процесса индексирования.
Мы добавляем Документ (ы), содержащий Поля (и), в IndexWriter, который анализирует Документ (ы) с помощью Анализатора, а затем создает / открывает / редактирует индексы по мере необходимости и сохраняет / обновляет их в Справочнике . IndexWriter используется для обновления или создания индексов. Он не используется для чтения индексов.
Теперь мы покажем вам пошаговый процесс, чтобы дать толчок к пониманию процесса индексации на базовом примере.
Создать документ
-
Создайте метод, чтобы получить документ Lucene из текстового файла.
-
Создайте различные типы полей, которые представляют собой пары «ключ-значение», содержащие ключи в качестве имен и значения в качестве содержимого для индексации.
-
Установить поле для анализа или нет. В нашем случае анализируется только содержимое, поскольку оно может содержать такие данные, как, am, are и т. Д., Которые не требуются в операциях поиска.
-
Добавьте вновь созданные поля в объект документа и верните его в метод вызывающей стороны.
Создайте метод, чтобы получить документ Lucene из текстового файла.
Создайте различные типы полей, которые представляют собой пары «ключ-значение», содержащие ключи в качестве имен и значения в качестве содержимого для индексации.
Установить поле для анализа или нет. В нашем случае анализируется только содержимое, поскольку оно может содержать такие данные, как, am, are и т. Д., Которые не требуются в операциях поиска.
Добавьте вновь созданные поля в объект документа и верните его в метод вызывающей стороны.
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; }
Создать IndexWriter
Класс IndexWriter действует как основной компонент, который создает / обновляет индексы в процессе индексирования. Выполните следующие шаги для создания IndexWriter —
Шаг 1 — Создать объект IndexWriter.
Шаг 2 — Создайте каталог Lucene, который должен указывать на место, где должны храниться индексы.
Шаг 3 — Инициализируйте объект IndexWriter, созданный с помощью каталога index, стандартного анализатора с информацией о версии и другими обязательными / дополнительными параметрами.
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); }
Начать процесс индексации
Следующая программа показывает, как запустить процесс индексации:
private void indexFile(File file) throws IOException { System.out.println("Indexing "+file.getCanonicalPath()); Document document = getDocument(file); writer.addDocument(document); }
Пример приложения
Чтобы протестировать процесс индексации, нам нужно создать тест приложения Lucene.
шаг | Описание |
---|---|
1 |
Создайте проект с именем LuceneFirstApplication в пакете com.tutorialspoint.lucene, как описано в главе « Lucene — First Application» . Вы также можете использовать проект, созданный в главе Lucene — First Application как таковой для этой главы, чтобы понять процесс индексации. |
2 |
Создайте LuceneConstants.java, TextFileFilter.java и Indexer.java, как описано в главе « Lucene — Первое приложение» . Оставьте остальные файлы без изменений. |
3 |
Создайте LuceneTester.java, как указано ниже. |
4 |
Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями. |
Создайте проект с именем LuceneFirstApplication в пакете com.tutorialspoint.lucene, как описано в главе « Lucene — First Application» . Вы также можете использовать проект, созданный в главе Lucene — First Application как таковой для этой главы, чтобы понять процесс индексации.
Создайте LuceneConstants.java, TextFileFilter.java и Indexer.java, как описано в главе « Lucene — Первое приложение» . Оставьте остальные файлы без изменений.
Создайте LuceneTester.java, как указано ниже.
Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями.
LuceneConstants.java
Этот класс используется для предоставления различных констант, которые будут использоваться в приложении-образце.
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
Этот класс используется как фильтр файлов .txt .
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
Этот класс используется для индексации необработанных данных, чтобы мы могли сделать их доступными для поиска с помощью библиотеки 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
Этот класс используется для проверки возможности индексирования библиотеки 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"); } }
Создание каталога данных и индексов
Мы использовали 10 текстовых файлов от record1.txt до record10.txt, содержащих имена и другие сведения об учениках, и поместили их в каталог E: \ Lucene \ Data. Тестовые данные . Путь к каталогу индекса должен быть создан как E: \ Lucene \ Index . После запуска этой программы вы можете увидеть список индексных файлов, созданных в этой папке.
Запуск программы
Когда вы закончите с созданием источника, необработанных данных, каталога данных и каталога индекса, вы можете приступить к компиляции и запуску вашей программы. Для этого оставьте активную вкладку файла LuceneTester.Java активной и используйте либо опцию « Выполнить», доступную в Eclipse IDE, либо используйте Ctrl + F11 для компиляции и запуска приложения LuceneTester . Если ваше приложение работает успешно, оно напечатает следующее сообщение в консоли 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
После того, как вы успешно запустите программу, у вас будет следующий контент в каталоге index —