2016-09-03 4 views
0

У меня есть следующие данные в elasticsearch типа называют «банк»Elasticsearch Сбой запроса точно для поля массива внутри документа

[ 
    { 
     "_id": "1", 
     "name": "ICIC", 
     "balance": "$2,574.27", 
     "friends": [ 
      { 
       "roleid": 0, 
       "name": "Alana Shepard", 
       "isactive": true 
      }, 
      { 
       "roleid": 1, 
       "name": "Katheryn Hatfield", 
       "isactive": false 
      } 
     ] 
    }, 
    { 
     "_id": "2", 
     "name": "SBK", 
     "balance": "$2,346.44", 
     "friends": [ 
      { 
       "roleid": 0, 
       "name": "Hinton Kaufman", 
       "isactive": true 
      }, 
      { 
       "roleid": 1, 
       "name": "Miles Alford", 
       "isactive": true 
      } 
     ] 
    } 
] 

Теперь я пытаюсь получить документ, где friends.roleid = 1 и друзей .isactive = true. DSL запрос запрашиваемая следующим образом,

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "term": { 
         "friends.roleid": { 
          "value": 1 
         } 
        } 
       }, 
       { 
        "term": { 
         "friends.isactive": { 
          "value": true 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

Результаты, ожидаемые является объектом с _id = 2. Но на самом деле это было как _id = 1, так и _id = 2. Будет очень полезно, если кто-нибудь поможет найти, в чем проблема в запросе DSL. Спасибо

+0

Вам нужно объявить поле 'друзей' как' вложенный' тип. См. Почему здесь: https://www.elastic.co/guide/en/elasticsearch/guide/2.x/nested-objects.html – Val

+0

Val Как написать вложенный запрос и обычный запрос dsl в том же запросе? –

+0

Вы можете использовать 'bool/must', чтобы объединить их вместе так же, как и вы, чтобы объединить запросы' term' внутри вложенного. – Val

ответ

1

Проблема была исправлена, если бы «друзья» поля были вложенными объектами. И DSL запрос реконструируется следующим образом,

{ 
    "query": { 
     "nested": { 
      "path": "friends", 
      "query": { 
       "bool": { 
        "must": [ 
         { 
          "term": { 
           "friends.roleid": { 
            "value": 1 
           } 
          } 
         }, 
         { 
          "term": { 
           "friends.isactive": { 
            "value": "true" 
           } 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

Путь в DSL запросе указывает вложенный объект. Справочная информация по документации elastics https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-query.html поможет много.