我正在将数据索引到ElasticSearch引擎服务器。我有一个名为User的域对象。
以下是我正在使用的相关代码。现在,elasticsearch中的_id
属性设置为此命令的增量值,如下所示:
bulkRequest.add(client.prepareIndex("heros", "entry", i+"")
但是我不希望增加任意ID,因为神奇女侠也会有一个SN_NO作为她文档的id。如何将此Domain对象的唯一ID(SN_NO)映射到elasticsearch引擎中的_id
?我想要这个的原因是,我可能不得不改变她的一个属性,例如腰围,例如随着时间的推移。而且我不希望弹性搜索引擎包含2个神奇女人,一个瘦腰,另一个胖子作为一个愚蠢的例子。
很抱歉这个很长的问题,我努力让它变得有趣阅读。
提前谢谢!
public class TestBulkElastic {
public static void main(String [] args) throws JsonGenerationException, JsonMappingException, IOException {
// Create User object
User user1 = new User();
user1.setGender(Gender.FEMALE);
Name n = new Name();
n.setFirst("Wonder");
n.setLast("Woman");
user1.setName(n);
user1.setVerified(false);
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File("user.json"), user1);
HashMap<String,Object> fileResult =
new ObjectMapper().readValue(new File("user.json"), HashMap.class);
Settings settings = ImmutableSettings.settingsBuilder()
.put("cluster.name", "MyES").build();
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("123.123.123.123", 9350));
BulkRequestBuilder bulkRequest = client.prepareBulk();
int batch = 10000;
int i = 0 ;
while(i < 10000000){
bulkRequest.add(client.prepareIndex("heros", "entry", i+"")
.setSource(fileResult));
if(i%batch == 0){
bulkRequest.execute().actionGet();
bulkRequest = null;
bulkRequest = client.prepareBulk();
}
i++;
}
}
}
答案 0 :(得分:0)
您可以在类型的映射中执行此操作。 将_id字段的路径设置为指向要用作_id
的字段{
"YourType": {
"dynamic": "true",
"_id": {
"path": "new_id"
},
"_timestamp": {
"enabled": true,
"store": true
},
"properties": {
"new_id": {
"type": "string",
"fields": {
"raw": {
"index": "not_analyzed",
"type": "string"
}
}
}
}
}
}