从 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