这是我的映射
{
"mappings": {
"data_test": {
"properties": {
"type": {
"type": "keyword"
},
"geometry": {
"type": "geo_point"
},
"proper": {
"type":"nested",
"properties": {
"gid": {
"type": "keyword"
},
"objectid": {
"type": "keyword"
},
"nombre_del": {
"type": "keyword"
},
"tipo_de_si": {
"type": "double"
},
"codigo_de_": {
"type": "double"
}
}
}
}
}
}
}
根据this link任意字段使用嵌套键:值对将被视为对象,我们需要提供一个对象来索引文档。我有一个看起来像这样的数据(样本)
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-74.0743290075,
4.64168349373
]
},
"properties": {
"gid": 14,
"objectid": "986",
"nombre_del": "Banco Popular",
"tipo_de_si": "15",
"codigo_de_": "13"
}
}
和我的java代码索引这个数据
for (Object s : jar){
JSONObject proper = new JSONObject(new JSONObject(s.toString()).get("properties").toString());
bulkRequest.add(client.prepareIndex("geo_data_test", "data_test")
.setSource(jsonBuilder()
.startObject()
.field("type",new JSONObject(s.toString()).get("type"))
.field("geometry",new JSONObject(new JSONObject(s.toString()).get("geometry").toString()).get("coordinates"))
.field("proper",proper)
.endObject()
)
);
}
BulkResponse r = bulkRequest.get();
Consumer<BulkItemResponse> c = (s) -> System.out.println(s.getFailureMessage());
r.forEach(c);
client.close();
System.out.println(proper);
打印
{"gid":353,"nombre_del":"Banco Colpatria Red Multibanca","tipo_de_si":"15","codigo_de_":"15","objectid":"10835"}
和
System.out.println(proper.getClass());
打印
class org.json.JSONObject
如果我跑这个我得
MapperParsingException[object mapping for [proper] tried to parse field [proper] as object, but found a concrete value]
但是proper
变量是一个对象,所以它不应该被索引吗?或者我理解错了?
答案 0 :(得分:0)
为什么你不能使用proper.gid,proper.nombre_del等?
在您的示例中,它在put请求中指定了一个字段和一个子字段
curl -XPUT 'http://localhost:9200/test2/item/1' -d '{ "state": { "name": "North Carolina" } }
你还没有这样做,在你的put请求中你只调用没有子字段的字段
.field("proper",proper)
看看你的映射更好,正确的是不是一个嵌套的对象!如果不指定其子字段值
,则无法对嵌套进行索引