Apache Lucene

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:13, 17 июня 2018.
Apache Lucene
Привет.PNG
Создатели: Apache Software Foundation
Разработчики: Apache Software Foundation
Выпущена: 1999 год
Постоянный выпуск: 7.0.0 / 20 сентября 2017
Состояние разработки: Активное
Написана на: Java
Операционная система: Любая с поддержкой Java
Тип ПО: поиск и программирование
Лицензия: Apache Software License
Веб-сайт lucene.apache.org
Apache Lucene - высокопроизводительная полнофункциональная библиотека текстового поиска, которая была написанная на языке программирования Java. Эта технология подходит практически для любого приложения, которое требует полнотекстового поиска, особенно для кросс-платформенного поиска.

Apache Lucene - это проект с открытым исходным кодом, доступный для бесплатной загрузки.

Lucene является свободной библиотекой полного поиска фонда Apache, которая используется в качестве основы в двух самых популярных поисковых системах — Elasticsearch и Solr. Написана на языке Java.

История

Lucene была разработана в 1999 году Дугом Каттингом и изначально была расположена на сетевом ресурсе с адресом sourceforge.net

Затем, в 2001 году, была передана в фонд Apache, где сначала развивалась как проект Jakarta, но в 2005 году перешла в статус "проекта верхнего уровня фонда". Именно в рамках данного проекта были созданы подпроекты, которые затем стали самостоятельными. Например, Hadoop (обширная экосистема продуктов), Nutch и Solr (часть экосистемы Hadoop).

Основная функция библиотеки Lucene – обеспечение достаточно высокоскоростной индексации, к примеру, порядка 100 ГБ в час на сервере массового класса. Индекс, который создает библиотека занимает 20-30% от размера исходного текста.

Поисковой алгоритм поддерживает ранжированный поиск (лучшие результаты показываются первыми). Также поддерживается поиск по нескольким индексам с возможностью объединения результатов. Поиск в данной библиотеке возможен одновременно с процессом обновления индекса. Архитектура библиотеки представляет любой документ как набор текстовых полей. Данная функция позволяет её функционирование вне зависимости от форматов.

Адаптированна на такие языки программирования, как: С (Lucene4c), C++ (CLucene), Node.js, Go, Delphi (Mutis), PerI (PLucene), Ruby (Ferret и RubyLucene), PHP (в рамках Zend), Lisp (Montexuma), C# (Lucene.Net)[Источник 1].

Apache Software Foundation

Apache Software Foundation обеспечивает поддержку сообщества Apache проектов с открытым исходным кодом. Проекты Apache определяются совместными процессами консенсуса, открытой лицензией на программное обеспечение и желанием создать высококачественное программное обеспечение. Apache Lucene также,как и Apache Solr, Apache PyLucene, Apache Open Relevance Project и их соответствующие логотипы являются товарными знаками The Apache Software Foundation. [Источник 2].

Функции

Создание индексов в Apache
Индексация Apache Lucence

Lucene предлагает следующие функции с API:

  • Масштабируемая высокопроизводительная индексация, а именно более 150 ГБ / ч на современном оборудовании.
  • Требования к оперативному запоминающему устройству - всего 1 МБ.
  • Индексирование происходит так же быстро, как индексирование партий, то есть размер индекса приблизительно 20-30% от размера проиндексированного текста.
  • Мощные, точные и эффективные алгоритмы поиска. К примеру, ранжированный поиск - лучшие результаты выведены для много мощных типов запросов: фразовые запросы, постановочные запросы, запросы близости, запросы диапазона и многое другое.
  • Позволяет сортировать по любому полю.
  • Допускает поиск по нескольким индексам с комбинированными результатами.
  • Одновременное обновление и выполнение поиска.
  • Фильтрация, выбор, консолидация и группировка результатов.
  • Сменные модели ранжирования, включая модель векторного пространства и Okapi BM25, настраиваемый механизм хранения (кодеки).
  • Кросс-платформенное решение.
  • Доступно как программное обеспечение с открытым исходным кодом под лицензией Apache, которое позволяет использовать Lucene как в коммерческих, так и в открытых источниках.
  • 100% версия языка Java
  • Реализации других доступных языков программирования, совместимых с индексами.

Создание индексов в Apache

Проиндексировать документы можно с помощью класса MessageIndexer, который содержит метод index.

