【问题标题】:Hibernate-Search @IndexedEmbedded with HashMap, how to include keyset in indexHibernate-Search @IndexedEmbedded with HashMap,如何在索引中包含键集
【发布时间】:2015-11-05 11:24:07
【问题描述】:

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

@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;
    }
}

现在我想通过将这些数据视为索引中的单个实体来使用 Hibernate Search 来搜索这些数据。注释的设置方式会发生这种情况,但是多语言字段的所有条目都存储在索引的同一字段中。基本上我的索引结构是这样的:

id
i18n.title
i18n.description
i18n.requirements

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

id
i18n.nl.title
i18n.en.title
i18n.nl.description
i18n.en.description
i18n.nl.requirements
i18n.en.requirements

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

【问题讨论】:

    标签: java hibernate hibernate-search


    【解决方案1】:

    如果您想让索引字段看起来像您描述的那样,请使用自定义字段桥。这就是您获得此结构的方式,但由于您的地图值非常复杂,因此需要大量自定义代码来创建所有字段。

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

    【讨论】:

    • 我猜它是一个FieldBridge。我不认为地图的结构太复杂,因为所有值都是字符串类型,否则没有理由让它们成为多语言对象的一部分。我想我可以制作一个自定义注释来识别要添加到索引的字段。关于您的其他问题,我目前一次迈出这一步,我的第一步是创建一个合适的索引。目前,它一次只需要搜索一种语言。不过,必须研究诸如词干提取和其他过滤器之类的选项。
    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2021-11-21
    • 2023-04-09
    相关资源
    最近更新 更多