elasticsearch 响应中缺少 geo_point 个字段

Missing geo_point fields in elasticsearch response

如果使用 "fields []"

指定,结果中似乎会忽略 geo_point 字段

我有索引 test01 的以下映射

{
   "test01": {
      "mappings": {
         "activity": {
            "properties": {
               "location": {
                  "type": "string"
               },
               "mygeo": {
                  "type": "geo_point",
                  "doc_values": true,
                  "fielddata": {
                     "format": "compressed",
                     "precision": "1km"
                  }
               }
            }
         }
      }
   }
}

索引包含单个 activity

{
      "mygeo": {
        "lat": 51.247607909,
        "lon": 22.565701278
      },
      "location" : "New York"
}

查询

GET /test01/_search
{
  "size" : 1,
  "fields": ["location", "mygeo"]
}

在缺少 mygeo 字段的地方生成以下内容。 (我也尝试过 "fields":["location"、"mygeo.lat"、"mygeo.lon"、"mygeo"]。

 "hits": [
     {
        "_index": "test01",
        "_type": "activity",
        "_id": "1",
        "_score": 1,
        "fields": {
           "location": [
              "New York"
           ]
        }
     }
  ]

我可以获得 mygeo 对象的唯一方法是通过添加“_source”通过 _source : {"includes" : [ "mygeo" ]}.

有什么方法可以使用 "field" 参数获取 geo_point 字段吗?

我试过 Rest API 和 Java API。两者使用 Elasticsearch v. 1.7.1 产生相同的结果。

谢谢

所以按照这个逻辑,我通过将 "store": true 添加到您的索引映射来复制并解决了这个问题,现在它允许我使用 fields 检索 lon/lat,而不是_source.

请查看在我的本地主机上 Sense 上完成的复制:

DELETE test

PUT /test
{
  "mappings": {
    "test1": {
      "properties": {
        "location": {
          "type": "string"
        },
        "mygeo": {
          "type": "geo_point",
          "doc_values": true,
          "store": true, 
          "fielddata": {
            "format": "compressed",
            "precision": "1km"
          }
        }
      }
    }
  }
}

POST /test/test1/
{
  "mygeo": {
    "lat": 51.247607909,
    "lon": 22.565701278
  },
  "location": "New York"
}


GET /test/_search
{
  "size" : 1,
  "fields": ["location", "mygeo"]
}

因此,此查询确实返回了您预期的结果。唯一的问题是您的 lan/lon 被格式化为数组。查看查询结果:

{
  "hits" : [{
      "_index" : "test",
      "_type" : "test1",
      "_id" : "AVCGqhsq9y2W0mh1rPgV",
      "_score" : 1,
      "fields" : {
        "mygeo" : [
          "51.247607909,22.565701278"
        ],
        "location" : [
          "New York"
        ]
      }
    }
  ]
}

但是,这是 Elasticsearch 官方支持的格式之一。摘自 documentation:

With the location field defined as a geo_point, we can proceed to index documents containing latitude/longitude pairs, which can be formatted as strings, arrays, or objects:

PUT /attractions/restaurant/1
{
  "name" : "Chipotle Mexican Grill",
  "location" : "40.715, -74.011"
}

PUT /attractions/restaurant/2
{
  "name" : "Pala Pizza",
  "location" : {
    "lat" : 40.722,
    "lon" : -73.989
  }
}

PUT /attractions/restaurant/3
{
  "name" : "Mini Munchies Pizza",
  "location" : [-73.983, 40.719]
}

此外,请注意文档中的这一点:

Everybody gets caught at least once: string geo-points are "latitude,longitude", while array geo-points are [longitude,latitude]—the opposite order!

如果您的字段存储在 _source 中(即使它是 GeoPoint 类型字段),您必须使用“_source”查询参数来指定您想要哪些字段(来自源):

GET /_search
{
    "_source": "obj.*",
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

在此处查看更多详细信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html

长话短说:

  • 如果您的字段在源中,那么您需要在查询中指定“_source”模式以仅获取您想要的部分(字段)
  • 在您的查询中指定 "fields" 将(大部分)对在映射中使用 "store: yes" 声明的字段有意义。这并没有说明哪些字段应该 return 从源中编辑。
  • 是的,这里存在不一致:如果您的字段映射到源中,但未使用 "Store: yes" 声明,则在查询的 "fields" 参数中指定它可能会也可能不会 return 它(我注意到 "simple" 字段,如文本、数字等在这种情况下被 returned,但更复杂的字段,如时间戳或 GeoPoint 则没有)。