我在弹性索引中有一个嵌套的数据类型,并希望对所有返回结果按升序进行排序。我尝试了以下方法:
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 …列表,但是这些列表不会按value字段升序排列。
然后,我只想返回每个列表的前10名。因此,列表不会像当前一样返回数百,而仅返回n。如果我无法实现此选项,我将使用javascript splice(0,10)在前端获得前10名,但是如果Elastic可以为我做到这一点将是很棒的。
提前致谢。
由于您在主/父级查询中提供了排序,因此将仅对父/根文档进行排序。正如您可能已经观察到的结果所示,文档以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" } }] }
希望这会有所帮助,谢谢