Lucene

Введение в Lucene

Введение в Lucene
В этом уроке мы поймем, как работает одна из самых мощных полнотекстовых поисковых систем, Apache Lucene. С Apache Lucene мы можем использовать API-интерфейсы, которые он предоставляет на многих языках программирования, и создавать необходимые нам функции. Lucene - один из самых мощных движков, на котором построен Elasticsearch.Прежде чем мы начнем с приложения, которое демонстрирует работу Apache Lucene, мы поймем, как работает Lucene и многие ее компоненты. Давайте начнем.

Зачем нужен Lucene?

Поиск - одна из самых распространенных операций, которые мы выполняем несколько раз в день. Этот поиск может осуществляться по нескольким веб-страницам, которые существуют в Интернете, или в музыкальном приложении, или в репозитории кода, или по комбинации всего вышеперечисленного. Можно подумать, что простая реляционная база данных также может поддерживать поиск. Это правильно. Базы данных, такие как MySQL, поддерживают полнотекстовый поиск. Но как насчет Интернета, музыкального приложения, репозитория кода или комбинации всего вышеперечисленного?? База данных не может хранить эти данные в своих столбцах. Даже если бы это было так, на выполнение такого большого поиска потребуется неприемлемо много времени.

Система полнотекстового поиска способна выполнять поисковый запрос сразу по миллионам файлов. Скорость, с которой данные хранятся в приложении сегодня, огромна. Выполнение полнотекстового поиска в таком объеме данных - сложная задача. Это связано с тем, что нужная нам информация может находиться в одном файле из миллиардов файлов, хранящихся в сети.

Как работает Lucene?

Возникает очевидный вопрос: как Lucene так быстро выполняет полнотекстовые поисковые запросы?? Ответ на это, конечно же, с помощью индексов, которые он создает. Но вместо создания классического индекса Lucene использует Инвертированные индексы.

В классическом указателе для каждого документа мы собираем полный список слов или терминов, содержащихся в документе. В перевернутом указателе для каждого слова во всех документах мы сохраняем, какой документ и позицию, по которой можно найти это слово / термин. Это высококлассный алгоритм, который упрощает поиск. Рассмотрим следующий пример создания классического индекса:

Doc1 -> "This", "is", "simple", "Lucene", "sample", "classic", "инвертированный", "index"
Doc2 -> "Запуск", "Elasticsearch", "Ubuntu", "Обновление"
Doc3 -> "RabbitMQ", "Lucene", "Kafka", "", "Spring", "Boot"

Если мы используем инвертированный индекс, у нас будут такие индексы, как:

Это -> (2, 71)
Люцен -> (1, 9), (12,87)
Apache -> (12, 91)
Каркас -> (32, 11)

Инвертированные индексы намного проще поддерживать. Предположим, что если мы хотим найти Apache в моих условиях, я сразу получу ответы с инвертированными индексами, тогда как при классическом поиске будут выполняться полные документы, которые, возможно, было невозможно запустить в сценариях в реальном времени.

Рабочий процесс Lucene

Прежде чем Lucene сможет действительно искать данные, ей необходимо выполнить шаги. Давайте визуализируем эти шаги для лучшего понимания:

Рабочий процесс Lucene

Как показано на диаграмме, в Lucene происходит следующее:

  1. Lucene загружает документы и другие источники данных
  2. Для каждого документа Lucene сначала преобразует эти данные в обычный текст, а затем анализаторы преобразуют этот источник в обычный текст
  3. Для каждого термина в простом тексте создаются инвертированные индексы
  4. Индексы готовы к поиску

Благодаря этому рабочему процессу Lucene представляет собой очень сильную систему полнотекстового поиска. Но это единственная часть, которую выполняет Lucene. Нам нужно выполнять работу самим. Давайте посмотрим на необходимые компоненты индексирования.

Компоненты Lucene

В этом разделе мы опишем базовые компоненты и базовые классы Lucene, используемые для создания индексов:

Пример приложения

Мы будем использовать один из многих архетипов Maven, чтобы создать образец проекта для нашего примера. Чтобы создать проект, выполните следующую команду в каталоге, который вы будете использовать в качестве рабочей области:

mvn архетип: сгенерировать -DgroupId = com.linuxhint.пример -DartifactId = LH-LuceneExample -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false

Если вы запускаете maven в первый раз, выполнение команды генерации займет несколько секунд, потому что maven необходимо загрузить все необходимые плагины и артефакты, чтобы выполнить задачу генерации. Вот как выглядит результат проекта:

