Lucenex

advertisement
Lucene.
Общий обзор библиотеки.
Реализация хорошего поиска – является сложной задачей. Поиск часто
является слабым местом многих приложений, особенно Web. Поэтому в
качестве опорной технологии для написания дипломной работы я выбрал
библиотеку полнотекстового поиска Lucene. [1] Эта библиотека полностью
написана на языке Java. Данная технология применима практически для
любого приложения, которое требует полнотекстового поиска по разного
рода документам. Данная библиотека лицензирована под Apache License,
Version 2.0[6], что позволяет ей распространяться свободно и с открытым
исходным кодом. Одним из главных плюсов является поддержка со стороны
Apache Software Foundation[2], сообщества, члены которого давно
зарекомендовали себя как высококвалифицированные профессионалы. При
этом, т.к. проект является открытым, вклад в него может внести любой
желающий.
Аналоги библиотеки Lucene.
Основным конкурентом библиотеки Lucene является библиотека
Sphinx[4]. Она написана на языке С++ и является кроссплатформенной.
Поддерживает следующие языки: РНР, Ruby, Python, Java, Perl, С++.
Распространяется по лицензии GPL2 [5]. Обладает высокой скоростью работы
и индексации. Поддерживается распределенный поиск и кластеризация.
Однако для работы требуется выделенный поисковый сервер. Данное
решение хорошо подходит для крупных и средних проектов. Однако
малоприменимо для маленьких.
Apache Lucene позволяет встраивать код в самые разные виды
приложений от настольных до веб-серверных, поэтому данное решение
имеет более широкий охват проектов. Также Apache Lucene имеет порты на
другие языки, такие как: C++,Perl,Java,.NET,Ruby,Python,PHP.
Среди аналогов стоит отметить библиотеку XAPIAN[7]. Она может
использоваться исключительно, как встраиваемая библиотека. Она в отличии
от Lucene и Spinx строит индекс, которые не требует полной перестройки при
добавлении нового документа. Имеет большое количество портов: С++, Perl
API, Java JINI, Python, PHP, TCL, C# и Ruby. Однако имеет довольно бедную
документацию. Поддержка Xapian в качестве поискового сервера является
слабой.
Не стоит забывать и о компании Яндекс[8]. Ее сервер является
бесплатным, работает довольно эффективно, однако исходный код данного
продукта недоступен, что сильно снижает его популярность.
Стоит отметить поисковое решение от компании Google[9]. Оно является
пожалуй наиболее надежным и проверенным временем, однако из-за того,
что данный сервис является платным для более-менее серьезных задач
многие программисты смотрят в первую очередь на Open Source проекты, в
которых они могут разобраться и которые имеют обширную документацию.
В первую очередь это Sphinx и Lucene.
Предназначение Lucene
Главная задача Lucene – решить проблему, с которой сталкивается
любой
разработчик:
избыток
информации.
Lucene
–
это
высокопроизводительная масштабируемая библиотека информационного
поиска. Сейчас она является самой популярной свободной библиотекой
информационного поиска. Lucene предоставляет простой, но очень мощный
API, который требует минимума понимания механизмов текстовой
индексации и поиска.
Преимущества Lucene
Основные преимущества
решения:[1]
использования
1. Ранжированный поиск.
2. Большое количество типов запросов (Queris).
a. wildcard запросов,
b. запрос фразы,
c. нечеткий поиск,
данного
поискового
3.
4.
5.
6.
7.
8.
9.
d. поиск с использованием стемминга и лемматизации.
e. Поиск по интервалам.
Требуется маленький объем RAM.
Размер индекса составляет 20-30% от размера самого текста.
Поиск по структурированному и гетерогенному контенту.
Быстрый поиск по большим объемам данных.
Использование встроенных анализаторов и возможность расширения
библиотеки с помощью собственных классов.
Использование настраиваемых фильтров.
Простота внедрения в уже существующее приложение.
Дочерние проекты Lucene
Apache Lucene является базовым для многих проектов верхнего уровня
Apache Software Foundation, таких как:
1.
2.
3.
4.
5.
6.
7.
Nutch
Solr
Hadoop
Lucene.NET
Apache Mahout
Apache Tika
Compass.
Поэтому в нем реализованы самые современные технологии и подходы,
в том числе с поддержкой распределенных вычислений, что способствует
проникновению технологии в проекты с высокой нагрузкой и
распределенных веб-приложений.
Проекты и фирмы, использующие Lucene:
На данный момент Lucene поддерживают такие проекты, как: [3]
1. CiteSeerX - поисковая система и цифровая библиотека с акцентом на
компьютерные и информационные науки. Ее фонд насчитывает около
750 000 документов.
2. Twitter – всемирно известный сервер цитат, статусов и коротких
сообщений.
3. Liferay – CMS, которая использует в качестве поисковика Lucene. На ней
функционируют сайты Улицы Сезам, Cisco Developer Network, Societe
Generale Group.
4. IBM – фирма не нуждающаяся в представлении, лидер в области
высокой технологии.
5. LinkedIn – социальная сеть, для людей, которые хотят найти работу.
Более 150 млн пользователей. Вакансии от крупнейших компаний.
6. Hewlett-Packard
7. Jira.
8. Netflix.
9. Британская энциклопедия.
И многие другие проекты и продукты, которые используют Lucene в
работе с большими объемами данных.
Схема работы.
Система Lucene состоит из 2 главных компонентов: индексатор и
поисковик. Индексатор работает непосредственно с данными типа byte, что
обеспечивает очень быстрый доступ. При этом он работает с применением
многопоточности, что позволяет получать индексы максимально быстро.
Формирование индекса происходит в несколько этапов:[1]
1. Указание источника контента (не зависит от типа источника, это может
быть как база данных, так и файл).
2. Запуск класса IndexWriter для чтения контента. Т.к. мы читаем
побайтово, то чтение получается очень быстрым. Плюс оно происходит
в несколько потоков.
3. Удаление стоп-слов, предлогов, союзов, частиц.
4. Использование анализаторов.
5. Отбрасывание окончаний и учет морфологии того языка, который нам
нужен.
6. Создание объекта типа Document.
7. Добавление объекта Field к Document.
8. Указание типа Field.
9. Сериализация объекта в файл.
Поиск по индексу происходит следующим образом: (рис.1)
1. Пользователь вводит через пользовательский интерфейс свой
поисковый запрос.
Рис.1
2.
3.
4.
5.
6.
7.
8.
9.
Выполняется построение поискового запроса типа Query.
Начинают работать анализаторы.
Десериализация объекта Document из файла.
Поиск по Field каждого объекта Document.
a. Каждое поле Field проверяется на атомарность (в качестве
атомарного объекта может выступать как строка, так и
подстрока).
b. Если поле не атомарно, то происходит дополнительное
разбиение.
c. Все поля сортируются в алфавитном порядке.
d. Выполняется двоичный поиск.
e. Для каждого совпадения, в зависимости от типа поиска
формируется свой вес Weight.
Происходит ранжирование результатов поиска в зависимости от
Weight.
Каждый результат поиска заносит в массив результатов типа Hits.
Результат поиска Hits преобразуется в тот вид, в котором он будет
выводится пользователю.
Вывод данных поиска пользователю.
Практическое использование библиотеки Lucene.
Использовать библиотеку Lucene на практике довольно просто. Для
этого достаточно запустить индексатор Lucene
try {
List<String> docIdList = parsedDocsService.getDocumentIds(groupId);
IndexWriter indexWriter = new IndexWriter(indexDir, new
StandardAnalyzer(), false);
for(String docId : docIdList) {
indexDocument(indexWriter,
parsedDocsService.loadDocument(docId));
}
indexWriter.close();
}
catch(IOException ioX) {
throw new RuntimeException("Error while creating lucene index: ",
ioX);
}
Данный фрагмент кода выполняет формирование индексов IndexWriter
на основе имеющихся данных parsedDocsService.loadDocument(docId) с
помощью стандартного анализатора StandardAnalyzer, с помощью которого
выполняется стемминг и исключаются предлоги и союзы. При
необходимости возможно использование других анализаторов или
написанных собственноручно.
Для поиска используется следующая конструкция:
try {
indexSearcher = new IndexSearcher(FSDirectory.getDirectory(indexDir));
} catch (IOException ioX) {
System.out.println("ERROR: "+ioX.getMessage());
}
QueryParser qp = new QueryParser("content", new StandardAnalyzer());
Query q = null;
try {
q = qp.parse(query);
} catch (ParseException pX) {
System.out.println("ERROR: "+pX.getMessage());
}
Hits hits = null;
try {
hits = indexSearcher.search(q);
indexSearcher.close();
} catch (IOException ioX) {
System.out.println("ERROR: "+ioX.getMessage());
}
Создаем объект IndexSearcher, который берет данные из indexDirectory,
в которой хранятся индексы. Создаем QueryParser, который обрабатывает
запрос пользователя и преобразует его в язык запросов Lucene. Далее
выполняем поиск IndexSearcher.index(q) и получаем результаты поиска hits
вместе с ранжированием.
Выводы.
Библиотека Apache Lucene является одним из наиболее популярных
поисковых решений в мире. Этому способствует большой спектр причин. Над
ней работает сообщество профессионалов из разных компаний
Google,Oracle,IBM и других. Однако внести вклад в развитие может любой
желающий. Высокая скорость работы, масштабируемость поисковых
решений, которая позволяет внедрять поиск в проектах самых разных
уровней от мелких до крупных. Распространенность и обширная
документация позволяют библиотеке занимать лидирующее место среди
остальных поисковых проектов. Ввиду перечисленных преимуществ и
особенностей работы библиотеки показалось целесообразным ее
использование в реализации системы интеллектуального поиска. Так как с
помощью нее можно получать быстро результаты полнотекстового поиска и
заниматься изучением собственных алгоритмов ранжирования и анализа на
основе полученных данных с помощью библиотеки. Основным мотивом ее
применения стало то, что она уже содержит встроенный индексатор,
который обеспечивает достаточное быстродействие. Плюс содержит
большое количество инструментов для анализа и нахождения необходимых
результатов. Библиотека активно развивается и широко используется, что
позволяет проще получать поддержку сообщества разработчиков. А также
гарантирует множество примеров программного кода для эффективного
внедрения библиотеки в собственные проекты.
Библиографический список.
1. http://lucene.apache.org/
2. http://www.apache.org/
3. http://wiki.apache.org/lucene-java/PoweredBy
4. http://sphinxsearch.com
5. http://www.cherubicsoft.com/license_rus.txt#.T7XUs1LPzQQ
6. http://www.apache.org/licenses/LICENSE-2.0
7. http://xapian.org
8. http://yandex.ru
9. http://google.com
Download