【问题标题】:make two query work after each other使两个查询彼此后工作
【发布时间】:2015-08-27 20:55:26
【问题描述】:

我正在尝试找出某个时间段之间的名称。

但问题是当我尝试运行它时

first-- 它返回选定的名称值 second -- 它返回该期间之间的数据。

现在我想做的是,我想在一个时间段之间搜索名称。

为了进一步解释,假设我们选择了一个名字“john”,并选择了一个日期 2/08/2015 到 27/08/2015, 所以它应该返回该时间段之间的所有名称。

但它返回的是 john 的姓名,而不是在该期间搜索其他文档,其中在搜索日期时也应该使用名称“John”!

如何解决这个问题!

    $name = $request->request->get('name');

    $strat_date = $request->request->get('strat_date');

    $end_date = $request->request->get('end_date');


    $params = array(
        'index' => "myIndex",
        'type' => "myType",
        'body' => array(
            'query' => array(
                'bool' => array(
                    'must' => array(
                    // empty should clause for starters
                    )
                )
            )
        )
    );

    // add each constraint in turn depending on whether the param is specified
    if (!empty($sourceFilter)) {
        $params['body']['query']['bool']['must'] = array(
            'query_string' => array(
                'default_field' => 'name',
                'query' => implode(" ", $name)
            )
        );
    }

    if (!empty($end_date)) {
        $params['body']['query']['bool']['must']['range'] = array(
            'datehistory' => array(
                "from" => $strat_date,
                "to" => $end_date
            )
        );
    }

    // special case if none is present, just match everything
    if (count($params['body']['query']['bool']['must']) == 0) {
        $params['body']['query'] = array(
            'match_all' => array()
        );
    }

    $docs = $client->search($params);

但总是返回这样的错误----

{"error":"SearchPhaseExecutionException[执行阶段失败 [查询],所有分片失败;分片失败 {[agEfJ6ltSJmlec3gpnPg3g][myIndex][1]: SearchParseException[[myIndex][1]: from[-1],size[-1]: 解析失败 [解析名称失败 [{\"query\":{\"bool\":{\"must\":{\"query_string\":{\"default_field\":\"name\",\"query\":\" john.se\"},\"range\":{\"datehistory\":{\"from\":1438207200,\"to\":1440626400}}}}}}]]]; 嵌套:QueryParsingException [[myIndex] 没有注册查询 [日期历史]]; }]","状态":400}

【问题讨论】:

    标签: php elasticsearch


    【解决方案1】:

    您同时拥有bool/shouldbool/must,因此您只需将bool/should 更改为bool/must

    $params = array(
        'index' => "myIndex",
        'type' => "myType",
        'body' => array(
            'query' => array(
                'bool' => array(
                    'must' => array(                       <--- CHANGE
                    // empty should clause for starters
                    )
                )
            )
        )
    );
    
    // add each constraint in turn depending on whether the param is specified
    if (!empty($sourceFilter)) {
        $params['body']['query']['bool']['must'][] = array(  <--- CHANGE
            'query_string' => array(
                'default_field' => 'name',
                'query' => implode(" ", $name)
            )
        );
    }
    
    if (!empty($end_date)) {
        $params['body']['query']['bool']['must'][] = array(  <--- CHANGE
            'range' => array(
                'datehistory' => array(
                    "from" => $strat_date,
                    "to" => $end_date
                )
            )
        );
    }
    
    // special case if none is present, just match everything
    if (count($params['body']['query']['bool']['must']) == 0) {  <-- CHANGE
        $params['body']['query'] = array(
            'match_all' => array()
        );
    }
    
    $docs = $client->search($params);
    

    【讨论】:

    • 非常感谢您的回答,但我实际上已经尝试过了,但每次它返回错误时,我都会更新我的问题以显示错误:)
    • 我的错,对不起。我已经更新了我的答案,请再看一遍
    • 非常感谢,非常感谢........真的非常感谢我的内心深处:)非常感谢:)
    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多