2017-04-15 18 views
1

我在彈性索引中有一個嵌套數據類型,並且想對所有返回的結果按升序排序。我曾嘗試以下:對嵌套數組進行排序並返回彈性的前10位

GET indexname/_search 
{ 
       "_source" : ["m_iTopicID", "m_iYear", "m_Companies"], 
       "query": { 
        "terms":{ 
         "m_iTopicID": [11,12,13] 
        } 
       }, 
    "sort" : [ 
     { 
      "m_Companies.value" : { 
      "order" : "asc", 
      "nested_path" : "m_Companies" 
      } 
     } 
    ] 
} 

索引的映射如下:

{ 
    "indexname": { 
    "mappings": { 
     "topicyear": { 
     "properties": { 
      "m_Companies": { 
      "type": "nested", 
      "properties": { 
       "name": { 
       "type": "text", 
       "fields": { 
        "keyword": { 
        "type": "keyword", 
        "ignore_above": 256 
        } 
       } 
       }, 
       "value": { 
       "type": "float" 
       } 
      } 
      }, 
      "m_People": { 
      "type": "nested", 
      "properties": { 
       "name": { 
       "type": "text", 
       "fields": { 
        "keyword": { 
        "type": "keyword", 
        "ignore_above": 256 
        } 
       } 
       }, 
       "value": { 
       "type": "float" 
       } 
      } 
      }, 
      "m_Places": { 
      "type": "nested", 
      "properties": { 
       "name": { 
       "type": "text", 
       "fields": { 
        "keyword": { 
        "type": "keyword", 
        "ignore_above": 256 
        } 
       } 
       }, 
       "value": { 
       "type": "float" 
       } 
      } 
      }, 
      "m_Subtopics": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      }, 
      "m_fActivation": { 
      "type": "float" 
      }, 
      "m_iDocBodyWordCnt": { 
      "type": "long" 
      }, 
      "m_iNodeID": { 
      "type": "long" 
      }, 
      "m_iTopicID": { 
      "type": "long" 
      }, 
      "m_iYear": { 
      "type": "long" 
      }, 
      "m_szDocID": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      }, 
      "m_szDocTitle": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      }, 
      "m_szGeo1": { 
      "type": "nested", 
      "properties": { 
       "name": { 
       "type": "text", 
       "fields": { 
        "keyword": { 
        "type": "keyword", 
        "ignore_above": 256 
        } 
       } 
       }, 
       "value": { 
       "type": "float" 
       } 
      } 
      }, 
      "m_szSourceType": { 
      "type": "nested", 
      "properties": { 
       "name": { 
       "type": "text", 
       "fields": { 
        "keyword": { 
        "type": "keyword", 
        "ignore_above": 256 
        } 
       } 
       }, 
       "value": { 
       "type": "float" 
       } 
      } 
      }, 
      "m_szSrcUrl": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      }, 
      "m_szTopicNames": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

此方法返回ID 11,12或13的所有主題與m_Companies列表...但名單未按值字段升序排序。

我只想返回每個列表的前10位。所以這個列表並不像目前那樣返回數百個,而只是n。如果我不能實現這個選項,我只會在前端使用JavaScript拼接(0,10)獲得前10名,但如果彈性可以爲我做到這一點,那將是非常好的。

在此先感謝。

+0

您可以發佈您的映射和樣本文件? – user3775217

+0

@ user3775217是的,我現在已經添加了映射。 – danieljames

+0

我發佈了一個查詢來幫助這個,讓我知道謝謝 – user3775217

回答

1

由於您在主/父級別查詢中提供了排序,因此這將僅排序父/根文檔。正如您可能已經觀察到的結果,文檔以m_Companes.value的最小值排序。

要對每個文檔的嵌套文檔進行排序,您必須深入到嵌套文檔中並應用排序,因爲m_Companies是父文檔中的子文檔。您必須使用嵌套的inner_hits,然後對inner_hits進行排序。

這個github問題有很好的例子,我試圖解釋爲什麼這種排序方式只基於嵌套文檔中的值的父/根文檔。

由於您希望所有文檔都嵌套,因此您可以讓嵌套查詢使用match_all獲取所有嵌套文檔並根據值字段進行排序。

您可以使用下面的查詢

{ 
    "_source": ["m_iYear", "m_Companies"], 
    "query": { 
     "bool": { 
      "must": [{ 
        "terms": { 
         "m_iTopicID": [11, 12, 13] 
        } 
       }, 
       { 
        "nested": { 
         "path": "m_Companies", 
         "query": { 
          "match_all": {} 
         }, 
         "inner_hits": { 
          "sort": [{ 
           "m_Companies.value": "asc" 
          }] 
         } 
        } 
       } 
      ] 
     } 
    }, 
    "sort": [{ 
     "m_Companies.value": { 
      "order": "asc", 
      "nested_path": "m_Companies" 
     } 
    }] 
} 

希望這有助於 感謝

+0

並且在inner_hits中添加「size」:10返回前10名。這是完美的。謝謝! – danieljames

+0

是的,你也可以做分頁。謝謝 – user3775217