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 Wady Łatwo zaimplementować Każdy wynik jest równorzędny Niewydajne przy dużych zbiorach Źle zaimplementowane dostarczy mylnych wyników
Większa trafność wyników? Ok! Bardziej złożony algorytm Metadane Kategorie 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) 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() 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() 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
<groupId>org.hibernate</groupId> … <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
Zwiększanie ważności wyniku 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