Настройка проекта

После того, как вы создали проект, не стесняйтесь открывать его в своей любимой IDE. Следующим шагом является добавление в проект соответствующих зависимостей Maven. Вот помпон.xml с соответствующими зависимостями:



org.апач.Люцен
люценовое ядро
4.6.0


org.апач.Люцен
Люцен-анализаторы-общие
4.6.0

Наконец, чтобы понять все JAR-файлы, которые добавляются в проект при добавлении этой зависимости, мы можем запустить простую команду Maven, которая позволяет нам увидеть полное дерево зависимостей для проекта, когда мы добавляем к нему некоторые зависимости. Вот команда, которую мы можем использовать:

Зависимость mvn: дерево

Когда мы запустим эту команду, она покажет нам следующее дерево зависимостей:

Наконец, мы создаем класс SimpleIndexer, который запускает

пакет com.linuxhint.пример;
импорт Java.io.Файл;
импорт Java.io.FileReader;
импорт Java.io.IOException;
организация импорта.апач.Люцен.анализ.Анализатор;
импортная организация.апач.Люцен.анализ.стандарт.StandardAnalyzer;
импортная организация.апач.Люцен.документ.Документ;
организация импорта.апач.Люцен.документ.StoredField;
импортная организация.апач.Люцен.документ.Текстовое поле;
импортная организация.апач.Люцен.индекс.IndexWriter;
импортная организация.апач.Люцен.индекс.IndexWriterConfig;
организация импорта.апач.Люцен.хранить.FSDirectory;
импортная организация.апач.Люцен.утилита.Версия;
public class SimpleIndexer
приватный статический финал String indexDirectory = "/ Users / shubham / где-нибудь / LH-LuceneExample / Index";
private static final String dirToBeIndexed = "/ Users / shubham / где-то / LH-LuceneExample / src / main / java / com / linuxhint / example";
public static void main (String [] args) выдает исключение
Файл indexDir = новый файл (indexDirectory);
Файл dataDir = новый файл (dirToBeIndexed);
Индексатор SimpleIndexer = новый SimpleIndexer ();
int numIndexed = индексатор.индекс (indexDir, dataDir);
Система.вне.println ("Всего проиндексированных файлов" + numIndexed);

частный индекс int (File indexDir, File dataDir) выдает исключение IOException
Analyzer analyzer = новый StandardAnalyzer (Версия.LUCENE_46);
Конфигурация IndexWriterConfig = новый IndexWriterConfig (Версия.LUCENE_46,
анализатор);
IndexWriter indexWriter = новый IndexWriter (FSDirectory.открыть (indexDir),
config);
Файл [] files = dataDir.listFiles ();
for (Файл f: файлы)
Система.вне.println ("Индексируемый файл" + f.getCanonicalPath ());
Документ doc = новый документ ();
док.добавить (новый TextField ("контент", новый FileReader (f)));
док.add (new StoredField ("имя_файла", f.getCanonicalPath ()));
indexWriter.addDocument (док);

int numIndexed = indexWriter.maxDoc ();
indexWriter.Закрыть();
return numIndexed;

В этом коде мы только что создали экземпляр документа и добавили новое поле, представляющее содержимое файла. Вот результат, который мы получаем, когда запускаем этот файл:

Индексируемый файл / Пользователи / shubham / где-то / LH-LuceneExample / src / main / java / com / linuxhint / example / SimpleIndexer.Ява
Всего проиндексировано файлов 1

Также внутри проекта создается новый каталог со следующим содержимым:

Индексные данные

Мы проанализируем, какие все файлы созданы в этом указателе, в следующих уроках, посвященных Lucene.

Заключение

В этом уроке мы рассмотрели, как работает Apache Lucene, а также создали простой пример приложения, основанного на Maven и java.

Переназначьте кнопки мыши по-разному для разных программ с помощью X-Mouse Button Control
Может быть, вам нужен инструмент, который мог бы изменять управление вашей мышью с каждым приложением, которое вы используете. В этом случае вы можете...
Обзор беспроводной мыши Microsoft Sculpt Touch
Я недавно прочитал о Microsoft Sculpt Touch беспроводная мышь и решил ее купить. Побывав некоторое время, я решил поделиться своим опытом с ним. Эта б...
Экранный трекпад и указатель мыши AppyMouse для планшетов с Windows
Пользователи планшетов часто пропускают указатель мыши, особенно когда они привыкли пользоваться ноутбуками. Смартфоны и планшеты с сенсорным экраном ...