2016-02-18 60 views
1

我想根据它们上的嵌套属性对我的文档进行排序。 鉴于我有以下文件:基于嵌套对象集合对文档排序

{ 
    "id": 1, 
    "attributes": [ 
     { 
      "name": "a", 
      "value": 1 
     }, 
     { 
      "name": "b", 
      "value": 2 
     } 
    ] 
} 

{ 
    "id": 2, 
    "attributes": [ 
     { 
      "name": "a", 
      "value": 2 
     }, 
     { 
      "name": "b", 
      "value": 2 
     } 
    ] 
} 

{ 
    "id": 3, 
    "attributes": [ 
     { 
      "name": "b", 
      "value": 1 
     } 
    ] 
} 

的排序应比较同一属性的值,所以应该先继续和比较属性“a”的值。

如果组“a”的值相同,则应该继续并比较属性“b”。

如果整个组丢失,缺少该属性的文档将会丢失比较结果。

属性可以有任何名称和值,所以事先不知道属性名称。

我已经在我的客户端应用程序中编写了此算法,我只需要一种方法来使用ElasticSearch来完成此操作。

+0

你知道有多少属性吗?你如何定义每个属性的考虑顺序? –

+0

我不知道之前有多少属性。属性的比较顺序应该按照属性的名称按字母顺序排列。 –

+1

然后我不认为你可以用ES做这个。 –

回答

0

你可以尝试在两个查询中做到这一点。以下都没有经过测试,只是打算给你一个方向来考虑。

第一个查询是聚合得到的attribute.name

鲜明的列表中的第二个包含实际查询,用类似的sort以下(你必须建立这种基础上的结果以上agg)

{ 
    "query": {"match_all": {}}, 
    "sort": [ 
     { 
      "attributes.value": { 
       "nested_path": "attributes", 
       "nested_filter": {"term": {"attributes.name": "a"}} 
      } 
     }, 
     { 
      "attributes.value": { 
       "nested_path": "attributes", 
       "nested_filter": {"term": {"attributes.name": "b"}} 
      } 
     }, 
     ... 
    ] 
}