Hibernate Search Hardy Ferentschik, Red Hat The toolbox The - - PowerPoint PPT Presentation

hibernate search
SMART_READER_LITE
LIVE PREVIEW

Hibernate Search Hardy Ferentschik, Red Hat The toolbox The - - PowerPoint PPT Presentation

Hibernate Search Hardy Ferentschik, Red Hat The toolbox The toolbox Build tool Ant/Maven The toolbox Build tool Ant/Maven Container Tomcat/JBoss The toolbox Build tool Ant/Maven Container Tomcat/JBoss MVC Struts/Seam The toolbox


slide-1
SLIDE 1
slide-2
SLIDE 2

Hibernate Search

Hardy Ferentschik, Red Hat

slide-3
SLIDE 3

The toolbox

slide-4
SLIDE 4

Build tool Ant/Maven

The toolbox

slide-5
SLIDE 5

Build tool Ant/Maven Container Tomcat/JBoss

The toolbox

slide-6
SLIDE 6

Build tool Ant/Maven Container Tomcat/JBoss MVC Struts/Seam

The toolbox

slide-7
SLIDE 7

Build tool Ant/Maven Container Tomcat/JBoss MVC Struts/Seam Domain model JPA/Hibernate

The toolbox

slide-8
SLIDE 8

Build tool Ant/Maven Container Tomcat/JBoss MVC Struts/Seam Domain model JPA/Hibernate Search ?

The toolbox

slide-9
SLIDE 9

“LIKE” queries

title = (title == null) ? "%" : "%" + title.toLowerCase() + "%"; actor = (actor == null) ? "%" : "%" + actor.toLowerCase() + "%"; em.createQuery( "select distinct p from Product p JOIN p.actors a " + "where lower(p.title) like :title " + "and lower(a.name) LIKE :actor order by p.title") .setParameter("title", title) .setParameter("actor", actor));

slide-10
SLIDE 10

SQL shortcomings

slide-11
SLIDE 11

SQL shortcomings

Wildcard / word search %hibernate%

slide-12
SLIDE 12

SQL shortcomings

Wildcard / word search %hibernate% Approximation hybernat

slide-13
SLIDE 13

SQL shortcomings

Wildcard / word search %hibernate% Approximation hybernat Proximity ‘Java’ close to ‘Persistence’

slide-14
SLIDE 14

SQL shortcomings

Wildcard / word search %hibernate% Approximation hybernat Proximity ‘Java’ close to ‘Persistence’ Result scoring

slide-15
SLIDE 15

SQL shortcomings

Wildcard / word search %hibernate% Approximation hybernat Proximity ‘Java’ close to ‘Persistence’ Result scoring Multi-”column” search

slide-16
SLIDE 16

Lucene

Powerful fulltext search engine Open Source In the TOP 10 of downloaded Apache projects

slide-17
SLIDE 17

Lucene DIY

Structural mismatch Retrieval mismatch Synchronization mismatch

slide-18
SLIDE 18

Structural Mismatch

slide-19
SLIDE 19

Structural Mismatch

slide-20
SLIDE 20

Retrieval Mismatch

  • Index contains Documents not Objects
  • Even if you re-hydrate you don’t have

managed objects

slide-21
SLIDE 21

Synchronization mismatch

slide-22
SLIDE 22

Synchronization mismatch

slide-23
SLIDE 23
slide-24
SLIDE 24

Configure

  • Enable Search via event listeners
  • Add Backend options
slide-25
SLIDE 25

Configure

  • Enable Search via event listeners
  • Add Backend options

<property name="hibernate.search.default.indexBase" value="/var/lucene/indexes"/>

slide-26
SLIDE 26

Annotate

@Entity @Indexed public class Essay { ... @Id public Long getId() { return id; } @Field public String getSummary() { return summary; } @Lob @Field public String getText() { return text; } @ManyToOne @IndexedEmbedded public Author getAuthor() { return author; } }

slide-27
SLIDE 27

Annotate

@Entity @Indexed public class Essay { ... @Id public Long getId() { return id; } @Field public String getSummary() { return summary; } @Lob @Field public String getText() { return text; } @ManyToOne @IndexedEmbedded public Author getAuthor() { return author; } }

slide-28
SLIDE 28

Annotate

@Entity @Indexed public class Essay { ... @Id public Long getId() { return id; } @Field public String getSummary() { return summary; } @Lob @Field public String getText() { return text; } @ManyToOne @IndexedEmbedded public Author getAuthor() { return author; } }

slide-29
SLIDE 29

Annotate

@Entity @Indexed public class Essay { ... @Id public Long getId() { return id; } @Field public String getSummary() { return summary; } @Lob @Field public String getText() { return text; } @ManyToOne @IndexedEmbedded public Author getAuthor() { return author; } }

slide-30
SLIDE 30

Annotate

@Entity @Indexed public class Essay { ... @Id public Long getId() { return id; } @Field public String getSummary() { return summary; } @Lob @Field public String getText() { return text; } @ManyToOne @IndexedEmbedded public Author getAuthor() { return author; } }

slide-31
SLIDE 31

Search

