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

Dav*_*tor 6 java lucene solr solrj

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

例如

@Field("title")
private String title;

@Field("categories")
private List<Category> categoryList;
Run Code Online (Sandbox Code Playgroud)

相关的POJO是

public class Category {
    private Long id;
    private String name;
...
Run Code Online (Sandbox Code Playgroud)

}

我的问题有两个部分:

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

b)如何设置架构来保存它.我有一个天真的假设我只需要在必填字段上设置multiValued = true它将全部通过魔法工作.

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

fyr*_*fyr 8

答案是你想的:

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

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

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

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

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