2017-02-18 3 views
1

Я хочу выполнить несколько запросов на сервере elasticsearch с одним запросом. В частности у меня есть следующий запрос (на elastcisearch-PHP-клиент)Объедините два запроса одним запросом

$params = [ 
        "index" => "bookydate", 
        "type" => "vendor_service", 
        "body" => [ 
         "query" => [ 
          "bool" => [ 
           "must" => [ 
            "term" => [ 
             "sys_service_id" => $request->input("sys_service_id") 
            ] 
           ], 
           "should" => [ 
            "geo_shape" => [ 
             "served_location" => [ 
              "shape" => [ 
               "type" => "point", 
               "coordinates" => [ 
                "{$request->input('loc_lon')}", 
                "{$request->input('loc_lat')}"] 
              ] 
             ] 
            ] 
           ] 
          ] 
         ] 
        ] 
       ]; 

То, что я хочу сделать, это принести также все документы, которые имеют "hole_country" поле для true.

Что я уже пробовал - это сделать еще один запрос на сервер Elasticsearch и с array_merge объединить два результата, но не работает из-за ограничений PHP на массивах с несколькими одинаковыми ключами.

UPDATE

Elastcisearch поддерживает функцию под названием Multisearch, что это именно то, что им нужно. Проблема в том, что php-клиент не поддерживает многопользовательский поиск, поэтому я должен использовать Guzzle для отправки запросов.

В документах Guzzle нет полной информации о том, как правильно построить тело запроса. Любая информация приветствуется

Уже я следующее тело, но elastcisearch этого returing плохой ошибке запроса

$body = [ 
     ["index"=>"bookydate"], 
     ["query"=>["bool"=> ["must"=>[["term"=>["sys_service_id"=>"1"]],["geo_shape"=>["served_location"=>["shape"=>["type"=>"circle","coordinates"=>[25,3],"radius"=>"90km"]]]]]]]], 
     ["index"=>"bookydate"], 
     ["query"=>["bool"=>["must"=>["term"=>["hole_country"=>true]]]]] 
    ]; 

ответ

1

Вы можете использовать Multisearch API из Elasticsearch. Это более или менее добавляет все ваши запросы в формате JSON в одном запросе POST. Я надеюсь, что PHP-клиент поддерживает это, иначе вам, возможно, придется вручную выполнить запрос POST.

Multi-search API

+0

multisearch если штраф для меня и соответствует моим потребностям. Действительно, php-клиент не поддерживает msearch, поэтому я использовал guzzle для отправки запроса. Но я должен решить некоторые вопросы о том, как отправить правильное тело. Посмотрите мое обновление – dios231

1

Хотя это не документировали Multi Search API поддерживается клиентом elasticsearch PHP.

Вместо search вызова msearch и группировать запросы, как это: $params = [ 'body' => [ ["index" => "bookydate", "type" => "vendor_service"], ["query" => [ "bool" => [ "must" => [ "term" => [ "sys_service_id" => $request - > input("sys_service_id") ] ], "should" => [ "geo_shape" => [ "served_location" => [ "shape" => [ "type" => "point", "coordinates" => [ "{$request->input('loc_lon')}", "{$request->input('loc_lat')}" ] ] ] ] ] ] ]] ];

Таким образом, используя обновленный синтаксис является правильным. Вы должны просто позвонить msearch.

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