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

标签 java lucene solr solrj

我的用例是一个包含在线媒体标题的索引。数据提供者将类别列表与每个标题相关联。我正在使用 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 在必填字段上 & 它会神奇地工作。

我刚刚开始实现此功能,因此我们将不胜感激。

最佳答案

答案如你所想:

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

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

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

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

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

关于java - solrj:如何通过索引中的多值字段存储和检索 List<POJO>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6633684/

相关文章:

Solr 分面查询语法

search - 自动完成的简单 Solr 模式问题

java - 在java中使用FTP程序

java - 使用 PersistenceUnitInfo 注册 ClassTransformer 时发生错误

java - 为什么子类必须先调用父类(super class)的构造函数才能初始化自己的变量

lucene - SpatialQuery 使用 Lucene 进行基于位置的搜索

MySql 全文或 Sphinx 或 Lucene 或其他什么?

postgresql - 如何使用 Postgresql 全文搜索模拟 Solr "more like this query"?

Java - 从文件中获取行

performance - 指数线性增长 - 性能下降