6

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

例如

@Field("title")
private String title;

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

关联的 POJO 是

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

}

我的问题有两个部分:

a) 这是否可以通过 SolrJ - 文档仅包含使用字符串列表的 @Field 示例,所以我假设序列化/编组仅支持简单类型?

b)我将如何设置模式来保存它。我有一个天真的假设,我只需要在必填字段上设置 multiValued=true 就可以了。

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

4

1 回答 1

8

答案如你所想:

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

b)问题是您正在尝试在“文档存储”中表示关系思维。这可能只会在一定程度上起作用。如果您想在 lucene 文档中表示类别,只需使用字符串即可,也不必存储 id。

存储 id 的唯一一点是:如果您想在 RDBMS 上进行查找而不进行搜索。如果你想这样做,你需要确保 id 和类别名称是软链接的。这不适用于每个 1:n 关系。(每一个 n 相关表仅包含必填字段的 1:n 关系都是可能的。如果您有一个可选字段,您需要尽可能在该字段中放置诸如填充空常量之类的内容)。

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

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

于 2011-07-09T12:10:39.947 回答