Процесс поиска является одной из основных функциональных возможностей, предоставляемых Lucene. Следующая диаграмма иллюстрирует процесс и его использование. IndexSearcher является одним из основных компонентов процесса поиска.
Сначала мы создаем каталог (и), содержащий индексы, а затем передаем его в IndexSearcher, который открывает каталог с помощью IndexReader . Затем мы создаем запрос с термином и выполняем поиск с использованием IndexSearcher , передавая запрос поисковику. IndexSearcher возвращает объект TopDocs, который содержит детали поиска вместе с идентификаторами документа, который является результатом операции поиска.
Теперь мы покажем вам пошаговый подход и поможем понять процесс индексации на простом примере.
Создать QueryParser
Класс QueryParser анализирует введенный пользователем ввод в запрос понятного формата Lucene. Выполните следующие шаги, чтобы создать QueryParser —
Шаг 1 — Создать объект QueryParser.
Шаг 2 — Инициализируйте объект QueryParser, созданный с помощью стандартного анализатора, имеющего информацию о версии и имя индекса, для которого должен выполняться этот запрос.
QueryParser queryParser; public Searcher(String indexDirectoryPath) throws IOException { queryParser = new QueryParser(Version.LUCENE_36, LuceneConstants.CONTENTS, new StandardAnalyzer(Version.LUCENE_36)); }
Создать IndexSearcher
Класс IndexSearcher выступает в качестве основного компонента, который индексирует поисковый индекс, созданный в процессе индексирования. Выполните следующие шаги для создания IndexSearcher —
Шаг 1 — Создать объект IndexSearcher.
Шаг 2 — Создайте каталог Lucene, который должен указывать на место, где должны храниться индексы.
Шаг 3 — Инициализируйте объект IndexSearcher, созданный с помощью каталога index.
IndexSearcher indexSearcher; public Searcher(String indexDirectoryPath) throws IOException { Directory indexDirectory = FSDirectory.open(new File(indexDirectoryPath)); indexSearcher = new IndexSearcher(indexDirectory); }
Сделать поиск
Выполните следующие шаги, чтобы сделать поиск —
Шаг 1 — Создайте объект Query, анализируя поисковое выражение через QueryParser.
Шаг 2 — Выполните поиск, вызвав метод IndexSearcher.search ().
Query query; public TopDocs search( String searchQuery) throws IOException, ParseException { query = queryParser.parse(searchQuery); return indexSearcher.search(query, LuceneConstants.MAX_SEARCH); }
Получить документ
Следующая программа показывает, как получить документ.
public Document getDocument(ScoreDoc scoreDoc) throws CorruptIndexException, IOException { return indexSearcher.doc(scoreDoc.doc); }
Закрыть IndexSearcher
Следующая программа показывает, как закрыть IndexSearcher.
public void close() throws IOException { indexSearcher.close(); }
Пример приложения
Давайте создадим тестовое приложение Lucene для тестирования процесса поиска.
шаг | Описание |
---|---|
1 |
Создайте проект с именем LuceneFirstApplication в пакете com.tutorialspoint.lucene, как описано в главе « Lucene — First Application» . Вы также можете использовать проект, созданный в главе Lucene — First Application как таковой для этой главы, чтобы понять процесс поиска. |
2 |
Создайте LuceneConstants.java, TextFileFilter.java и Searcher.java, как описано в главе « Lucene — Первое приложение» . Оставьте остальные файлы без изменений. |
3 |
Создайте LuceneTester.java, как указано ниже. |
4 |
Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями. |
Создайте проект с именем LuceneFirstApplication в пакете com.tutorialspoint.lucene, как описано в главе « Lucene — First Application» . Вы также можете использовать проект, созданный в главе Lucene — First Application как таковой для этой главы, чтобы понять процесс поиска.
Создайте LuceneConstants.java, TextFileFilter.java и Searcher.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"); } }
Searcher.java
Этот класс используется для чтения индексов, созданных на необработанных данных, и поиска данных с использованием библиотеки Lucene.
package com.tutorialspoint.lucene; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class Searcher { IndexSearcher indexSearcher; QueryParser queryParser; Query query; public Searcher(String indexDirectoryPath) throws IOException { Directory indexDirectory = FSDirectory.open(new File(indexDirectoryPath)); indexSearcher = new IndexSearcher(indexDirectory); queryParser = new QueryParser(Version.LUCENE_36, LuceneConstants.CONTENTS, new StandardAnalyzer(Version.LUCENE_36)); } public TopDocs search( String searchQuery) throws IOException, ParseException { query = queryParser.parse(searchQuery); return indexSearcher.search(query, LuceneConstants.MAX_SEARCH); } public Document getDocument(ScoreDoc scoreDoc) throws CorruptIndexException, IOException { return indexSearcher.doc(scoreDoc.doc); } public void close() throws IOException { indexSearcher.close(); } }
LuceneTester.java
Этот класс используется для проверки возможности поиска библиотеки Lucene.
package com.tutorialspoint.lucene; import java.io.IOException; import org.apache.lucene.document.Document; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; public class LuceneTester { String indexDir = "E:\\Lucene\\Index"; String dataDir = "E:\\Lucene\\Data"; Searcher searcher; public static void main(String[] args) { LuceneTester tester; try { tester = new LuceneTester(); tester.search("Mohan"); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } private void search(String searchQuery) throws IOException, ParseException { searcher = new Searcher(indexDir); long startTime = System.currentTimeMillis(); TopDocs hits = searcher.search(searchQuery); long endTime = System.currentTimeMillis(); System.out.println(hits.totalHits + " documents found. Time :" + (endTime - startTime) +" ms"); for(ScoreDoc scoreDoc : hits.scoreDocs) { Document doc = searcher.getDocument(scoreDoc); System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH)); } searcher.close(); } }
Создание каталога данных и индексов
Мы использовали 10 текстовых файлов с именем record1.txt для record10.txt, содержащих имена и другие сведения об учениках, и поместили их в каталог E: \ Lucene \ Data. Тестовые данные . Путь к каталогу индекса должен быть создан как E: \ Lucene \ Index. После запуска программы индексирования в главе Lucene — Процесс индексирования вы можете увидеть список индексных файлов, созданных в этой папке.
Запуск программы
Как только вы закончите с созданием источника, необработанных данных, каталога данных, каталога индекса и индексов, вы можете приступить к компиляции и запуску вашей программы. Для этого оставьте активную вкладку файла LuceneTester.Java активной и используйте либо опцию «Выполнить», доступную в Eclipse IDE, либо используйте Ctrl + F11 для компиляции и запуска приложения LuceneTesterapplication . Если ваше приложение работает успешно, оно напечатает следующее сообщение в консоли Eclipse IDE: