【问题标题】:Hibernate Search - possible to get new Lucene query after facets applied?Hibernate Search - 在应用方面后可以获得新的 Lucene 查询吗?
【发布时间】:2013-10-17 12:02:16
【问题描述】:

一个 Lucene 查询是这样生成的:

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

然后应用构面。

我不确定当应用构面时,luceneQuery 是否与其他查询进行了 AND 运算和 ORed 运算,从而产生了一个新的 Lucene 查询。或者,也许将一堆 BitSet 应用于原始查询以优化结果。 (我不知道)。

如果生成了新查询,我想检索它。如果没有,我需要重新考虑。这就是问题的症结所在。

原因:

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

例如TMovie.class 多对多 TTag.class (multiple-value-facet)

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

无论如何,过滤是有效的,但存在一个已知问题,即返回的 Facet-counts 不正确。 详细在这里:Add faceting over multivalued to application using Hibernate Searchhttps://forum.hibernate.org/viewtopic.php?f=9&t=1010472

我正在使用这个解决方案http://sujitpal.blogspot.ie/2007/04/lucene-search-within-search-with.html(见文章下对新API的评论)

BitSet 解决方案(至少在本示例中)基于原始 Lucene 查询生成计数。这完美地工作。然而.....

如果将备用(不同,而不是 TTags)方面应用于原始查询,则会出现一些复杂情况。 Bitset 解决方案在原始 Lucene 查询上进行计算。它不会计算现在通过应用备用 Facet(不同的 FacetSelection)(或者甚至 TTag Facets 本身)减少的 lucene 查询。 IE。计数计算与应用的任何其他 FacetSelection Facet 无关。

所以...

A.我可以在应用构面后获取新的 Lucene 查询吗?应用于此的 BitSet 解决方案是正确的。

B.还有其他替代建议吗?

非常感谢.. 欢迎所有 cmets。

约翰

【问题讨论】:

标签: lucene hibernate-search


【解决方案1】:

关于您的第一个问题,应用构面不会修改原始查询,它使用称为 FacetCollector 的自定义 Collector - 请参阅 https://github.com/hibernate/hibernate-search/blob/master/engine/src/main/java/org/hibernate/search/query/collector/impl/FacetCollector.java。在引擎盖下,收集器使用 Lucene FieldCache 来进行构面计数。多值刻面也有限制的根源。 FieldCache 不支持每个字段有多个值。

无论如何,在分面期间不会应用其他查询,并且原始查询未修改。好处当然是性能。您指向的解决方案可能也有效,但依赖于运行多个查询。但是,它可能是您的用例的有效解决方法。

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多