【问题标题】:Elasticsearch malformed query, expected [END_OBJECT] but found [FIELD_NAME]Elasticsearch 格式错误的查询,应为 [END_OBJECT],但找到了 [FIELD_NAME]
【发布时间】:2018-01-30 04:55:40
【问题描述】:

我正在使用 elasticsearch 客户端使用 constant_score 和聚合进行一些搜索查询,但它抛出了异常:

[parsing_exception] [constant_score] malformed query, expected [END_OBJECT] but found [FIELD_NAME]

这是我创建查询并调用搜索功能的地方:

fetchData: function fetchFn(req, res, next) {
    var model = new urlModel();
    util.log('Fetching data from ES::');
    var query = buildAggregateUrl(req.reqData);
    // if (req.reqData['domain']) {
    //     var termFilter = { "term": { "domain": req.reqData.domain } };
    //     query.constant_score.filter.bool.must.push(termFilter);
    // }
    model.search({ query }, function (er, re) {
        if (re) {
            req.sendResult = re;
        }
        next(er);
    });

    function buildAggregateUrl(opts) {
        var query = {
            constant_score: {
                filter: {
                    bool: {
                        must: [{
                            "range": {
                                "timestamp": {
                                    "gte": opts.startTime,
                                    "lte": opts.endTime
                                }
                            }
                        }]
                    }
                }
            },
            aggs: {
                success: {
                    scripted_metric: {
                        init_script: "params._agg.succ=0;",
                        map_script: "if(doc.status.value=='success'){params._agg.succ+=1}",
                        combine_script: "return params._agg.succ",
                        reduce_script: "int sum=0;for (a in params._aggs){sum+=a}return sum"
                    }
                },
                failure: {
                    scripted_metric: {
                        init_script: "params._agg.fail=0;",
                        map_script: "if(doc.status.value=='failure'){params._agg.fail+=1}",
                        combine_script: "return params._agg.fail",
                        reduce_script: "int sum=0;for (a in params._aggs){sum+=a}return sum"
                    }
                }
            }
        };
        return query;
    }
}

 And this is what the search function looks like:

    es_model.prototype.search = function (opts, cb) {
    var query = {
        index: this.esConfig.index,
        type: this.esConfig.type,
        body: {query:opts.query} 
    };
    console.log('Query ===> ',query);
    this.client.search(query, cb);
}

我不知道语法的问题出在哪里。我也尝试将 constant_score 键包装在查询中,但它似乎不起作用。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您只是在顶层缺少 query 元素:

    {
        query: {
            constant_score: {
            filter: {
                bool: {
                    must: [{
                        "range": {
                            "timestamp": {
                                "gte": opts.startTime,
                                "lte": opts.endTime
                            }
                        }
                    }]
                }
            }
            }
        },
        aggs: {
            success: {
                scripted_metric: {
                    init_script: "params._agg.succ=0;",
                    map_script: "if(doc.status.value=='success'){params._agg.succ+=1}",
                    combine_script: "return params._agg.succ",
                    reduce_script: "int sum=0;for (a in params._aggs){sum+=a}return sum"
                }
            },
            failure: {
                scripted_metric: {
                    init_script: "params._agg.fail=0;",
                    map_script: "if(doc.status.value=='failure'){params._agg.fail+=1}",
                    combine_script: "return params._agg.fail",
                    reduce_script: "int sum=0;for (a in params._aggs){sum+=a}return sum"
                }
            }
        }
    }
    

    另请注意,您的客户端代码应如下所示:

    es_model.prototype.search = function (opts, cb) { 
        var query = { 
            index: this.esConfig.index, 
            type: this.esConfig.type, 
            body: opts.query
        }; 
        this.client.search(query, cb); 
    }
    

    【讨论】:

    • 我已经尝试过了,但由于以下异常失败:[parsing_exception] 没有为 [query] 注册 [query]
    • 好吧,您可能需要显示更多代码,因为查询是正确的。
    • 这就是我调用客户端搜索函数的地方:es_model.prototype.search = function (opts, cb) { var query = { index: this.esConfig.index, type: this.esConfig.type, body: { query: opts.query } }; this.client.search(query, cb); } 这就是我调用这个包装函数的地方:model.search({ query },cb);
    • 我仍然收到此异常:[parsing_exception] Unknown key for a START_OBJECT in [constant_score].,
    • 酷,很高兴它有帮助!
    猜你喜欢
    • 2022-10-25
    • 2021-04-22
    • 2020-02-26
    • 2017-12-01
    • 2018-02-10
    • 2018-04-25
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多