//$Id: SearchService.java 13984 2011-01-11 12:45:45Z sannegrinovero $ package actions; import java.util.List; import org.apache.lucene.search.Query; import org.hibernate.search.jpa.FullTextEntityManager; import org.hibernate.search.query.dsl.QueryBuilder; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import domain.BlogEntry; /** * Pulls the search results * * @author Gavin King * @author Sanne Grinovero */ @Name("searchService") public class SearchService { @In private FullTextEntityManager entityManager; private String searchPattern; @Factory("searchResults") public List<BlogEntry> getSearchResults() { if (searchPattern==null || "".equals(searchPattern) ) { searchPattern = null; return getLatestBlogEntries(100); } else { Query luceneQuery = getFullTextQuery(); return entityManager.createFullTextQuery(luceneQuery, BlogEntry.class) .setMaxResults(100) .getResultList(); } } private Query getFullTextQuery() { //Create a QueryBuilder targeting BlogEntry QueryBuilder queryBuilder = entityManager .getSearchFactory() .buildQueryBuilder() .forEntity(BlogEntry.class) .get(); //A fulltext query using English Analyzer Query queryUsingEnglishStemmer = queryBuilder.keyword() .onFields("title:en").boostedTo(4f) .andField("body:en") .matching(searchPattern) .createQuery(); //A fulltext query using ngrams Query queryUsingNGrams = queryBuilder.keyword() .onFields("title:ngrams").boostedTo(2f) .andField("body:ngrams").boostedTo(0.4f) .matching(searchPattern) .createQuery(); //Combine them for best results: Query fullTextQuery = queryBuilder.bool() .should(queryUsingEnglishStemmer) .should(queryUsingNGrams) .createQuery(); return fullTextQuery; } private List<BlogEntry> getLatestBlogEntries(int limit) { return entityManager .createQuery("select be from BlogEntry be order by date desc") .setHint("org.hibernate.cacheable", true) .setMaxResults(limit) .getResultList(); } public String getSearchPattern() { return searchPattern; } public void setSearchPattern(String searchPattern) { this.searchPattern = searchPattern; } }