如何使用 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 之间设置父子关系,同时仍然允许您动态映射其他属性。确保先添加子映射,否则它将无法工作。
我正在尝试创建两个文档,一个构建另一个的子文档,使用 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 之间设置父子关系,同时仍然允许您动态映射其他属性。确保先添加子映射,否则它将无法工作。