Java Solr输入/输出的平坦化和去平坦化

Java Solr输入/输出的平坦化和去平坦化,java,parsing,solr,Java,Parsing,Solr,我有很多具有父子关系的Java对象 这些都需要放到Solr中 为此,我们将Java对象转换为json,如下所示: { "employee": { "name" : "John", "address": { "apt": 100, "city": "New York", "country": "USA" }, "vehicles": [ { "name" : "Hyundai", "

我有很多具有父子关系的Java对象

这些都需要放到Solr中

为此,我们将Java对象转换为json,如下所示:

{
  "employee": {
    "name" : "John",
    "address": {
      "apt": 100,
      "city": "New York",
      "country": "USA"
    },
    "vehicles": [
      {
        "name" : "Hyundai",
        "color" : "red"
      },
      {
        "name" : "Toyota",
        "color" : "black"
      }
    ]
  }
}
"employee.name": "John",
"employee.address.apt": 100,
"employee.address.city": "New York",
"employee.address.country": "USA",
"employee.vehicles_0.name": "Hyundai",  // Note how arrays are being flattened
"employee.vehicles_0.color": "red",
"employee.vehicles_1.name": "Toyota",
"employee.vehicles_1.color": "black",
现在,由于Solr无法处理此问题,我将按如下方式将其展平:

{
  "employee": {
    "name" : "John",
    "address": {
      "apt": 100,
      "city": "New York",
      "country": "USA"
    },
    "vehicles": [
      {
        "name" : "Hyundai",
        "color" : "red"
      },
      {
        "name" : "Toyota",
        "color" : "black"
      }
    ]
  }
}
"employee.name": "John",
"employee.address.apt": 100,
"employee.address.city": "New York",
"employee.address.country": "USA",
"employee.vehicles_0.name": "Hyundai",  // Note how arrays are being flattened
"employee.vehicles_0.color": "red",
"employee.vehicles_1.name": "Toyota",
"employee.vehicles_1.color": "black",
扁平化很容易,但我的库的客户在查询时不希望扁平化模式

因此,我需要在从Solr返回时对上述内容进行去平坦化,并将其转换回原始Java对象

有人知道如何做到这一点吗

我正在考虑从Solr(如上所示)获取平坦的输出,并编写一个解析器将字段放回Java对象。但这似乎需要做很多工作。一个简单的方法或一个现有的工具将不胜感激


我使用的是Solr 4.5.1

Solr是为搜索而设计的,而不是存储深层对象图。您最好优化Solr记录以进行搜索,然后通过recordID或类似的方法从主存储中获取原始对象


想一想你想找到什么。例如,您是否会搜索单个车辆?如果是,您当前的文档级别应该是车辆而不是员工。

您可以首先在父级->子级结构中为文档编制索引


请看这篇博文:

即使我尝试按姓名搜索员工,也应该有办法检索完整的员工信息。我还想让所有员工都拥有红色汽车。或者所有驾驶丰田汽车的员工,等等。也请注意,这是一个非常简单的例子。现实中有数百个实体需要存储和检索,这些实体的层次结构级别可以是5到10级。Solr绝对不会帮助您将实体存储到10级深度。你需要先考虑一下你的搜索策略。你将搜索什么,你想找到什么。您可能会发现,您需要多个实体类型,甚至可能需要使用不同形状重复相同数据的单独集合。然后,从关系数据库中获取原始实体。