映射地理点在 ElasticSearch 中不起作用

Mapping geopoint doesn't work in ElasticSearch

我正在使用 NodeJS ElasticSearch 和 ElasticSearch 7.0。我在特定字段上创建映射 geo_point 类型,但它不显示 _mapping 中的 geo_point 类型。我尝试使用 filter.geo_distance 进行搜索,我得到了 failed to find geo point field

节点弹性搜索映射

client.indices.putMapping({
  index: 'listing',
  type: 'detail',
  body: {
    properties: {
      'listing_coordinates': {
        "type": "geo_point"
      }
    }
  }
}, function(err) { console.log(err) })

映射错误

[illegal_argument_exception] Types cannot be provided in put mapping requests, unless the include_type_name parameter is set to true.

/listing/_mapping

mappings: {
 properties: {
  "listing_coordinates": {
    "properties": {
      "lat": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "lon": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  },
 }
}

节点搜索

client.search({
    index: 'listing',
    type: 'detail',
    size: 5,
    body: {
      query : {
        "bool": {
          "filter": {
            "geo_distance" : {
              "distance" : "500km",
              "listing_coordinates" : {
                "lat" : 3.0567521,
                "lon" : 101.5854671
              }
            }
          }
        }
      }
    }
 }

搜索错误

[query_shard_exception] failed to find geo_point field [listing_coordinates]

我的列表中有映射日期字段,效果很好。

看到这个:https://github.com/elastic/elasticsearch-js/issues/166 我想你的问题应该和他的差不多。请注意事件执行的顺序。另请注意,如果您没有等待 PutMapping 完成,那么这些索引可能会自动创建到文本字段中。

更新:

您的 PutMapping 似乎失败了,然后您的映射是通过接收数据作为默认行为创建到文本字段中的。

在ES7.0中,除非设置include_type_name,否则在创建索引时不能提供类型。在您的例子中,类型是 detail。要处理 include_type_name,请参阅 this。或者您可以尝试在您的情况下删除 type: detail 。请在尝试之前尝试清除您的索引映射。

参考: https://www.elastic.co/guide/en/elasticsearch/reference/master/removal-of-types.html#removal-of-types