2015-06-07 152 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