Hibernate Search 3.4.0.Beta1

发布者    |       Hibernate Search

Hibernate Search 是一个库,通过自动索引实体,将 Hibernate ORM 与 Apache Lucene 或 Elasticsearch 集成,从而启用高级搜索功能:全文搜索、地理空间搜索、聚合等。更多信息,请参阅 hibernate.org 上的 Hibernate Search。

从 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


回到顶部