【问题标题】:Filter against geo_point in an array of nested objects过滤嵌套对象数组中的 geo_point
【发布时间】:2016-11-21 08:48:48
【问题描述】:

我正在尝试过滤嵌套在对象 (Location) 中的 geo_point (geo_coordinates),该对象嵌套在查询对象 (MyObject) 的数组中。
问题是对象 MyObject 的映射没有将 geo_coordinates 字段视为 geo_point:

// Index mapping for object MyObject
"myobjects": {
    "mappings": {
      "myobject": {
        "properties": {
            "locations": {
            "type": "nested",
            "include_in_parent": true,
            "properties": {
                "geo_coordinates": {
                "properties": {
                  "lat": {  "type": "double" },
                  "lon": { "type": "double" }
                }
              },
  }
[...]
// Index mapping for object Location 
"locations": {
    "mappings": {
      "location": {
        "properties": {
          "geo_coordinates": {
            "type": "geo_point"
          },
        }
      }
    }

猫鼬对象 MyObject 如下所示:

var MyObjectSchema = new Schema(
[...]
    locations: {
      type: [{ type: Schema.Types.ObjectId, ref: 'Location', es_schema: LocationSchema.schema}],
      es_type: 'nested',
      es_include_in_parent: true
    },
[...]
)

猫鼬对象位置如下所示:

var LocationSchema = new Schema(
[...]
  geo_coordinates: {
      type: {
        geo_point: {
          type: String,
          es_type: 'geo_point',
          es_lat_lon: true
        },

        lat: {type: Number, default: 0},
        lon: {type: Number, default: 0}
      },
      es_type: 'geo_point'
  }
[...]
);

我的查询如下所示:

// POST http://ES-endpoint/locations/_search
{
    "query": {
        "filtered" : {
            "query": {
                    "match_all" : {}
                },
                "filter" : {
                    "geo_distance" : {
                        "distance" : "20000km",
                        "locations.geo_coordinates" : {
                            "lat" : 40,
                            "lon" : -70
                        }}}}}}

我必须错过一些东西,但是什么?
PS:使用 Kibana 探索索引时,两个对象的 geo_location 数据相同:

"geo_coordinates": {
          "lat": x.xxxx,
          "lon": y.yyy
        }

【问题讨论】:

    标签: node.js elasticsearch mongoose mongoosastic


    【解决方案1】:

    以下是使用嵌套对象对 geo_point 应用过滤查询的示例。我使用 mongoosastic 这是一个 Mongoose 插件,用于在 elasticsearch 中创建索引。

    Mongoose 地理位置数据模型

    geoLocation: {
        type: {
            type: String,
            default: 'Point'
        },
        coordinates: [Number]
    }
    

    在 geoLocation 字段上创建映射

    Model.createMapping({
                "mappings": {
                    "event": {
                        "properties": {
                            "geoLocation": {
                                "type": "nested",
                                "properties": {
                                    "coordinates": {
                                        "type": "geo_point",
                                        "lat_lon": true
                                    }
                                }
                            }
                        }
                    }
                }
            },
            function(err, mapping) {
                if (!err) {
                    console.log('mapping created!');
                }
            });
    

    使用地理过滤器查询

    {
        "query": {
            "filtered": {
                "query": {
                    "multi_match": {
                        "query": "Pop",
                        "fields": ["name","city"],
                        "type": "phrase_prefix"
                    }
                },
                "filter": {
                    "nested": {
                        "path": "geoLocation",
                        "query": {
                            "filtered": {
                                "filter": {
                                    "geo_distance": {
                                        "distance": "5km",
                                        "geoLocation.coordinates": {
                                            "lat": 19.1074861,
                                            "lon": 72.9156988
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      相关资源
      最近更新 更多