400 likes | 571 Views
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.
E N D
HibernateSearch 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 wherex.yilike ‘%param%’;
Większa trafność wyników? Ok! Bardziej złożony algorytm Metadane Kategorie Tagi
Co wybrać? • Solr • ElasticSearch • HibernateSearch
Solr? • Zapytania za pośrednictwem żądań HTTP • XMLe, wszędzie XMLe • Dodatkowy serwer SOLR • Reguły indeksowania odseparowane od definicji obiektów domenowych
HibernateSearch • Co to jest? • Kiedy używać? • Dlaczego? • Jak?
HibernateSearch = Lucene + komponenty SOLR + integracja z Hibernate
DlaczegoHibernateSearch? • Integracja indeksów Lucene z operacjami w Hibernate • Pracujemy na obiektach • Bajecznie prosta integracja z aplikacją korzystającą z Hibernate
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
FacetingRequestcategoryFacetingRequest = queryBuilder.facet() .name("categoryFacet") .onField("category") .discrete() .orderedBy(FacetSortOrder.FIELD_VALUE) .includeZeroCounts(false) .createFacetingRequest(); hibernateQuery.getFacetManager() .enableFaceting(categoryFacetingRequest);
… <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
Kodujemy (2) • Zwiększanie ważności wyniku • Statyczne • Dynamiczne • Na czas zapytania • Warunkowe indeksowanie • Analizator
Co dalej? • Projekcje (zagadnienia zaawansowane) • Wydajność • Fasetowe wyszukiwanie • Filtry na zapytania • …