【问题标题】:Hibernate Search 5.2+ programmatic configuration of facet fieldHibernate Search 5.2+ 编程配置 facet 字段
【发布时间】:2017-03-24 18:29:34
【问题描述】:

在 Hibernate Search 5.2 之前,不需要显式使用 @Facet 注释。在 5.2 中,必须使用 Lucene 的原生 faceting API。

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

对于映射配置,没有问题,因为 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.atlassian.net/browse/HSEARCH-2650。感谢您报告此事!
  • 我现在使用的是Hibernate Search 5.6.4,在程序化映射中调用了facet(),但是还是抛出了异常。有什么线索吗?谢谢。
  • 您在查询之前是否对数据进行了索引?在 Hibernate Search 的旧版本(例如 5.6)中,已知此异常是由实际上没有构面索引的索引引起的:hibernate.atlassian.net/browse/HSEARCH-2955
  • 在使用 .name("foo") 调用为构面添加显式名称后,它现在可以工作了。但是,我不能让它在自定义日历桥上工作。你介意在这里检查我的答案吗:stackoverflow.com/questions/39574478/…

标签: lucene annotations hibernate-search faceted-search


【解决方案1】:

workaround you referenced 根本没有在 Hibernate Search 中配置 faceting(没有 @Facet 注释,也没有编程等效项)。在最新版本的 Hibernate Search 中,这将不起作用,因为我们必须需要此元数据才能修复 other bugs

使用自定义构面格式是一个非常未知的领域,并且公认比它应该做的要困难得多。主要原因是,出于某种我无法理解的原因,facets 最初设计为直接作用于实体属性而不是字段值。因此,构面忽略了场桥。我们正在努力清理 Search 6 中的分面支持,但这是正在进行的众多工作之一,需要一些时间。

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

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

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

【讨论】:

  • 谢谢。尽管我试图避免该选项,但我已经更改了添加只读属性的模型。我无法使用内置格式,因为无论年份如何,我都需要在月份进行分面;所以对日期的范围查询不符合要求。
猜你喜欢
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2019-07-15
  • 1970-01-01
相关资源
最近更新 更多