Elasticsearch脚本在嵌套字段上排序

时间:2015-08-29 22:40:22

标签: elasticsearch

我在elasticsearch中有以下类型

top

其中房间是嵌套类型。我想使用脚本排序进行排序,例如

"hotel" : {
   "magicScore" : 1
   "rooms" : [
        {
       "type" : "single",
       "magicScore" : 1
        }, 
        {
        "type" : "double",
        "magicScore" : 2
        }
    ]
}

这不起作用,因为房间是嵌套对象,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

根据documentation

  

doc [...]符号仅允许简单的值字段(不能返回   来自它的json对象)并且仅在非分析或单个上有意义   基于术语的领域。

您需要通过_source字段

使用它

这些方面的东西:

   "sort": [
      {
         "_script": {
            "script": "m=doc['magicScore'].value;for(obj in _source.rooms){ m += obj.magicScore;};return m;",
            "type": "number",
            "reverse": true
         }
      }
   ]

答案 1 :(得分:0)

Elasticsearch允许Script Based SortingSorting within nested objects,而且您可以将两种方法混合在一起使用。您可以尝试以下方法:

"sort" : [ {
   "_script" : {
      "nested": {
         "path": "rooms"
      },
      "script" : "return doc['magicScore'].value + doc['rooms.magicScore'].value",
      "params" :  ,
      "type" : "number",
      "reverse" : true
}}]

一旦指定了nested path,elasticsearch就会对所引用的嵌套文档的术语进行索引(如果已对其进行索引),因此可以通过doc映射来引用它们。这将避免需要加载整个_source