String searchQuery = "Hibernate Search"; String[] productFields = {"summary", "author.name"}; // Lucene QueryParser parser = new MultiFieldQueryParser(productFields, new StandardAnalyzer()); Query luceneQuery = parser.parse(searchQuery); // Hibernate Search FullTextEntityManager ftEm = Search. getFullTextEntityManager((EntityManager)em); FullTextQuery query = ftEm.createFullTextQuery( luceneQuery, Essay.class ); List<Essay> items = query.getResultList();

slide-32
SLIDE 32

Database Lucene Directory (Index)

Hibernate + Hibernate Search Search request Index update Hibernate + Hibernate Search Search request Index update

Architecture

slide-33
SLIDE 33

Database Lucene Directory (Index)

Hibernate + Hibernate Search Search request Index update Hibernate + Hibernate Search Search request Index update

Architecture

slide-34
SLIDE 34

The goodies

slide-35
SLIDE 35

Analyzers

  • Take text as an input, chunk it into individual

words and optionally applying a chain of filter

  • perations on the tokens.
slide-36
SLIDE 36

2009 Welcome to JAOO

Document title

java welcom jaoo

slide-37
SLIDE 37

2009 Welcome to JAOO

Document title

java welcom jaoo

slide-38
SLIDE 38

2009 Welcome to JAOO

Document title

java welcom jaoo

slide-39
SLIDE 39

2009 Welcome to JAOO

Document title

java welcom jaoo

slide-40
SLIDE 40

2009 Welcome to JAOO

Document title

java welcom jaoo

slide-41
SLIDE 41

2009 Welcome to JAOO

Document title

java welcom jaoo

slide-42
SLIDE 42

@Entity @Indexed @AnalyzerDef(name = "customanalyzer", tokenizer = @TokenizerDef(factory=StandardTokenizerFactory.class), filters = { @TokenFilterDef(factory = LowerCaseFilterFactory.class), @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {@Parameter(name = "language", value = "English")}) }) public class Book { ... @Field(index=Index.TOKENIZED, store=Store.NO) @Analyzer(definition = "customanalyzer") private String title; ... }

Analyzer Example

slide-43
SLIDE 43

Filters

slide-44
SLIDE 44

Filters

slide-45
SLIDE 45

Filters

slide-46
SLIDE 46

@Entity @Indexed @FullTextFilterDefs( { @FullTextFilterDef(name="bestDriver", impl=BestDriversFilter.class), @FullTextFilterDef(name="security", impl=SecurityFilterFactory.class) }) public class Driver { ... }

Filter Example

... fullTextQuery = s.createFullTextQuery( query, Driver.class ); fullTextQuery.enableFullTextFilter("bestDriver"); fullTextQuery.enableFullTextFilter("security"). setParameter( "login", "andre" ); fullTextQuery.list(); ...

slide-47
SLIDE 47

@Entity @Indexed @FullTextFilterDefs( { @FullTextFilterDef(name="bestDriver", impl=BestDriversFilter.class), @FullTextFilterDef(name="security", impl=SecurityFilterFactory.class) }) public class Driver { ... }

Filter Example

... fullTextQuery = s.createFullTextQuery( query, Driver.class ); fullTextQuery.enableFullTextFilter("bestDriver"); fullTextQuery.enableFullTextFilter("security"). setParameter( "login", "andre" ); fullTextQuery.list(); ...

slide-48
SLIDE 48

@Entity @Indexed @FullTextFilterDefs( { @FullTextFilterDef(name="bestDriver", impl=BestDriversFilter.class), @FullTextFilterDef(name="security", impl=SecurityFilterFactory.class) }) public class Driver { ... }

Filter Example

... fullTextQuery = s.createFullTextQuery( query, Driver.class ); fullTextQuery.enableFullTextFilter("bestDriver"); fullTextQuery.enableFullTextFilter("security"). setParameter( "login", "andre" ); fullTextQuery.list(); ...

slide-49
SLIDE 49

Projection

Projection on metadata (SCORE, BOOST, ID, ...) No DB access

slide-50
SLIDE 50

FullTextQuery query = s.createFullTextQuery(luceneQuery,Book.class ); query.setProjection( "id", "summary", "body", "mainAuthor.name" ); List results = query.list(); Object[] firstResult = (Object[]) results.get(0); Integer id = firstResult[0]; String summary = firstResult[1]; String body = firstResult[2]; String authorName = firstResult[3];

Projection Example

slide-51
SLIDE 51

Clustering

Database

Hibernate + Hibernate Search

JMS queue Lucene Directory (Index) Master

Hibernate + Hibernate Search Process Index update Index update order

Lucene Directory (Index) Copy

Search request Copy

Slave Master

slide-52
SLIDE 52

And even more

Index sharding Automatic index optimization Manual indexing and purging Shared Lucene resources Access to native Lucene

slide-53
SLIDE 53

Hibernate Search Fulltext search without the hassle!

slide-54
SLIDE 54

Q&A

slide-55
SLIDE 55

More Info

Hibernate Search

  • http://search.hibernate.org
  • Hibernate Search in Action

Apache Lucene

  • http://lucene.apache.org
  • Lucene In Action

http://in.relation.to http://forum.hibernate.org/viewforum.php?f=9 hardy.ferentschik@redhat.com