基于elasticsearch中嵌套Object数组中的一个字段对父类型进行排序

时间:2016-07-19 09:37:32

标签: elasticsearch

我的索引中有以下映射:

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

" time_views"实际上是一个数组,但内部属性不是数组。

我想根据" views"的最大值对我的type1记录进行排序。每个type1记录的属性。我阅读了elasticsearch排序文档,它有针对用例的解决方案,即排序基于单个嵌套对象的字段(单个或数组)。但我想要的是不同的。我想要选择最大值" views"对于每个文档,并根据这些值对文档进行排序

我做了这个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"不是原始类型。 我认为我的最后一次机会是通过脚本编写自定义排序,但我不知道如何。 请告诉我我的错误,如果有可能实现我想要的,否则给我一个简单的脚本样本。

tnx:)

1 个答案:

答案 0 :(得分:3)

错误消息可以解释查询的错误。实际上,问题在于映射。我认为您打算使用nested字段,因为您使用的是嵌套查询。

您只需将time_views字段设为nested

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