0
votes

I am getting the following Elastic Search error when I try to sort search results by distance with Mongoosastic:

{ message: 'SearchPhaseExecutionException[Failed to execute phase [query_fetch], all shards failed; shardFailures {[rQFD7Be9QbWIfTqTkrTL7A][users][0]: SearchParseException[[users][0]: query[filtered(+keywords:cafe)->GeoDistanceFilter(location, SLOPPY_ARC, 25000.0, -70.0264952, 41.2708115)],from[-1],size[-1]: Parse Failure [Failed to parse source [{"timeout":60000,"sort":[{"[object Object]":{}}]}]]]; nested: SearchParseException[[users][0]: query[filtered(+keywords:cafe)->GeoDistanceFilter(location, SLOPPY_ARC, 25000.0, -70.0264952, 41.2708115)],from[-1],size[-1]: Parse Failure [No mapping found for [[object Object]] in order to sort on]]; }]' }

See bellow for code sample:

var query = {
    "filtered": {
        "query": {
            "bool": {
                "must": [
                    {
                        "term": {
                            "keywords": "cafe"
                        }
                    }
                ]
            }
        },
        "filter": {
            "geo_distance": {
                "distance": "25km",
                "location": [
                    41.2708115,
                    -70.0264952
                ]
            }
        }
    }
};

var opts = {
    "sort": [
        {
            "_geo_distance": {
                "location": [
                    41.2708115,
                    -70.0264952
                ],
                "order":         "asc",
                "unit":          "km",
                "distance_type": "plane"
            }
        }
    ],
    "script_fields": {
        "distance": "doc[\u0027location\u0027].distanceInMiles(41.2708115, -70.0264952)"
    }
};

User.search(query, opts, function (err, data) {
    if (err || !data || !data.hits || !data.hits.hits || !data.hits.hits.length) {
        return callback(err);
    }

    var total = data.hits.total,
    //page = params.page || 1,
        per_page = query.size,
        from = query.from,
    //to = from +
        page = query.from / query.size,
        rows = data.hits.hits || [];
    for (var i = 0; i < rows.length; i++) {
        rows[i].rowsTotal = total;
    }
    callback(err, toUser(rows, params));
});

Here is the User schema:

var schema = new Schema({
    name: {type: String, default: '', index: true, es_type: 'string', es_indexed: true},
    location: {type: [Number], es_type: 'geo_point', es_indexed: true, index: true},
    shareLocation: {type: Boolean, default: false,  es_type: 'boolean', es_indexed: true},
    lastLocationSharedAt: {type: Date},
    email: {type: String, default: '', index: true, es_type: 'string', es_indexed: true},
    birthday: {type: String, default: ''},
    first_name: {type: String, default: ''},
    last_name: {type: String, default: ''},
    gender: {type: String, default: ''},
    website: {type: String, default: '', index: true, es_indexed: true},
    verified: {type: Boolean, default: false},
});
1
Can you update the question your UserSchema?Val

1 Answers

0
votes

I am also getting an error, I think the upgrade of Mongoosastic is double wrapping the code. It def seems to be based on 'sort' rather than on search but still reviewing. Val seems to have a better idea of what is going on as perhaps it has something to do with user schema rather than function.

I am using a similar schema and just upgraded and encountered issues.