猫鼬弹性搜索中的GeoCode过滤器 [英] GeoCode filter in mongoose elasticsearch

查看:110
本文介绍了猫鼬弹性搜索中的GeoCode过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在meanjs中的mongodb中进行地理位置过滤.我已经使用了Mongoosastic模块,但是无法执行地理位置过滤器. 下面是用于过滤器的猫鼬模式和控制器代码.

I am trying to do geo point filter in mongodb in meanjs. i have used mongoosastic modules but i am not able to perform geo point filter. here below are the mongoose schema and controller code for filter.

猫鼬模式

    'use strict';
    /**
     * Module dependencies.
     */
    var mongoose = require('mongoose'),
            Schema = mongoose.Schema,
            mongoosastic = require('mongoosastic');

    var BusinessSchema = new Schema({
        name: {type: String, unique: 'Name already exists', trim: true, required: 'Name is required.', es_indexed: true},
        searchTags: {type: [String], es_indexed: true},
        alias: {type: Array, es_indexed: true},
        // geoLocation: { type: [Number], /*/ [<longitude>, <latitude>]*/ index: '2d', /*/ create the geospatial index,*/ required: 'GeoLocation is required.', es_indexed:true,es_type:'geo_point'},
        geo_cords: {
            type: Array
        },
        address: {
            address1: {type: String, required: 'Address is required', trim: true},
            address2: String,
            city: {type: String, required: 'City is required', trim: true},
            // state: {type: String, required: 'State is required', trim: true},
            country: {type: String, required: 'Country is required', trim: true},
            postalCode: {type: String, required: 'Postal code is required', trim: true},
            neighbourhood: String
        },
        isActive: {
            type: Boolean,
            default: true,
            es_indexed: true
        },
        dateUpdated: {
            type: Date
            , es_indexed: true
        },
        dateCreated: {
            type: Date,
            default: Date.now
            , es_indexed: true

        }
    });

用于过滤器和查询的控制器代码

controller code for filter and query

   var mongoose = require('mongoose'),
        Business = mongoose.model('Businesses');

    var query = {
        "query_string": {
            "multi_match": {
                "query": categoryIds.join(' OR '),
                "fields": ["categoryIds", "relatedCategoryIds"]
            }
        },
        "filter": {
            "bool": {
                "should": [
                    {"term": {"address.postalCode": "110016"}},
                    {"geo_distance": {
                            "distance": "50km",
                            "geo_cords": [-122.3050, 37.9174]
                        }
                    }
                ],
            }
        }
    }

    Business.search(query, function (err, results) {
        // sendResponse(req, res, err, results)
        if (!err) {
            res.json(results);
        } else {
            res.status(400).send({message: 'Business Not Found'})
        }
    });

在执行此操作时,我遇到了一个很长的错误

while doing this i am getting a long error saying

QueryParsingException[[businessess] failed to find geo_point field [geo_cords]

推荐答案

根据 mongoosastic的文档

地理位置映射

在为任何地理映射数据建立索引(或调用同步)之前,必须使用createMapping手动创建映射(请参见上文).

Prior to index any geo mapped data (or calling the synchronize), the mapping must be manualy created with the createMapping (see above).

首先,在您的模式中,以这种方式定义'geo_cords':

First, in your schema, define 'geo_cords' this way:

geo_cords: : {
      geo_point: {
        type: String,
        es_type: 'geo_point',
        es_lat_lon: true
      },
      lat: { type: Number },
      lon: { type: Number }
    }

向每个数组或嵌入类型添加es_type:'object'

Add an es_type: 'object' to each Array or embbeded type

alias: {type: Array, es_indexed: true, es_type: 'object'}

创建模型后,立即在模型上调用.createMapping().

Then call .createMapping() on the model just after you've created it.

这篇关于猫鼬弹性搜索中的GeoCode过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