是否可以使用 Hibernate Search 对 @Id 字段使用数字编码 5.X
Is it possible to use a numeric encoding for @Id fields with Hibernate Search 5.X
在从 4.5 版升级到 Hibernate Search 5 之前,我们的系统将所有文档 ID 作为数字字段编入索引:
@Entity
public class Staff {
@Id
@NumericField
protected Long id;
// other fields
}
这使我们能够使用数字范围查询。在 Hibernate 5 中,所有的文档 ID 都被索引为字符串,上面的注解导致了异常。如果没有注释,所有数字范围查询都无法正确搜索 ID 字段。
切换到 TermRangeQuery 而不是 NumericRangeQuery 会很乏味,我希望避免这种情况。
有没有办法继续将 ID 视为数值?
你是对的,你发现了一个错误,我现在正在修复 HSEARCH-1960。
您可以通过为您的 Id属性 定义一个附加字段来解决此问题,如下所示:
@Entity
public class Staff {
@Id
@Field(name="id_numeric")
@NumericField(forField="id_numeric")
protected Long id;
// other fields
}
然后 运行 您的范围查询字段 "id_numeric" 而不是 "id"。
在 Hibernate Search 的未来版本中,我们可能会将所有 ID 编码为 DocValue,因为这样效率更高。这意味着上述解决方法将是最好的方法,也可以将其编码为 NumericField.
我不会干涉 id 的索引方式。将来这甚至可能不再可能了。而是添加一个额外的 @Field
。您也可以通过注释为该字段指定一个专用名称。由于该字段是 Long
它将自动进行数字编码。
在从 4.5 版升级到 Hibernate Search 5 之前,我们的系统将所有文档 ID 作为数字字段编入索引:
@Entity
public class Staff {
@Id
@NumericField
protected Long id;
// other fields
}
这使我们能够使用数字范围查询。在 Hibernate 5 中,所有的文档 ID 都被索引为字符串,上面的注解导致了异常。如果没有注释,所有数字范围查询都无法正确搜索 ID 字段。
切换到 TermRangeQuery 而不是 NumericRangeQuery 会很乏味,我希望避免这种情况。
有没有办法继续将 ID 视为数值?
你是对的,你发现了一个错误,我现在正在修复 HSEARCH-1960。
您可以通过为您的 Id属性 定义一个附加字段来解决此问题,如下所示:
@Entity
public class Staff {
@Id
@Field(name="id_numeric")
@NumericField(forField="id_numeric")
protected Long id;
// other fields
}
然后 运行 您的范围查询字段 "id_numeric" 而不是 "id"。
在 Hibernate Search 的未来版本中,我们可能会将所有 ID 编码为 DocValue,因为这样效率更高。这意味着上述解决方法将是最好的方法,也可以将其编码为 NumericField.
我不会干涉 id 的索引方式。将来这甚至可能不再可能了。而是添加一个额外的 @Field
。您也可以通过注释为该字段指定一个专用名称。由于该字段是 Long
它将自动进行数字编码。