MessageIndexer имеет 2 переменные: create и documents. Переменная create отвечает за поведение индексатора. Если она равна true, то индексатор будет создавать новый индекс, даже если индекс уже существовал. Если false, то индекс будет обновляться.

Переменная documents это список объектов Document. Document это объект индексации и поиска. Он представляет собой набор полей. Каждое поле имеет имя и текстовое значение. Для того, чтобы получить список документов создан отдельный класс MessageToDocument. Его задача создавать Document, используя два поля: body и title.

Инструментарий

В статье описывается использование Apache Lucene 5.4.1. Исходный код доступен на Github, в репозитории есть небольшой набор данных для тестирования. Начать «играть» с проектом можно с запуска тестов в классе BasicSearchExamplesTest.

Создание индексов

Проиндексировать документы можно с помощью класса MessageIndexer. В нём есть метод index:

    public void index(final Boolean create, List<Document> documents) throws IOException {
        final Analyzer analyzer = new RussianAnalyzer();
        index(create, documents, analyzer);
    }

Он принимает на вход переменную create и documents. Переменная create отвечает за поведение индексатора. Если она равна true, то индексатор будет создавать новый индекс даже если индекс уже существовал. Если false, то индекс будет обновляться.

Переменная documents это список объектов Document. Document это объект индексации и поиска. Он представляет собой набор полей, каждое поле имеет имя и текстовое значение. Для того чтобы получить список документов создан класс MessageToDocument. Его задача создавать Document используя два строковых поля: body и title.

    public static Document createWith(final String titleStr, final String bodyStr) {
        final Document document = new Document();

        final FieldType textIndexedType = new FieldType();
        textIndexedType.setStored(true);
        textIndexedType.setIndexOptions(IndexOptions.DOCS);
        textIndexedType.setTokenized(true);

        //index title
        Field title = new Field("title", titleStr, textIndexedType);
        //index body
        Field body = new Field("body", bodyStr, textIndexedType);

        document.add(title);
        document.add(body);
        return document;
    }

Обратите внимание что метод index по умолчанию использует RussianAnalyzer, доступный в библиотеке lucene-analyzers-common.

Для того чтобы поиграть с созданием индекса перейдите к классу MessageIndexerTest.

Поиск

Для демонстрации базовых возможностей поиска создан класс BasicSearchExamples. В нём реализованы два метода поиска: простой поиск по токенам и нечеткий поиск. За простой поиск отвечают методы searchIndexWithTermQuery() и searchInBody(), за нечеткий поиск метод fuzzySearch().

В Lucene существует много способов создать запрос, но для простоты методы обычного поиска реализованы только с помощью классов QueryParser и TermQuery. Методы нечеткого поиска используют FuzzyQuery, которая зависит от одного важного параметра: maxEdits. Этот параметр отвечает за нечеткость поиска, подробности здесь. Грубо говоря, чем он больше, тем более расплывчатым/нечетким будет поиск.

Для того чтобы поиграть с поиском перейдите к классу BasicSearchExamplesTest

Задание

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

  • Сделайте интерактивный консольный поиск. Поиск должен показывать выдачу и спрашивать следующий запрос.
  • Сейчас поиск работает только с полем body. Сделайте так, чтобы поиск работал по полям title и body одновременно.
  • Подсчитайте количество проиндексированных слов (токенов)
  • Расширьте модель Message, добавьте в неё регион (region) и дату создания сообщения (creationDate). Не забудьте добавить новые поля для индексации в классе *MessageToDocument. Добавьте новые способы поиска с фильтром по региону и дате
  • Посмотрите на класс запросов MoreLikeThisQuery. Попробуйте сгруппировать все документы по похожести используя значение score.
  • Скачайте вот этот файл, в нем около 5000 различных сообщений. Проверьте как работает группировка, новые запросы и фильтры.[Источник 3]

Источники

  1. Lucene // Википедия [2002–2018]. Дата изменения: 15.08.2017. URL: https://ru.wikipedia.org/wiki/Lucene (Дата обращения: 14.05.2018).
  2. Welcome to Apache Lucene // Apache Lucene [2011–2016]. Дата изменения: 04.04.2018. URL: http://lucene.apache.org/ (Дата обращения: 14.05.2018).
  3. Материал по работе с Apache Lucene и созданию простейшего нечёткого поиска // Habr [2006–2018]. Дата изменения: 18.02.2016. URL: https://habr.com/post/277509/ (Дата обращения: 17.06.2018).