2017-04-15 78 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