休眠搜索分面不工作
Hibernate Search Faceting not working
我正在使用 Java EE、Hibernate Search、JPA 和 JSF 编写 Web 应用程序。
我一直在一遍又一遍地阅读休眠搜索文档,但我就是无法让分面正常工作。
我有一个包含多个类别的数据库。我以足球俱乐部为例。
我有德国类别,其中有子类 Bundesliga、2. Bundesliga 等等。
我还有一个类别,名为 ChampionsLeague、EuroLeague 和其他一些代表不同国家/地区的联赛。
如果我搜索 "Deutschland",Hibernate Search 会为我提供在德国踢球的所有足球俱乐部的正确列表。一些足球俱乐部参加冠军联赛和欧洲足球联赛。我左侧导航栏中的 Faceting 为我提供了德国俱乐部参与的类别。它还显示了正确的 facetedCount。
问题是,如果我单击其中一个类别,Hibernate Search 会向我显示该类别中的所有俱乐部,而不仅仅是我在初始搜索时搜索过的德国俱乐部。
谁能告诉我如何解决这个问题?
这是我的代码:
搜索豆:
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();
这就是生成我的 Link 的代码:
<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>
不确定您调用 addFacet
的确切位置,但看起来您只是 运行 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
我正在使用 Java EE、Hibernate Search、JPA 和 JSF 编写 Web 应用程序。
我一直在一遍又一遍地阅读休眠搜索文档,但我就是无法让分面正常工作。
我有一个包含多个类别的数据库。我以足球俱乐部为例。
我有德国类别,其中有子类 Bundesliga、2. Bundesliga 等等。 我还有一个类别,名为 ChampionsLeague、EuroLeague 和其他一些代表不同国家/地区的联赛。
如果我搜索 "Deutschland",Hibernate Search 会为我提供在德国踢球的所有足球俱乐部的正确列表。一些足球俱乐部参加冠军联赛和欧洲足球联赛。我左侧导航栏中的 Faceting 为我提供了德国俱乐部参与的类别。它还显示了正确的 facetedCount。
问题是,如果我单击其中一个类别,Hibernate Search 会向我显示该类别中的所有俱乐部,而不仅仅是我在初始搜索时搜索过的德国俱乐部。
谁能告诉我如何解决这个问题?
这是我的代码: 搜索豆:
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();
这就是生成我的 Link 的代码:
<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>
不确定您调用 addFacet
的确切位置,但看起来您只是 运行 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