Lucene Hibernate搜索5.2+;facet字段的编程配置

Lucene Hibernate搜索5.2+;facet字段的编程配置,lucene,annotations,hibernate-search,faceted-search,Lucene,Annotations,Hibernate Search,Faceted Search,在HibernateSearch5.2之前,没有必要显式使用@Facet注释。在5.2中,为了使用Lucene的原生刻面API,这变得非常必要 我在无法注释的外部类上使用Hibernate搜索。有没有办法以编程方式定义这个“方面” 对于映射配置,没有问题,因为SearchMapping提供了@Entity、@Indexed和@Field注释的完整编程替代方案。但是在这个API中,特别是在EntityMapping类中,没有办法定义一个字段将在方面查询中使用;除了用@Facet注释字段外,没有其他

在HibernateSearch5.2之前,没有必要显式使用@Facet注释。在5.2中,为了使用Lucene的原生刻面API,这变得非常必要

我在无法注释的外部类上使用Hibernate搜索。有没有办法以编程方式定义这个“方面”

对于映射配置,没有问题,因为SearchMapping提供了@Entity、@Indexed和@Field注释的完整编程替代方案。但是在这个API中,特别是在EntityMapping类中,没有办法定义一个字段将在方面查询中使用;除了用@Facet注释字段外,没有其他选择

2018年更新: 我已经更新到Hibernate Search 5.6.4,它正在处理这种映射:

.property("businessProcess", ElementType.METHOD)
            .field()
                .analyze(Analyze.NO)
                .store(Store.YES)
                .facet()
                    .name("businessProcess")
                    .encoding(FacetEncodingType.STRING)
在Hibernate搜索中根本没有配置方面(没有@Facet注释,也没有编程等效项)。在HibernateSearch的最新版本中,这将不起作用,因为我们必须需要此元数据才能修复

使用自定义方面格式是一个非常未知的领域,诚然比它应该的要困难得多。主要原因是,facet最初是为了直接处理实体属性而不是字段值而设计的,原因我无法理解。因此,面忽略了场桥。我们正在努力清理Search6中的刻面支持,但这是许多正在进行的工作之一,需要一些时间

同时,最简单的选择可能是只使用内置格式

编辑:此外,对于日期,您可能希望使用数字刻面格式,以便执行范围刻面(从5月1日到5月30日)。在这种情况下,facet的名称是在查询时定义的,因此内置格式应该无关紧要


实际上,有一个简单的解决方案可以在字符串编码的facet中自定义格式,但我没有提到它,因为您正在使用编程映射,并且可能不想更改模型:您可以添加只读属性,返回facet中所需的准确值(
getYear
getMonth
,…),并在这些属性上添加带有刻面的字段。

这是一个错误。我创建了一个票证来解决它:。谢谢你的报道!我现在使用HibernateSearch 5.6.4,并在编程映射中调用facet(),但仍然会引发异常。有线索吗?谢谢。在查询之前,您是否对数据进行了索引?在Hibernate Search的旧版本(如5.6)中,已知此异常是由一个实际上没有为facet编制索引的索引引起的:在为facet添加显式名称并使用.name(“foo”)调用后,它现在开始工作。但是,我无法使它在自定义日历桥上工作。你介意在这里核对我的答案吗:谢谢。我改变了模型,添加了只读属性,尽管我试图避免这个选项。我无法使用内置格式,因为我需要刻面,例如在月份,而不管年份;因此,日期的范围查询不符合要求。