2016-11-22 2 views
1

У меня есть документ, как показано ниже:Matching массивы в упругом поиске

{ 
    "_index": "abc_local", 
    "_type": "users", 
    "_id": "1", 
    "_version": 5, 
    "found": true, 
    "_source": { 
     "firstname": "simer", 
     "lastname": "kaur", 
     "gender": "1", 
     "Address": "Punjab House Fed. Housing Society, Amritsar, Punjab, India", 
     "email": "[email protected]", 
     "occupation": "Php Developer", 
     "work": "Development", 
     "fav_hunting_land": 2, 
     "zipcode": "", 
     "marital_status": "1", 
     "phone": "1234567899", 
     "school": "sdfergdfh", 
     "species": [{ 
      "id": 1 
     }, { 
      "id": 2 
     }, { 
      "id": 3 
     }, { 
      "id": 4 
     }, { 
      "id": 5 
     }, { 
      "id": 6 
     }], 
     "activities": [{ 
      "id": 1 
     }], 
     "fav_weapon": 6, 
     "weapons": [{ 
      "id": 1 
     }, { 
      "id": 2 
     }, { 
      "id": 3 
     }, { 
      "id": 6 
     }], 
     "properties": [{ 
      "id": 4 
     }] 
    } 
} 

и мне нужно, чтобы соответствовать пользователю на основе оружия, и я пытаюсь что-то вроде:

$params = [ 
      'index' => Constants::INDEX, 
      'type' => Constants::DOC_TYPE_USERS, 
      'body' => [ 
       "query"=> [ 
        "bool"=> [ 
         "must"=> [ "match"=> [ "weapons.id"=>$params['weapons'] ]], 

         "should"=> [ 
            [ "match"=> [ "firstname"=> $params['search_text'] ]], 
            [ "match"=> [ "lastname"=> $params['search_text'] ]] 
             ] 
            ] 
          ] 
         ] 

       ]; 

, как я использую эластичные в PHP. Здесь $ PARAMS [ 'оружие'] является:

array (size=2) 
    0 => string '1' (length=1) 
    1 => string '2' (length=1) 

Я получаю сообщение об ошибке:

illegal_state_exception: Can't get text on a START_ARRAY at 1:36

Любые предложения/помощь будет понятно, что, как я могу соответствовать массив. Я взял справку с nested datatypes

Update # 1: параметры Я посылаю к моей функции: {"from":0,"size":null,"city":null,"state":"0","weapons":["1","2"],"activities":[],"species":[],"properties":[],"search_text":"lastname"}

обновление # 2: Тело моего запроса в формате JSON:

{ 
    "index": "abc_local", 
    "type": "users", 
    "body": { 
     "query": { 
      "bool": { 
       "must": { 
        "match": { 
         "weapons.id": ["1", "2"] 
        } 
       }, 
       "should": [{ 
        "match": { 
         "firstname": "simer" 
        } 
       }, { 
        "match": { 
         "lastname": "simer" 
        } 
       }] 
      } 
     } 
    } 
} 
+0

Построить первый запрос 'match' так же, как второй и третий. У вас там слишком много массива. – Val

+0

@Val Обновлено. Теперь я получаю исключение: ill_state_exception: не удается получить текст в START_ARRAY в 1:36 – Simer

+0

Теперь вам не хватает ']' для завершения вашего массива. Убедитесь, что квадратные скобки сбалансированы. – Val

ответ

2

Вы можете просто заменить первый запрос match на номер terms, так как match не работает с массивами значений.

$params = [ 
     'index' => Constants::INDEX, 
     'type' => Constants::DOC_TYPE_USERS, 
     'body' => [ 
      "query"=> [ 
       "bool"=> [ 
        "must"=> [ "terms"=> [ "weapons.id"=>$params['weapons'] ]], 
            ^
            | 
           change this 

        "should"=> [ 
           [ "match"=> [ "firstname"=> $params['search_text'] ]], 
           [ "match"=> [ "lastname"=> $params['search_text'] ]] 
            ] 
           ] 
         ] 
        ] 

      ]; 
+0

Спасибо за ваше время и поддержку. Это сработало. – Simer

+0

Удивительный, рад, что мы это поняли. – Val