【问题标题】:Indexing an Enum type field with hibernate-search使用 hibernate-search 索引枚举类型字段
【发布时间】:2018-07-31 21:08:07
【问题描述】:

当我要使用的索引是 Enum 类型时,我在使用 Hibernate 搜索时遇到问题。

这是我的应用程序的示例:

@Entity
@Indexed
public class MyEntity{
   @Id
   @Field 
   public Long id;
   @Field(bridge=@FieldBridge(impl=EnumBridge.class))
   public Flavour flavour;
}

public enum Flavour {
  vanilla,
  chocolate,
  strawberry,
  pistacchio;
}

然后我尝试使用这种类型的查询查找所有实例。

QueryBuilder qb = [~] ;
Query q = qb.keyword().onField("flavour").matching(Flavour.vanilla).createQuery();

当我对此进行测试时,结果总是空的。我什至尝试使用 Luke 查看索引的内容,但似乎找不到“味道”。提交更改后,我会重新索引所有内容。 除枚举字段外,其他所有类型的索引和查询都可以完美运行。

我尝试了normsanalyzeindexstore、... 的几乎任何组合 @Field 注释(我正在使用 Hibernate-search 4.5.x 和 hibernate 4.3。 1).

我做错了什么?我应该查看任何设置吗?欢迎任何帮助。

【问题讨论】:

  • 你有数据样本吗?

标签: java hibernate lucene hibernate-search


【解决方案1】:

实体似乎使用序数存储风味(因此风味列包含 0 而不是“香草”)。

我不知道 EnumBridge 在做什么,但我建议将枚举存储为字符串:

@Entity
@Indexed
public class MyEntity{
    @Id
    @Field 
    public Long id;

    @Field(bridge=@FieldBridge(impl=EnumBridge.class))
    @Enumerated(EnumType.STRING)
    public Flavour flavour;
}

【讨论】:

  • 这个答案帮助解决了部分问题(最大的)。但要点是,如果没有该注释,数据库将使用序数(这很糟糕,因为这种格式可以通过像某些自动重构工具那样重新排序枚举常量来破坏)。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多