使用Hibernate Search 5在关键字查询中搜索数字字段

时间:2020-11-12 10:24:54

标签: hibernate-search

我尝试了多种方法来通过关键字查询在数据库中搜索Long字段。我总是会出错,因为Hibernate Search会将Long索引为数字字段。我已经尝试过使用FieldBridge,但是那根本行不通。这是我要搜索的字段。

@Field
@Column(unique = true)
private Long numericField;

2 个答案:

答案 0 :(得分:1)

在此问题上我找不到任何在线内容,因此我在这里以问答形式发布答案。我想出了一种使用动态字段的方法,如下所示:

@Column(unique = true)
private Long numericField;

@Field(name="numericField", analyze = Analyze.NO, index=Index.YES)
public String getNumericFieldAsString(){
    return numericField.toString();
}

该字段现在被动态索引为字符串,我可以在关键字查询中使用它。

答案 1 :(得分:1)

关键字查询很好地支持长字段:查询时只需提供长值,因为字段的类型为long。因此,在将其传递给Hibernate Search之前,只需使用Long.parseLong将用户提供的文本值转换为很长的时间即可。

在某些情况下,您可能确实需要将字符串字段用作数字值。例如,如果您要在同一关键字查询中定位多个字段,而其他一些字段是字符串字段。

然后your answer可以很好地工作,尽管不幸的是它具有一些副作用,这些副作用将导致Hibernate Search更频繁地为数据重新编制索引(因为它不知道getNumbericFieldAsString从何处准确地获取数据)。

或者,您可以使用网桥,既可以是自定义网桥,也可以只使用内置在Hibernate Search 5中的网桥:

@Column(unique = true)
@Field(name="numericField", analyze = Analyze.NO, bridge = @FieldBridge(impl = org.hibernate.search.bridge.builtin.LongBridge.class))
private Long numericField;

有关自定义桥接的信息,see here for Hibernate Search 5here for Hibernate Search 6(较新的Hibernate Search版本,具有不同的API)。