Hibernate Search - 在查询中应用facet不会带来任何结果

时间:2017-04-01 11:07:42

标签: java hibernate hibernate-search

我试图使用其中一个返回的方面缩小原始查询范围,但这似乎不起作用,即它没有带来任何结果。我第一次调用list()方法,我得到8个产品(总共15个产品,这些产品受setMaxResults()方法限制)和两个方面的列表:一个带有计数14,另一个带有count 1.当我将第一个facet应用于当前查询并使用list()方法重新执行查询时,我希望看到总共14个产品,但是返回一个空列表。我无法看到我做的与文档不同的任何内容。

Bulding query:

Session session = entityManager.unwrap(Session.class);
        FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(session);

        QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder()
                .forEntity(Product.class).get();

        Query luceneQuery = queryBuilder.all().createQuery();

        FacetingRequest categoryFacetingRequest = queryBuilder.facet()
                .name("categoryFaceting")
                .onField("productCategoryId")
                .discrete()
                .orderedBy(FacetSortOrder.COUNT_DESC)
                .includeZeroCounts(false)
                .createFacetingRequest();

        FullTextQuery hibernateQuery = fullTextSession.createFullTextQuery(luceneQuery, Product.class);

        hibernateQuery.setFirstResult(pageable.getOffset());
        hibernateQuery.setMaxResults(pageable.getPageSize());

        FacetManager facetManager = hibernateQuery.getFacetManager();
        facetManager.enableFaceting(categoryFacetingRequest);

        @SuppressWarnings("unchecked")
        List<Product> products = hibernateQuery.list();

        List<Facet> categoryFacets = facetManager.getFacets("categoryFaceting");

        FacetSelection facetSelection = facetManager.getFacetGroup("categoryFaceting");
        facetSelection.selectFacets(categoryFacets.get(0));
        products = hibernateQuery.list();
产品实体上的

productCategoryId字段:

@Field(analyze = Analyze.NO)
@NumericField
@Facet(encoding = FacetEncodingType.STRING)
private Long productCategoryId;

1 个答案:

答案 0 :(得分:0)

我担心这是一个错误。感谢您的提问:现在我们已经意识到这一点,我们可以努力解决它。此错误的凭单为HSEARCH-2668

但有一种解决方法:您可以将字段设为非数字字段。只需删除@NumericField注释,然后使用org.hibernate.search.bridge.builtin.LongBridge对其进行索引:

@Field(analyze = Analyze.NO, bridge = @FieldBridge(impl = org.hibernate.search.bridge.builtin.LongBridge.class))
@Facet(encoding = FacetEncodingType.STRING)
private Long productCategoryId;

如果您需要此字段用于其他目的,您可以创建第二个字段,并在第二个字段上应用分面:

@Field(analyze = Analyze.NO)
@NumericField
@Field(name = "productCategoryId_facet", analyze = Analyze.NO, bridge = @FieldBridge(impl = org.hibernate.search.bridge.builtin.LongBridge.class))
@Facet(forField = "productCategoryId_facet", encoding = FacetEncodingType.STRING)
private Long productCategoryId;
// Then use productCategoryId_facet instead of productCategoryId in your facet-enabled queries