apache lucene + hibernate = hibernate search
TRANSCRIPT
2CONFIDENTIAL
• Проблемы SQL-поиска
• Полнотекстовый поиск
• Apache Lucene
• Hibenate ORM
• Hibernate Search
Agenda
3CONFIDENTIAL
ORM
JEE-приложение
JEE-приложение: Архитектура
POJO -
beans РСУБД
4CONFIDENTIAL
JEE-приложение: Проблематика
5CONFIDENTIAL
•Низкая производительность поисковых запросов;
•Поиск без учёта морфологии языка
•Нерелевантность результатов поиска;
•Поиск по множественным полям
•Перегруженность интерфейсов поисковых форм.
Проблемы SQL-поиска
6CONFIDENTIAL
JEE-приложение: Проблематика
7CONFIDENTIAL
JEE-приложение: Решение проблемы
8CONFIDENTIAL
Полнотекстовый поиск - это лингвистический поиск в
текстовых данных в полнотекстовых индексах путем
обработки слов и фраз в соответствии с правилами
конкретного языка.
•Поддержка морфологии, неточный поиск;
•Высокая скорость поиска;
•Выдача результатов по релевантности;
•Игнорирование незначимых слов (стоп-слова).
Полнотекстовый поиск
9CONFIDENTIAL
Apache Lucene
Java-библиотека, которая
предоставляет API для индексирования
и полнотекстового поиска документов
Основные фичи:
• Полнотекстовый поиск;
• Анализаторы для разных языков;
• Высокая производительность;
• Масштабируемость;
• Кроссплатформенность;
• Open Source;
• Поддержка других языков (C++,.NET, Python, Ruby)
10CONFIDENTIAL
Object-relational mapping (ORM) – слой между СУБД и
объектной моделью приложения.
Hibernate: ORM
11CONFIDENTIAL
• работа с POJO-объектами;
• природная модель ООП;
• высокая скорость разработки;
• возможности построения запросов (Criteria
API, HQL, JPAQL, native SQL);
• поддержка SQL диалектов;
Hibernate: Особенности
12CONFIDENTIAL
SEARCH
ORM
JEE-приложение
Hibernate Search
POJO -
beans
РСУБД
Lucene -
индексы
hibernate.cfg.xml
13CONFIDENTIAL
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.2.0.Final</version>
</dependency>
Hibernate Search: Maven
14CONFIDENTIAL
// POJO-объект до добавления Hibernate Search - аннотаций
@Entity
public class Book {
@Id @GeneratedValue
private Integer id;
private String title;
private String subtitle;
@ManyToMany
private Set<Author> authors;
private Date publicationDate;
//public getters and setters
}
Hibernate Search: Mapping Entities
15CONFIDENTIAL
// POJO-объект после добавления Hibernate Search - аннотаций
@Entity @Indexed
public class Book {
@Id @GeneratedValue @DocumentId
private Integer id;
@Field(analyze = Analyze.YES, store = Store.NO)
private String title;
private String subtitle;
@ManyToMany @IndexedEmbedded
private Set<Author> authors;
@Field(analyze = Analyze.NO, store = Store.YES)
@DateBridge(resolution = Resolution.DAY)
private Date publicationDate;
}
Hibernate Search: Mapping Entities
16CONFIDENTIAL
FullTextSession fullTextSession = Search.getFullTextSession(session);
MassIndexer indexer = fullTextSession.createIndexer()
.purgeAllOnStart(true)
.optimizeOnFinish(true)
.batchSizeToLoadObjects(100)
.threadsToLoadObjects(10);
indexer.startAndWait(); // стартуем процесс индексации
Hibernate Search: Indexing
17CONFIDENTIAL
FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Book.class).get();
String userQuery = "что-то про страну чудес";
Query luceneQuery = queryBuilder.keyword()
.onFields("title", "subtitle", "authors.name")
.matching(userQuery)
.createQuery();
Hibernate Search: Searching
18CONFIDENTIAL
FullTextQuery hibQuery =
fullTextSession.createFullTextQuery(luceneQuery, Book.class);
List result = hibQuery.list();
---
Book [id=1, title='Aлиса в стране чудес', authors=[Author
[id=1, name='Льюис Кэрролл']]
Book [id=3, title='Италия - страна чудес', authors=[Author
[id=2, name='Витторио Згарби']]
Hibernate Search: Searching
19CONFIDENTIAL
https://github.com/DmitryKey/luke/releases
Hibernate Search: Luke
Полезная утилита, которая просто
необходима для отладки работы с
полнотекстовыми индексами.
Фичи:
• выполнения поиска
• просмотр результатов;
• удаление документов из индекса;
• изучение частоты встречаемости
термина, и многое другое..
20CONFIDENTIAL
После внедрения полнотекстового поиска:
•Высокая скорость поиска;
•Неточный поиск;
•Специальные поисковые операторы для уточнения поиска;
• ???????
JEE-приложение: Benefits
•PROFIT
21CONFIDENTIAL
Hibernate Search in Action. Emmanuel Bernard and
John Griffin
Hibernate Search by Example. Steve Perkins
Hibernate Search Documentation -
http://docs.jboss.org/hibernate/search/5.1/
Apache LuceneTM 5.1.0 Documentation -
http://lucene.apache.org/core/5_1_0/index.html
RTFM
22CONFIDENTIAL
Вопросы?