2016-07-19 2 views
0

У меня есть ниже отображения в моем индексе:Сортировать родительский тип основан на одном поле в пределах массива вложенного объекта в elasticsearch

{ 
"testIndex": { 
    "mappings": { 
     "type1": { 
      "properties": { 
       "text": { 
        "type": "string" 
       }, 
       "time_views": { 
        "properties": { 
         "timestamp": { 
          "type": "long" 
         }, 
         "views": { 
          "type": "integer" 
         } 
        } 
       } 
      } 
     } 
    } 
} 
} 

«time_views» на самом деле представляет собой массив, но внутренние атрибуты не массив.

Я хочу отсортировать записи типа 1 на основе максимального значения атрибута "views" для каждой записи типа 1. Я прочитал документацию сортировки elasticsearch, у нее есть решение для случаев использования, что сортировка основана на поле (одиночном или массиве) одного вложенного объекта. но то, что я хочу, отличается. Я хочу, чтобы выбрать максимальное значение «мнения» для каждого документа и сортировать документы на основе этих значений

Я сделал этот JSon запрос

{ 
"size": 10, 
"query": { 
    "range": { 
    "timeStamp": { 
     "gte": 1468852617347, 
     "lte": 1468939017347 
    } 
    } 
}, 
"from": 0, 
"sort": [ 
    { 
     "time_views.views": { 
     "mode": "max", 
     "nested_path": "time_views", 
     "order": "desc" 
     } 
    } 
] 
} 

, но я получил эту ошибку

{ 
    "error": { 
    "phase": "query", 
    "failed_shards": [ 
    { 
    "node": "n4rxRCOuSBaGT5xZoa0bHQ", 
    "reason": { 
     "reason": "[nested] nested object under path [time_views] is not of nested type", 
     "col": 136, 
     "line": 1, 
     "index": "data", 
     "type": "query_parsing_exception" 
    }, 
    "index": "data", 
    "shard": 0 
    } 
], 
"reason": "all shards failed", 
"grouped": true, 
"type": "search_phase_execution_exception", 
"root_cause": [ 
    { 
    "reason": "[nested] nested object under path [time_views] is not of nested type", 
    "col": 136, 
    "line": 1, 
    "index": "data", 
    "type": "query_parsing_exception" 
    } 
] 
}, 
"status": 400 
} 

как я упомянутый выше time_views - массив, и я предполагаю, что эта ошибка из-за этого. Даже я не могу использовать сортировку на основе функции поля массива, потому что «time_views» не является примитивным типом. Я думаю, что мой последний шанс - написать обычную сортировку по сценариям, но я не знаю, как это сделать. , пожалуйста, скажите мне мою ошибку, если можно достичь того, чего я хочу, иначе дайте мне простой пример сценария.

Тпх :)

ответ

3

сообщение об ошибке делает много, чтобы объяснить, что случилось с запросом. На самом деле проблема связана с отображением. И я думаю, что вы намеревались использовать поля nested, так как вы используете вложенные запросы.

Вам просто нужно, чтобы сделать ваше time_views поле nested:

"mappings": { 
    "type1": { 
     "properties": { 
     "text": { 
      "type": "string" 
     }, 
     "time_views": { 
      "type": "nested", 
      "properties": { 
      "timestamp": { 
       "type": "long" 
      }, 
      "views": { 
       "type": "integer" 
      } 
      } 
     } 
     } 
    } 
    } 
Смежные вопросы