如何在Solr中存储嵌套的关系数据

时间:2019-06-10 12:25:48

标签: solr

我正在尝试在Solr中存储数据,以便最好地维护索引。我遇到的问题是我的数据结构严重嵌套。示例:

Company
  (to many) Person
    (to many) Property
      (to many) Network
        (to many) SubNetwork

我正在尝试为每个SubNetwork创建一个全文搜索索引,以在其旁边显示当前父字段。

当前我的数据已完全非规范化,例如:

{
    "company": "Coca-Cola",
    "property": "1 plaza hotel",
    "network": "ABC",
    "subNetwork": "123"
}

现在,如果用户现在进入应用程序并更改公司名称(处于非规范化状态),这将要求Solr部分更新(原子更新)许多效率不高的文档。重新索引索引不是首选解决方案,因为这是一个多租户应用程序。

我尝试将关系数据放在单独的索引中,然后在Solr中使用join,但这不会在最终结果中复制连接的索引字段,这意味着无法在所有字段上进行全文搜索可能。

{!join from=inner_id to=outer_id}field:value

我正在尝试以一种方式配置Solr,即在更新父记录时,它只需要一次原子更新,但仍然保留了在所有字段上搜索的能力。这可能吗?

1 个答案:

答案 0 :(得分:0)

除非您看到性能问题,否则您的初始实现似乎是正确的。特别是如果您要返回子网,并且可能同时在子网和父值上进行搜索。

在后台进行原子更新实际上无论如何都会为文档重新编制索引(并创建Lucene级的新文档)。它还要求存储所有字段以允许重新创建文档。而且联接降低了您拥有的计分灵活性。

您可以做的一种优化是不存储父字段,而只保留它们的索引。这将更节省空间,并减少磁盘/记录的重新水化工作。但是,您不能将这些字段返回给用户,而必须从原始来源获取它们。