首页 > 解决方案 > 如何在 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 部分更新(原子更新)许多感觉效率不高的文档。重新索引索引不是首选解决方案,因为这是一个多租户应用程序。

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

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

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

标签: solr

解决方案


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

在幕后进行原子更新实际上会重新索引文档(并创建一个 Lucene 级别的新文档)。它还要求存储所有字段以允许重新创建文档。并且连接降低了您可以拥有的评分灵活性。

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


推荐阅读