嵌套数据类型的Elasticsearch:MapperParsingException

时间:2018-01-02 10:19:16

标签: java elasticsearch

这是我的映射

   {
  "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变量是一个对象,所以它不应该被索引吗?或者我理解错了?

1 个答案:

答案 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)

看看你的映射更好,正确的是不是一个嵌套的对象!如果不指定其子字段值

,则无法对嵌套进行索引