Consider the following piece of indexing code and please set know how i can add attributes to link parent and child documents. This piece of documentation is missing on Elasticseach site.
Schema:
PUT discovery-index/_doc/2
{
"dimensions" : [
{
"key" : "cluster",
"val" : "tess33"
},
{
"key" : "pod",
"val" : "test-pod"
}
],
"values" : [
{
"key" : "type",
"val" : "logs"
}
],
"join_field": "topo"
}
POST discovery-index/_doc/?routing=1&refresh
{
"timestamp": 1528063525,
"name": "stdout",
"namespace": "tess-apps",
"type": "logs",
"join_field": {
"name": "document",
"parent": "1"
}
}
public void writeInBulkRoot(BulkProcessor bulkProcessor, String indexName, String type, String id, String payLoad) {
IndexRequest indexRequest = (id == null ? new IndexRequest(indexName, type)
: new IndexRequest(indexName, type, id));
indexRequest.source(payLoad, XContentType.JSON);
indexRequest.create(true);
//TODO: How to i set the join field and parent id
try {
bulkProcessor.add(indexRequest);
} catch (Exception e) {
logger.error("Exception while connecting to Elastic. Taking defaults:" + e.getMessage(), e);
}
}
Am i supposed to put parent -child relation as part of the payload itself ? Confusing , if true
Yes, that seems to be case... Not sure why ES REST library allows this in much cleaner way
private String getRootPayload(MetaDataValue value) {
// Dimensions
ArrayNode dimensions = factory.arrayNode();
for (Map.Entry<String, String> entry : value.getDimensionKeys().entrySet()) {
ObjectNode jsDimensions = factory.objectNode();
jsDimensions.put("key", entry.getKey());
jsDimensions.put("val", entry.getValue());
dimensions.add(jsDimensions);
}
ObjectNode dimensionRoot = factory.objectNode();
dimensionRoot.set("dimensions", dimensions);
dimensionRoot.put("join_field", "topo");
String payload = dimensionRoot.toString();
return payload;
}
private String getChildPayload(MetaDataValue value) {
ObjectNode childDocument = factory.objectNode();
childDocument.put("name", value.getName());
childDocument.put("namespace", value.getName());
childDocument.put("timestamp", value.getTs());
childDocument.put("type", value.getType().name());
ObjectNode joinfield = factory.objectNode();
joinfield.put("name", "document");
joinfield.put("parent", value.getId());
childDocument.set("join_field", joinfield);
String payload = childDocument.toString();
return payload;
}