1 Hibernate Search w praktyceCzyli wyszukiwanie pełnotekstowe w javowej aplikacji
2 Dobra wyszukiwarka Pomaga wyszukać właściwe wynikiPodpowiada Domyśla się intencji użytkownika Jest odporna na literówki „Wie” czego szukamy
3 Proste wyszukiwanie select * from x where x.y ilike ‘%param%’;
4 Proste wyszukiwanie Zalety Wady Łatwo zaimplementowaćKażdy wynik jest równorzędny Niewydajne przy dużych zbiorach Źle zaimplementowane dostarczy mylnych wyników
5 Większa trafność wyników? Ok!Bardziej złożony algorytm Metadane Kategorie Tagi
6 Wyszukiwanie pełnotekstowe?
7 Co wybrać? Solr ElasticSearch Hibernate Search
8 Solr? Zapytania za pośrednictwem żądań HTTP XMLe, wszędzie XMLeDodatkowy serwer SOLR Reguły indeksowania odseparowane od definicji obiektów domenowych
9 SOLR do PoC-owania?
10 Hibernate Search Co to jest? Kiedy używać? Dlaczego? Jak?
11 Hibernate Search = Lucene + komponenty SOLR + integracja z Hibernate
12 Kiedy używać Hibernate Search?
13 Dlaczego Hibernate Search?Integracja indeksów Lucene z operacjami w Hibernate Pracujemy na obiektach Bajecznie prosta integracja z aplikacją korzystającą z Hibernate
14 Zalety?
15 Przyjazny DSL Wiele trybów wyszukiwania Procesory Warunkowe indeksowanie
16 Przyjazny DSL org.hibernate.search.query.dsl.QueryBuilder queryBuilder = fullTextSession.getSearchFactory() .buildQueryBuilder() .forEntity( MyClass.class ) .get();
17 Tryby wyszukiwania Z użyciem słów kluczowych RozmyteZ użyciem wildcardów Z użyciem dokładnej frazy Z wykorzystaniem zakresu Boolowskie Fasetowe
18 org.apache.lucene.search.QueryluceneQuery = queryBuilder .keyword() .onFields("someField", "otherField") .matching(providedValues) .createQuery();
19 Tryby wyszukiwania Z użyciem słów kluczowych RozmyteZ użyciem wildcardów Z użyciem dokładnej frazy Z wykorzystaniem zakresu Boolowskie Fasetowe
20 luceneQuery = queryBuilder. keyword(). fuzzy(). withThreshold(0. 7f)luceneQuery = queryBuilder .keyword() .fuzzy() .withThreshold(0.7f) .onFields("someField", "otherField") .matching(providedValues) .createQuery();
21 Tryby wyszukiwania Z użyciem słów kluczowych RozmyteZ użyciem wildcardów Z użyciem dokładnej frazy Z wykorzystaniem zakresu Boolowskie Fasetowe
22 Z wildcardami luceneQuery = queryBuilder .keyword() .wildcard() .onField("someField") .andField ("otherField") .matching(providedValues) .createQuery();
23 Tryby wyszukiwania Z użyciem słów kluczowych RozmyteZ użyciem wildcardów Z użyciem dokładnej frazy Z wykorzystaniem zakresu Boolowskie Fasetowe
24 luceneQuery = queryBuilder. withSlop(intValue). phrase()luceneQuery = queryBuilder .withSlop(intValue) .phrase() .onField("someField") .andField("otherField") .sentence(unquotedSearchString) .createQuery();
25 Tryby wyszukiwania Z użyciem słów kluczowych RozmyteZ użyciem wildcardów Z użyciem dokładnej frazy Z wykorzystaniem zakresu Boolowskie Fasetowe
26 luceneQuery = queryBuilder .range() .onField(numericField) .above(x) .below(x) .from(x) .to(y) .excludeLimit() .createQuery();
27 Tryby wyszukiwania Z użyciem słów kluczowych RozmyteZ użyciem wildcardów Z użyciem dokładnej frazy Z wykorzystaniem zakresu Boolowskie Fasetowe
28 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();
29 Tryby wyszukiwania Z użyciem słów kluczowych RozmyteZ użyciem wildcardów Z użyciem dokładnej frazy Z wykorzystaniem zakresu Boolowskie Fasetowe
30 FacetingRequest categoryFacetingRequest =queryBuilder.facet() .name("categoryFacet") .onField("category") .discrete() .orderedBy(FacetSortOrder.FIELD_VALUE) .includeZeroCounts(false) .createFacetingRequest(); hibernateQuery.getFacetManager() .enableFaceting(categoryFacetingRequest);
31 Do dzieła
32
33 A potem już z górki Implementacja Pól Analizatorów ZapytańWarunków indeksowania
34 Kodujemy (1) Prosta wyszukiwarka pełnotekstowa Mapowanie wybranych pólPodstawowe zapytanie Projekcja
35 Demo time (1)
36 Poprawiamy wyniki wyszukiwania
37 Zwiększanie ważności wynikuKodujemy (2) Zwiększanie ważności wyniku Statyczne Dynamiczne Na czas zapytania Warunkowe indeksowanie Analizator
38 Demo time (2)
39 Co dalej? Projekcje (zagadnienia zaawansowane) WydajnośćFasetowe wyszukiwanie Filtry na zapytania …
40 Q&A time