从 Alpha1 迁移到 Beta1,我很高兴宣布发布 Hibernate Search 3.4.0.Beta1。此次发布包括升级到 Hibernate Core 3.6.2 以及常规的错误修复(请参阅 Jira 发布说明 以获取所有详细信息)。
然而,主要焦点在于对分面 API 的改进。这一次,我们甚至提供了一些 文档。使用分面 API 有三个步骤。首先,您需要创建分面请求本身。这是通过 QueryBuilder 和分面 DSL 完成的。目前,我们支持离散分面和范围分面。以下是一些基于示例实体 Cd 的示例
@Entity
@Indexed
public class Cd {
@Id
@GeneratedValue
private int id;
@Fields( {
@Field,
@Field(name = "name_un_analyzed", index = Index.UN_TOKENIZED)
})
private String name;
@Field(index = Index.UN_TOKENIZED)
@NumericField
private int price;
Field(index = Index.UN_TOKENIZED)
@DateBridge(resolution = Resolution.YEAR)
private Date releaseYear;
@Field(index = Index.UN_TOKENIZED)
private String label;
// setter/getter
...给定 Cd 实体,创建分面请求可能如下所示QueryBuilder builder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity( Cd.class ).get();
FacetingRequest labelFacetingRequest = builder.facet()
.name( "labelFaceting" )
.onField( "label")
.discrete()
.orderedBy( FacetSortOrder.COUNT_DESC )
.includeZeroCounts( false )
.maxFacetCount( 10 )
.createFacetingRequest();
FacetingRequest priceacetingRequest = queryBuilder( Cd.class ).facet()
.name( "priceFaceting" )
.onField( "price" )
.range()
.below( 1000 )
.from( 1001 ).to( 1500 )
.above( 1500 ).excludeLimit()
.createFacetingRequest();作为第二步,您需要在查询上应用创建的分面请求。执行查询后,您就可以访问分面结果。这两个任务都是通过 FacetManager API 完成的// create a fulltext query QueryBuilder builder = queryBuilder( Cd.class ); Query luceneQuery = builder.all().createQuery(); // match all query FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery, clazz ); // retrieve facet manager and apply faceting request FacetManager facetManager = query.getFacetManager(); facetManager.enableFaceting( priceFacetingRequest ); // get the list of Cds 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)最后但同样重要的是,您可以使用 FacetSelection 接口将给定的 Facet 应用到查询本身。一旦应用了附加条件,您可以重新执行查询并使用新的结果集和分面结果。
// everything as in the previous example ... // apply first facet as additional search criteria facetManager.getFacetGroup( "priceFaceting" ).selectFacets( facets.get( 0 ) ); // re-execute the query cds = fullTextQuery.list(); assertTrue(cds.size() == 2); // deselect the facet facetManager.getFacetGroup( "priceFaceting" ).deselectFacets( facets.get( 0 ) ); // re-execute the query cds = fullTextQuery.list(); assertTrue(cds.size() == 10);我们希望这个分面 API 能够覆盖大多数用例,同时仍然很好地适应 Hibernate Search 的整体架构,但当然,我们不会知道,直到您给我们提供一些反馈 :-)
与以往一样,可以通过 JBoss Maven 仓库 或通过 SourceForge 下载此版本。文档可以在 此处 找到。
--Hardy