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

Search on a Numeric Field in a keyword query with Hibernate Search 5

我尝试了很多方法来在关键字查询中搜索数据库中的 Long 字段。我总是遇到错误,因为 Hibernate Search 会将 Long 索引为数字字段。我试过使用 FieldBridge,但它就是行不通。这是我要搜索的字段。

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

我在网上找不到关于这个问题的任何信息,所以我在此处以问答形式发布我的答案。我想出了一种使用动态字段的方法,见下文:

@Column(unique = true)
private Long numericField;

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

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

关键字查询支持长字段就好了:查询时只需要提供一个long值,因为字段是long类型。因此,在将用户提供的文本值传递给 Hibernate Search 之前,只需使用 Long.parseLong 将用户提供的文本值转换为 long。

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

然后 会正常工作,但不幸的是它有一些副作用会导致 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 5 and here for Hibernate Search 6(较新版本的 Hibernate Search,具有不同的 API)。