2015-08-27 3 views
0

Я пытаюсь найти имена между периодом времени.сделать два запроса работать друг за другом

Но проблема в том, когда я пытаюсь запустить его

first-- возвращает выбранные имена значений второй - возвращает данные между этим периодом.

Теперь то, что я хочу сделать, это то, что я хочу найти имя между периодом времени.

Для объяснения его более, предположим, что у нас есть выбрать имя «Джон», и выберите дату 2/08/2015 до 27/08/2015, поэтому он должен вернуть все имена между этим периодом времени.

Но он возвращает имена Джона и ищет другие документы между этим периодом, где также должно быть указано имя «Джон» при поиске даты!

Как решить эту проблему!

$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); 

Но всегда возвращает ошибку, как это ----

{ "ошибка": "SearchPhaseExecutionException [Не удалось выполнить фазу [запрос], все черепки неудачные; shardFailures { [agEfJ6ltSJmlec3gpnPg3g] [myIndex] [1]: SearchParseException [[myIndex] [1]: from [-1], size [-1]: Parse Failure [Не удалось проанализировать имя [{\ "query \": { \ "BOOL \": {\ "должен \": {\ "query_string \": {\ "default_field \": \ "имя \", \ "запрос \": \ "john.se \"}, \» диапазон \ ": {\" datehistory \ ": {\" от \ ": 1438207200 \" в \ ": 144062 6400}}}}}}]]]; вложен: QueryParsingException [[myIndex] Нет запроса для [datehistory]]; }]», "Статус": 400}

ответ

1

У вас есть смесь bool/should и bool/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); 
+0

спасибо большое за ответ, но я на самом деле. пробовал это, но каждый раз, когда он возвращает мне ошибку, у меня есть обновленный мой вопрос, чтобы показать ошибку :) –

+0

мой плохой, извините. Я обновил свой ответ, пожалуйста, посмотрите еще раз – Val

+0

Большое вам спасибо, спасибо так много ........ действительно очень большое спасибо от всего сердца :) спасибо большое :) –

Смежные вопросы