Hibernate Search - 在查询上应用 facet 不会返回任何结果
Hibernate Search - applying facet on a query brings back no results
我正在尝试使用返回的方面之一缩小我的原始查询范围,但这似乎不起作用,即它没有返回任何结果。第一次调用 list()
方法时,我得到了 8 个产品(总共 15 个产品中,这些产品受 setMaxResults()
方法限制)和两个方面的列表:一个是计数 14,另一个是count 1. 当我将第一个方面应用于当前查询并使用 list()
方法重新执行查询时,我预计会看到总共 14 个产品,但返回的是一个空列表。我看不到我正在做的任何与文档不同的事情。
构建查询:
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;
恐怕这是一个错误。不过感谢您的提问:既然我们已经意识到了这一点,我们可以着手修复它。此错误的票证是 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
我正在尝试使用返回的方面之一缩小我的原始查询范围,但这似乎不起作用,即它没有返回任何结果。第一次调用 list()
方法时,我得到了 8 个产品(总共 15 个产品中,这些产品受 setMaxResults()
方法限制)和两个方面的列表:一个是计数 14,另一个是count 1. 当我将第一个方面应用于当前查询并使用 list()
方法重新执行查询时,我预计会看到总共 14 个产品,但返回的是一个空列表。我看不到我正在做的任何与文档不同的事情。
构建查询:
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;
恐怕这是一个错误。不过感谢您的提问:既然我们已经意识到了这一点,我们可以着手修复它。此错误的票证是 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