2016-06-12 7 views
1

У меня есть документы, которые выглядят следующим образом (здесь пример):ElasticSearch двойной вложенных сортировки

{ 
"user": "xyz", 
"state": "FINISHED", 
"finishedTime": 1465566467161, 
"jobCounters": { 
    "counterGroup": [ 
     { 
      "counterGroupName": "org.apache.hadoop.mapreduce.FileSystemCounter", 
      "counter": [ 
       { 
        "name": "FILE_BYTES_READ", 
        "mapCounterValue": 206509212380, 
        "totalCounterValue": 423273933523, 
        "reduceCounterValue": 216764721143 
       }, 
       { 
        "name": "FILE_BYTES_WRITTEN", 
        "mapCounterValue": 442799895522, 
        "totalCounterValue": 659742824735, 
        "reduceCounterValue": 216942929213 
       }, 
       { 
        "name": "HDFS_BYTES_READ", 
        "mapCounterValue": 207913352565, 
        "totalCounterValue": 207913352565, 
        "reduceCounterValue": 0 
       }, 
       { 
        "name": "HDFS_BYTES_WRITTEN", 
        "mapCounterValue": 0, 
        "totalCounterValue": 89846725044, 
        "reduceCounterValue": 89846725044 
       } 
      ] 
     }, 
     { 
      "counterGroupName": "org.apache.hadoop.mapreduce.JobCounter", 
      "counter": [ 
       { 
        "name": "TOTAL_LAUNCHED_MAPS", 
        "mapCounterValue": 0, 
        "totalCounterValue": 13394, 
        "reduceCounterValue": 0 
       }, 
       { 
        "name": "TOTAL_LAUNCHED_REDUCES", 
        "mapCounterValue": 0, 
        "totalCounterValue": 720, 
        "reduceCounterValue": 0 
       } 
      ] 
     } 
    ] 
} 

}

Теперь я хочу sort эти данные, чтобы получить TOP 15 документов на основе totalCounterValue где counter.name является FILE_BYTES_READ. Я пробовал вложенную сортировку по этому вопросу, но независимо от того, какое ключевое имя я пишу в counter.name, он всегда сортируется на основе HDFS_BYTES_READ. Может кто-нибудь, пожалуйста, помогите мне с моим запросом.

{ 
"_source": true, 
"size": 15, 
"query": { 
    "bool": { 
     "must": [ 
      { 
       "term": { 
        "state": { 
         "value": "FINISHED" 
        } 
       } 
      }, 
      { 
       "range": { 
        "startedTime": { 
         "gte": "now - 4d", 
         "lte": "now" 
        } 
       } 
      } 
     ] 
    } 
}, 
"sort": [ 
    { 
     "jobCounters.counterGroup.counter.totalCounterValue": { 
      "order": "desc", 
      "nested_path": "jobCounters.counterGroup", 
      "nested_filter": { 
       "nested": { 
        "path": "jobCounters.counterGroup.counter", 
        "filter": { 
         "term": { 
          "jobCounters.counterGroup.counter.name": "file_bytes_read" 
         } 
        } 
       } 
      } 
     } 
    } 
]} 

Это отображение для jobCounters мы создали:

"jobCounters": { 
     "type": "nested", 
     "include_in_parent": true, 
     "properties" : { 
      "counterGroup": { 
      "type": "nested", 
      "include_in_parent": true, 
      "properties": { 
       "counterGroupName": { 
       "type": "string", 
       "fields": { 
        "raw": { 
         "type": "string", 
         "index": "not_analyzed" 
         } 
        } 
       }, 
       "counter" : { 
        "type": "nested", 
        "include_in_parent": true, 
        "properties": { 
         "reduceCounterValue": { 
          "type": "long" 
         }, 
         "name": { 
          "type": "string", 
          "analyzer": "english", 
          "fields": { 
           "raw": { 
            "type": "string", 
            "index": "not_analyzed" 
           } 
          } 
         }, 
         "totalCounterValue": { 
          "type": "long" 
         }, 
         "mapCounterValue": { 
          "type": "long" 
         }     
        }     
       }      
      } 
      } 
     } 
    } 

Я следовал вложенная сортировка документации ElasticSearch и придумал этот запрос, но я не знаю, почему она всегда сортировкой totalCounterValue от HDFS_BYTES_READ независимо от jobCounters.counterGroup.counter.name.

+0

Не могли бы вы поделиться картографией? –

+0

Совместно! Извините за это :) – rg41

ответ

0

вы можете попробовать что-то вроде этого,

curl -XGET 'http://localhost:9200/index/jobCounters/_search' -d ' 
{ 
    "size": 15, 
    "query": { 
    "nested": { 
     "path": "jobCounters.counterGroup.counter", 
     "filter": { 
     "term": { 
      "jobCounters.counterGroup.counter.name": "file_bytes_read" 
     } 
     } 
    } 
    }, 
    "sort": [ 
    { 
     "jobCounters.counterGroup.counter.totalCounterValue": { 
     "order": "desc", 
     "nested_path": "jobCounters.counterGroup", 
     "nested_filter": { 
      "nested": { 
      "path": "jobCounters.counterGroup.counter", 
      "filter": { 
       "term": { 
       "jobCounters.counterGroup.counter.name": "file_bytes_read" 
       } 
      } 
      } 
     } 
     } 
    } 
    ] 
} 
' 

Читать конец this документа. В нем объясняется, что мы должны повторить один и тот же запрос в nested_filter.

+0

Нет, он по-прежнему сортируется в другом поле. Более того, я думаю, что в этом вопросе сортировка не имеет способа узнать, на какой '' 'totalCounterValue''' он должен сортироваться, поэтому он делает для первого, который он получает. – rg41

+0

Я отредактировал свой ответ. Я думаю, вам нужно проверить, соответствует ли jobCounters.counterGroup.counter.name totalCounterValue перед сортировкой и в сортировочном вложенном фильтре. Надеюсь, что это работает –

+0

К сожалению, даже это не работает. Теперь он сортируется по '' 'FILE_BYTES_WRITTEN''' вместо' '' FILE_BYTES_READ''', может быть, нам нужно что-то сделать, поскольку '' 'counterGroup''' является массивом, а также' '' counter''' является массивом так двойное гнездование? – rg41

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