如何使用 Elastic Search Java API 设置父/子关系?

How can I set a parent / child relationship using the Elastic Search Java API?

我正在尝试创建两个文档,一个构建另一个的子文档,使用 Elastic Search Java API。

我的代码看起来像这样:

public void createRecord(Road road, Car car) throws Exception{
  ObjectMapper objectMapper = new ObjectMapper();

  String roadJson = objectMapper.writeValueAsString(road);
  String carJson = objectMapper.writeValueAsString(car);

  Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

  IndexResponse response = client.prepareIndex("myIndex", "roadType").setSource(roadJson).get();

  client.prepareIndex("myIndex", "carType").setParent(response.getId()).setSource(carJson).get();
}

这段代码成功地创建了一个道路文档,但是当它去创建一个汽车文档时,我得到了错误:

java.lang.IllegalArgumentException: Can't specify parent if no parent field has been configured

如何正确创建两个与 ES 形成父/子关系的 Elastic 文档 Java API?

您似乎没有配置 "carType" 映射以将 "roadType" 指定为父项。

"mappings": {
    "roadType": {
        "properties": {
        }
    },
    "carType": {
        "_parent": {
            "type": "roadType"
        },
        "properties": {
            "make": {
                "type": "string"
            },
            "model": {
                "type": "string"
            }
        }
    }
}

有关详细信息,请参阅此处:https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child-mapping.html

我必须为父/子关系创建自定义映射器。这仍然保留了在文档创建时可能发生的动态映射。

public void createRecord(Road road, Car car) throws Exception{
  ObjectMapper objectMapper = new ObjectMapper();

  String roadJson = objectMapper.writeValueAsString(road);
  String carJson = objectMapper.writeValueAsString(car);

  Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

  if(!client.admin().indices().prepareExists("myIndex").get().isExists()){ 
     XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject().startObject("roadType").endObject().endObject();
     XContentBuilder xContentBuilder2 = XContentFactory.jsonBuilder().startObject().startObject("carType").startObject("_parent").field("type", "roadType").endObject().endObject().endObject();

     client.admin().indices().create(new CreateIndexRequest("myIndex")).get();
     client.admin().indices().preparePutMapping("myIndex").setType("carType").setSource(xContentBuilder2).get();
     client.admin().indices().preparePutMapping("myIndex").setType("roadType").setSource(xContentBuilder).get();
  }

  IndexResponse response = client.prepareIndex("myIndex", "roadType").setSource(roadJson).get();

  client.prepareIndex("myIndex", "carType").setParent(response.getId()).setSource(carJson).get();
}

这将创建一个自定义映射器,它在 roadType 和 carType 之间设置父子关系,同时仍然允许您动态映射其他属性。确保先添加子映射,否则它将无法工作。