solrj:如何通过索引</pojo>中的多值字段存储和检索List <pojo>

时间:2011-07-09 08:31:58

标签: java lucene solr solrj

我的用例是一个包含在线媒体标题的索引。数据提供者将类别列表与每个标题相关联。我使用SolrJ通过带注释的POJO类填充索引

e.g。

@Field("title")
private String title;

@Field("categories")
private List<Category> categoryList;

关联的POJO是

public class Category {
    private Long id;
    private String name;
...

}

我的问题分为两部分:

a)这可能是通过SolrJ实现的 - 文档只包含一个使用List of String的@Field示例,所以我假设序列化/编组只支持简单类型?

b)如何设置架构来保存它。我有一个天真的假设,我只需要设置 所需字段上的multiValued = true&amp;它将全部通过魔法工作。

我刚开始实施这一点,所以任何回复都会受到高度赞赏。

1 个答案:

答案 0 :(得分:8)

答案如你所愿:

a)您只有简单的类型。因此,您将拥有相同类型的列表,例如串。关键是你不能在lucene文档中表示复杂类型,所以你也不会反序列化它们。

b)问题在于您尝试在“文档存储”中表示关系思维。这可能只适用于某一点。如果你想在lucene文档中表示类别,只需使用字符串,也不需要存储id。

存储id的唯一要点是:如果你想在RDBMS上搜索查找。如果要执行此操作,则需要确保id和类别名称是软链接的。这不适用于每个1:n关系。 (每个1:n关系,其中n相关表只包含必填字段。如果你有一个可选字段,你需要在字段中填写类似填空空常数的东西。)

但是,如果这些1:n关系不是稀疏的,那么如果你保持向文档中添加字段的顺序,它实际上是可能的。因此,如果您不对列表进行排序,则可能表示具有类别关系的情况。

如果使用位置0 ... n处的值对其进行实例化,则可以实现一个返回此类别的方法。因此,解决方案是,如果您想要第一个类别,它将位于与此类别相关的每个列表的第0位。