diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectSearch.java b/zanata-war/src/main/java/org/zanata/action/ProjectSearch.java index 98144b84e7..0eafaf2e65 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectSearch.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectSearch.java @@ -54,6 +54,9 @@ public class ProjectSearch implements Serializable { @In private ZanataIdentity identity; + // Count of result to be return as part of autocomplete + private final static int INITIAL_RESULT_COUNT = 5; + public void setCurrentPage(int page) { if (page < 1) this.currentPage = 1; @@ -62,7 +65,7 @@ public void setCurrentPage(int page) { } /** - * Return first 5 results on project search + * Return results on project search * * @param query */ @@ -73,7 +76,8 @@ public List suggestProjects(String query) { return result; } try { - for (HProject project : projectDAO.searchQuery(searchQuery, 5, 0)) { + for (HProject project : projectDAO.searchQuery(searchQuery, + INITIAL_RESULT_COUNT, 0)) { result.add(new SearchResult(project, searchQuery)); } result.add(new SearchResult(searchQuery)); @@ -109,6 +113,11 @@ public boolean evaluate(Object arg0) { resultSize = searchResults.size(); } + public String searchAndRedirect() { + search(); + return "/search.xhtml"; + } + @AllArgsConstructor public class SearchResult { @Getter diff --git a/zanata-war/src/main/java/org/zanata/dao/ProjectDAO.java b/zanata-war/src/main/java/org/zanata/dao/ProjectDAO.java index 0c4617b66d..feca1f31e9 100644 --- a/zanata-war/src/main/java/org/zanata/dao/ProjectDAO.java +++ b/zanata-war/src/main/java/org/zanata/dao/ProjectDAO.java @@ -7,9 +7,13 @@ import javax.annotation.Nullable; import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.util.Version; import org.hibernate.Query; import org.hibernate.Session; @@ -231,15 +235,21 @@ public int getTotalObsoleteProjectCount() { public List searchQuery(@Nonnull String searchQuery, int maxResult, int firstResult) throws ParseException { - String[] projectFields = { "slug", "name", "description" }; - QueryParser parser = - new MultiFieldQueryParser(Version.LUCENE_35, projectFields, - new StandardAnalyzer(Version.LUCENE_35)); - parser.setAllowLeadingWildcard(true); - org.apache.lucene.search.Query luceneQuery = - parser.parse(QueryParser.escape(searchQuery)); + + searchQuery = QueryParser.escape(searchQuery); + + PrefixQuery slugQuery = new PrefixQuery(new Term("slug", searchQuery)); + PrefixQuery nameQuery = new PrefixQuery(new Term("name", searchQuery)); + PrefixQuery descQuery = + new PrefixQuery(new Term("description", searchQuery)); + + BooleanQuery booleanQuery = new BooleanQuery(); + booleanQuery.add(slugQuery, BooleanClause.Occur.SHOULD); + booleanQuery.add(nameQuery, BooleanClause.Occur.SHOULD); + booleanQuery.add(descQuery, BooleanClause.Occur.SHOULD); + FullTextQuery query = - entityManager.createFullTextQuery(luceneQuery, HProject.class); + entityManager.createFullTextQuery(booleanQuery, HProject.class); query.setMaxResults(maxResult).setFirstResult(firstResult) .getResultList(); diff --git a/zanata-war/src/main/webapp/WEB-INF/template/banner.xhtml b/zanata-war/src/main/webapp/WEB-INF/template/banner.xhtml index 69d8a98df0..3c88cd3bb1 100644 --- a/zanata-war/src/main/webapp/WEB-INF/template/banner.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/template/banner.xhtml @@ -4,7 +4,35 @@ xmlns:f="http://java.sun.com/jsf/core" xmlns:s="http://jboss.org/schema/seam/taglib" xmlns:rich="http://richfaces.org/rich" - xmlns:zanata="http://java.sun.com/jsf/composite/zanata"> + xmlns:zanata="http://java.sun.com/jsf/composite/zanata" + xmlns:a4j="http://richfaces.org/a4j"> + + + + + +

@@ -31,7 +59,8 @@ minChars="2" inputClass="form--search__input js-form--search__input" styleClass="auto-complete" fetchValue="#{suggestProject.query}" autocompleteMethod="#{projectSearch.suggestProjects}" - layout="list" + layout="list" onselectitem="redirectUrl(this.value);" + oncomplete="resizeSearchField()" popupClass="auto-complete-list" id="form--search"> @@ -43,8 +72,9 @@ + Search Zanata for + '#{suggestProject.query}'