2015-06-07 112 views
0

我正在用Java EE,Hibernate Search,JPA和JSF編寫Web應用程序。休眠搜索分面不工作

我一直在讀一遍又一遍的hibernate搜索文檔,但我只是不能正確地工作。

我有一個數據庫,其中包括幾個分類。我以足球俱樂部爲例。

我有德國的類別,其中有德甲聯賽,德甲聯賽等等。 我也有一個名爲ChampionsLeague,EuroLeague和代表不同國家的其他聯賽。

如果我搜索「Deutschland」,Hibernate Search爲我提供了在德國玩的所有足球俱樂部的正確列表。一些足球俱樂部參加ChampionsLeague和Euroleage。在左側導航欄中的Faceting爲我提供了德國俱樂部參與的類別,並顯示了正確的facetedCount。

問題是,如果我點擊其中一個類別,Hibernate Search會顯示我在此類別中的所有俱樂部,而不僅僅是我在初次搜索時搜索過的德國俱樂部。

有誰可以告訴我如何解決這個問題?

這裏是我的代碼: SearchBean:

public void startKeywordSearch(){ 
fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em); 
qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Company.class).get(); 
query = qb 
      .keyword() 
      .fuzzy().withEditDistanceUpTo(1).withPrefixLength(0) 
      .onFields("companyName", "companyShortDescription", "companyLongDescription", "categoryList.categoryName", "and so on") 
      .matching(keyword) 
      .createQuery(); 
categoryNameFacetingRequest = qb.facet() 
      .name("categoryNameFacet") 
      .onField("categoryList.categoryName_forFaceting") 
      .discrete() 
      .orderedBy(FacetSortOrder.COUNT_DESC) 
      .includeZeroCounts(false) 
      .maxFacetCount(100) 
      .createFacetingRequest(); 

      persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Company.class); 


    facetManager = fullTextEntityManager.createFullTextQuery(query, Company.class).getFacetManager(); 
    facetManager.enableFaceting(categoryNameFacetingRequest); 


    result = persistenceQuery.getResultList(); 
    facetResults = facetManager.getFacets("categoryNameFacet"); 
    searchCount = result.size(); 

這裏是我的addFacet方法代碼:

public void addFacet(Facet facet) { 

    fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em); 

    Query luceneQuery = facet.getFacetQuery(); 
    persistenceQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Company.class); 
    facetManager.enableFaceting(categoryNameFacetingRequest); 

    result = persistenceQuery.getResultList(); 
    facetResults = facetManager.getFacets("categoryNameFacet"); 

    FacetSelection facetSelection = facetManager.getFacetGroup("categoryNameFacet"); 
    facetSelection.selectFacets(facet); 

    result = persistenceQuery.getResultList(); 

和多數民衆的代碼生成我的鏈接:

<div> 
      <h:form id="facetForm"> 
       <ul> 
        <ui:repeat value="#{searchBean.facetResults}" var="facet"> 
         <li><h:commandLink value="#{facet.value}" action="#{searchBean.addFacet(facet)}"> 
           <f:ajax render="@all" /> 
          </h:commandLink> (#{facet.count})</li> 
        </ui:repeat>  
       </ul> 
      </h:form> 
     </div> 

回答

0

不知道你在哪裏撥打addFacet,但它看起來像你只是ru n由facet#getFacetQuery提供的查詢。這不起作用。方面查詢應該應用於現有查詢的頂部。無論是通過布爾查詢還是通過一個FacetSelection(其作用於原始查詢之上)。文檔有一個例子:

// create a fulltext query 
Query luceneQuery = builder.all().createQuery(); // match all query 
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, clazz); 

// retrieve facet manager and apply faceting request 
FacetManager facetManager = fullTextQuery.getFacetManager(); 
facetManager.enableFaceting(priceFacetingRequest); 

// get the list of Cd 
List<Cd> cds = fullTextQuery.list(); 
assertTrue(cds.size() == 10); 

// retrieve the faceting results 
List<Facet> facets = facetManager.getFacets("priceFaceting"); 
assertTrue(facets.get(0).getCount() == 2) 

// apply first facet as additional search criteria 
FacetSelection facetSelection = facetManager.getFacetGroup("priceFaceting"); 
facetSelection.selectFacets(facets.get(0)); 

// re-execute the query 
cds = fullTextQuery.list(); 
assertTrue(cds.size() == 2); 

http://docs.jboss.org/hibernate/search/5.3/reference/en-US/html_single/#_restricting_query_results

+0

我仍然不會在facetSelection工作,我想,那@Facet註釋嵌入的關係似乎是一個問題。 我通過使用BooleanQuery解決了這個問題。感謝提示 – Rallenaldo