Transcript Prezentacja

Hibernate Search w praktyce
Czyli wyszukiwanie pełnotekstowe w javowej aplikacji
Dobra wyszukiwarka
• Pomaga wyszukać właściwe wyniki
▫ Podpowiada
▫ Domyśla się intencji użytkownika
• Jest odporna na literówki
• „Wie” czego szukamy
Proste wyszukiwanie
select * from x where x.y ilike ‘%param%’;
Proste wyszukiwanie
Zalety
Łatwo zaimplementować
Wady
Każdy wynik jest
równorzędny
Niewydajne przy dużych
zbiorach
Źle zaimplementowane
dostarczy mylnych wyników
Większa trafność wyników? Ok!
Tagi
Wyszukiwanie pełnotekstowe?
Co wybrać?
• Solr
• ElasticSearch
• Hibernate Search
Solr?
• Zapytania za pośrednictwem żądań HTTP
• XMLe, wszędzie XMLe
• Dodatkowy serwer SOLR
• Reguły indeksowania odseparowane od
definicji obiektów domenowych
SOLR do PoC-owania?
Hibernate Search
• Co to jest?
• Kiedy używać?
• Dlaczego?
• Jak?
Hibernate Search =
Lucene
+ komponenty SOLR
+ integracja z Hibernate
Kiedy używać Hibernate Search?
Dlaczego Hibernate Search?
• Integracja indeksów Lucene z operacjami w
Hibernate
• Pracujemy na obiektach
• Bajecznie prosta integracja z aplikacją
korzystającą z Hibernate
Zalety?
• Przyjazny DSL
• Wiele trybów wyszukiwania
• Procesory
• Warunkowe indeksowanie
Przyjazny DSL
org.hibernate.search.query.dsl.QueryBuilder
queryBuilder =
fullTextSession.getSearchFactory()
.buildQueryBuilder()
.forEntity( MyClass.class )
.get();
Tryby wyszukiwania
• Z użyciem słów kluczowych
• Rozmyte
• Z użyciem wildcardów
• Z użyciem dokładnej frazy
• Z wykorzystaniem zakresu
• Boolowskie
• Fasetowe
org.apache.lucene.search.Query
luceneQuery =
queryBuilder
.keyword()
.onFields("someField", "otherField")
.matching(providedValues)
.createQuery();
Tryby wyszukiwania
• Z użyciem słów kluczowych
• Rozmyte
• Z użyciem wildcardów
• Z użyciem dokładnej frazy
• Z wykorzystaniem zakresu
• Boolowskie
• Fasetowe
luceneQuery =
queryBuilder
.keyword()
.fuzzy()
.withThreshold(0.7f)
.onFields("someField", "otherField")
.matching(providedValues)
.createQuery();
Tryby wyszukiwania
• Z użyciem słów kluczowych
• Rozmyte
• Z użyciem wildcardów
• Z użyciem dokładnej frazy
• Z wykorzystaniem zakresu
• Boolowskie
• Fasetowe
Z wildcardami
luceneQuery =
queryBuilder
.keyword()
.wildcard()
.onField("someField")
.andField ("otherField")
.matching(providedValues)
.createQuery();
Tryby wyszukiwania
• Z użyciem słów kluczowych
• Rozmyte
• Z użyciem wildcardów
• Z użyciem dokładnej frazy
• Z wykorzystaniem zakresu
• Boolowskie
• Fasetowe
luceneQuery =
queryBuilder
.withSlop(intValue)
.phrase()
.onField("someField")
.andField("otherField")
.sentence(unquotedSearchString)
.createQuery();
Tryby wyszukiwania
• Z użyciem słów kluczowych
• Rozmyte
• Z użyciem wildcardów
• Z użyciem dokładnej frazy
• Z wykorzystaniem zakresu
• Boolowskie
• Fasetowe
luceneQuery =
queryBuilder
.range()
.onField(numericField)
.above(x)
.below(x)
.from(x)
.to(y)
.excludeLimit()
.createQuery();
Tryby wyszukiwania
• Z użyciem słów kluczowych
• Rozmyte
• Z użyciem wildcardów
• Z użyciem dokładnej frazy
• Z wykorzystaniem zakresu
• Boolowskie
• Fasetowe
luceneQuery = queryBuilder
.bool()
.must(
queryBuilder.keyword().onField("someField")
.matching(someValue).createQuery()
)
.not()
.should(
queryBuilder.range().onField("otherField")
.above(intValue).createQuery()
)
.createQuery();
Tryby wyszukiwania
• Z użyciem słów kluczowych
• Rozmyte
• Z użyciem wildcardów
• Z użyciem dokładnej frazy
• Z wykorzystaniem zakresu
• Boolowskie
• Fasetowe
FacetingRequest categoryFacetingRequest =
queryBuilder.facet()
.name("categoryFacet")
.onField("category")
.discrete()
.orderedBy(FacetSortOrder.FIELD_VALUE)
.includeZeroCounts(false)
.createFacetingRequest();
hibernateQuery.getFacetManager()
.enableFaceting(categoryFacetingRequest);
Do dzieła
…
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>4.5.0.Final</version>
</dependency>
…
A potem już z górki
• Implementacja
▫ Pól
▫ Analizatorów
▫ Zapytań
▫ Warunków indeksowania
Kodujemy (1)
• Prosta wyszukiwarka pełnotekstowa
▫ Mapowanie wybranych pól
▫ Podstawowe zapytanie
▫ Projekcja
Demo time (1)
Poprawiamy wyniki wyszukiwania
Kodujemy (2)
• Zwiększanie ważności wyniku
▫ Statyczne
▫ Dynamiczne
▫ Na czas zapytania
• Warunkowe indeksowanie
• Analizator
Demo time (2)
Co dalej?
• Projekcje (zagadnienia zaawansowane)
• Wydajność
• Fasetowe wyszukiwanie
• Filtry na zapytania
•…
Q&A time