2016-02-24 32 views
0

我有文檔看起來像這些: -彈性排序

「_source」:{

 "product_name": "p2", 
     "m_p": [ 
     { 
      "m_id": "m2", 
      "price": 100 
     }, 
     { 
      "m_id": "m4", 
      "price": 101 
     } 
     ] 
    } 

「_source」:{

 "product_name": "p1", 
     "m_p": [ 
     { 
      "m_id": "m1", 
      "price": 50 
     }, 
     { 
      "m_id": "m2", 
      "price": 55 
     }, 
     { 
      "m_id": "m3", 
      "price": 55 
     }, 
     { 
      "m_id": "m5", 
      "price": 65 
     } 
     ] 
    } 

現在我需要根據給定的(來自外部來源)m_id和p_id對的價格對這些進行排序。 例如,外部服務爲p1-m2和p2-m4 提供了這樣的查詢,因此查詢應該根據p1的價格將銷售產品分類爲55(m2銷售量爲55)和p2的價格爲101(m4銷售量爲101 )。

回答

0

您需要使用nested sort按存儲在嵌套字段中的值進行排序。此外,您可以使用nested_filter字段根據您關心的文檔中字段的內容進行排序。

如在嵌套過濾器,只能在嵌套文件的屬性過濾器,您必須將product_name存儲每個嵌套的文檔中,如果你想通過這兩個product_namem_id而排序篩選。

通過這些設置

{ 
    "mappings": { 
     "test": { 
     "properties": { 
      "m_p": { 
       "type": "nested", 
       "properties": { 
        "price": {"type": "integer"}, 
        "product_name": {"type": "string"}, 
        "m_id": {"type": "string"} 
       } 
      } 
     } 
     } 
    } 
} 

和索引文件,這種格式

{  "product_name": "p2", 
     "m_p": [ 
     { 
      "m_id": "m2", 
      "product_name": "p2", 
      "price": 100 
     }, 
     { 
      "m_id": "m4", 
      "product_name": "p2", 
      "price": 101 
     } 
     ] 
} 

您可以使用下面的查詢根據雙方product_namem_id

{ 
    "query": { 
     "match_all": {} 
    }, 
    "sort": { 
     "m_p.price": { 
     "nested_path": "m_p", 
     "order": "asc", 
     "nested_filter": { 
      "or": [ 
       { 
        "and": [ 
        { "term": { "m_p.product_name": "p1" }}, 
        { "term": { "m_p.m_id": "m2" }} 
        ] 
       }, 
       { 
        "and": [ 
        { "term": { "m_p.product_name": "p2" }}, 
        { "term": { "m_p.m_id": "m4" }} 
        ] 
       } 
      ] 
     } 
     } 
    } 
} 
+0

烏爾腳本命令基於每個文檔的最小值進行排序,但不會考慮價格c對應於m_id ...即它將第一個文檔的最小值設爲50和100,然後按照價格55和101進行排序但不排序 – rcipher222

+0

是使用數據類型'nested'分析的'm_p'字段嗎? – micpalmia

+0

爲了清晰起見,我更新了答案 - 我在Elasticsearch 2.1.1上測試了它,它按預期工作。 – micpalmia