Hibernate-Search @IndexedEmbedded与HashMap,如何在索引中包含keyset

时间:2015-11-05 11:24:07

标签: java hibernate hibernate-search

我正在尝试将Hibernate Search集成到应用程序中。应用程序实体可以具有多语言存储的多个属性。这是通过将非多语言和多语言属性分成单独的实体来实现的。此拆分的示例代码段如下所示(省略了hibernate注释,因为数据库部分工作正常):

df <- data.frame(pair1 = rep(c("Apple", "Banana", "Carrot"), 4),
pair2 = rep(c("Doughnut", "Carrot", "Banana", "Apple"), 3),
stringsAsFactors = FALSE)

现在我想通过将Hibernate Search作为索引中的单个实体进行搜索来使这些数据可搜索。设置注释的方式会发生,但多语言字段的所有条目都存储在索引中的相同字段中。基本上我的索引结构如下所示:

@Indexed
public class Assignment {

    @DocumentId
    private UUID id;

    @IndexedEmbedded
    private Map<String, AssignmentI18n> i18n;

    // Other properties
}

public class AssignmentI18n {

    @DocumentId
    @FieldBridge(impl = AssignmentI18nBridge.class)
    private AssignmentI18nId id;

    @Field
    private String title;

    @Field
    private String description;

    @Field
    private String requirements;

    public static class AssignmentI18nId {

        private UUID assignmentId;

        private String iso;
    }
}

由于多语言数据的所有值都在同一字段中编入索引,因此我无法再区分它们所属的语言。有没有办法让索引看起来更像这样?:

id
i18n.title
i18n.description
i18n.requirements

基本上我想将HashMap键值添加到索引字段名称。我已经研究过将地图视为具有自定义FieldBridge的字段的可能性,但这似乎不是正确的方法。

1 个答案:

答案 0 :(得分:0)

如果要使索引字段看起来与您描述的字段类似,请使用自定义字段桥。这就是你如何获得这种结构,但由于你的地图值非常复杂,所以需要很多自定义代码来创建所有字段。

您可以为Hibernate Search here创建功能请求。我可以想象这种类型的功能将是普遍使用的。基本上,通过@IndexedEmbedded选项或通过附加注释的方式定义了映射键如何成为Lucene字段名称的一部分。那就是说,您是否考虑过如何在此索引中搜索?用户是否以某种方式指定了区域设置,并且根据此本地,您将定位相应的字段?另外,根据语言类型,您如何处理配置不同词干分析器的方法?