2016-02-18 81 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"}} 
      } 
     }, 
     ... 
    ] 
}