Hibernate搜索-应用facet后是否可以获得新的Lucene查询?

Hibernate搜索-应用facet后是否可以获得新的Lucene查询?,lucene,hibernate-search,Lucene,Hibernate Search,将生成Lucene查询,如下所示: Query luceneQuery = builder.all().createQuery(); 然后应用面 我不确定当应用facet时,luceneQuery是否会与其他查询进行and和OR运算,从而生成一个新的Lucene查询。或者,可能会对原始查询应用一组位集来优化结果。(我不知道) 如果生成了一个新查询,我想检索它。如果不是,我需要重新思考。这是问题的关键 原因: 我正在对具有多个可能值的字段应用分面搜索 例如,TMovie.class多对多TTag

将生成Lucene查询,如下所示:

Query luceneQuery = builder.all().createQuery();
然后应用面

我不确定当应用facet时,luceneQuery是否会与其他查询进行and和OR运算,从而生成一个新的Lucene查询。或者,可能会对原始查询应用一组位集来优化结果。(我不知道)

如果生成了一个新查询,我想检索它。如果不是,我需要重新思考。这是问题的关键

原因:

我正在对具有多个可能值的字段应用分面搜索

例如,TMovie.class多对多TTag.class(多值方面

我在TMovie上过滤,其中TTag是一些值

无论如何,过滤是有效的,但是存在一个已知的问题,即返回的方面计数不正确。 详情如下:及

我正在使用此解决方案: (见第条下对新API的评论)

位集解决方案(至少在本例中)基于原始Lucene查询生成计数。这很好用。然而

如果对原始查询应用替代(不同,而不是TTAG)方面,则会出现一些复杂情况。 位集解决方案根据原始Lucene查询进行计算。它不计算lucene查询,而lucene查询现在通过应用替代facet(一个不同的facet选择)而减少(甚至TTag facet本身)。即,计数计算与应用的任何其他面无关

所以

A.应用facet后,我可以获得新的Lucene查询吗?应用于此的位集解决方案是正确的

B.还有其他建议吗

非常感谢。。欢迎大家发表意见


John

关于第一个问题,应用方面并不是修改原始查询,它使用一个名为FacetCollector的自定义收集器-请参阅。在引擎盖下,收集器使用Lucene FieldCache进行方面计数。这也是多值刻面限制的根源。FieldCache不支持每个字段有多个值

无论如何,在刻面过程中不会应用其他查询,并且原始查询不会被修改。当然,好处在于性能。您所指的解决方案可能也可以工作,但依赖于运行多个查询。但是,对于您的用例来说,这可能是一个有效的解决方案。

在这里发布了一个解决方案(各种各样):