嵌套文档不会保存为简单数组或列表。它们由Elasticsearch内部管理:
Elasticsearch从本质上来说仍然是平坦的,但是它在内部管理嵌套关系以使嵌套层次结构看起来更加美观。创建嵌套文档时,Elasticsearch实际上会索引两个单独的文档(根对象和嵌套对象),然后在内部将两者关联。(更多在这里)
我认为您需要向elasticsearch提供一些其他信息,以指示哪个作者是“主要/第一”作者。只需将这个附加字段放在嵌套对象中的一个作者中就足够了(您的映射可以像以前一样保持不变),如下所示:
{ "authorList" : [ {"lastName":"roger", "firstName":"christina", "authorOrder": 1}, {"lastName":"freud", "firstName":"damian"} ]},{ "authorList" : [ {"lastName":"hawking", "firstName":"stephan", "authorOrder": 1}, {"lastName":"adams", "firstName": "mark" } {"lastName":"frey", "firstName":"richard"} ]},{ "authorList" : [ {"lastName":"adams", "firstName":"monica", "authorOrder": 1}, {"lastName":"adams", "firstName":"richard"} ]}然后查询可能是:
{ "query" : { "nested" : { "query" : { "bool" : { "must" : [ { "match" : { "authorList.authorOrder" : 1 } } ] } }, "path" : "authorList" } }, "sort" : [ { "authorList.lastName" : { "order" : "asc", "nested_filter" : { "bool" : { "must" : [ { "match" : { "authorList.authorOrder" : 1 } } ] } }, "nested_path" : "authorList" } } ]}并使用Java API:
QueryBuilder matchFirst = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("authorList.authorOrder", 1));QueryBuilder mainQuery = QueryBuilders.nestedQuery("authorList", matchFirst, ScoreMode.None);SortBuilder sb = SortBuilders.fieldSort("authorList.lastName") .order(SortOrder.ASC) .setNestedPath("authorList") .setNestedFilter(matchFirst);SearchRequestBuilder builder = client.prepareSearch("test") .setSize(50) .setQuery(mainQuery) .addSort(sb);请注意,
SortBuilderhas
.setNestedFilter(matchAll)表示
排序基于
authorList.lastName字段,但仅基于您的“主要/第一”嵌套元素。如果没有它,elasticsearch将首先对所有嵌套文档进行排序,从升序的排序列表中选择第一个元素,并根据此元素对父文档进行排序。因此带有“
Hawking”的文档可能是第一个,因为它的姓氏是“ Adams”。
最终结果是:
"authorList" : [ {"lastName":"adams", "firstName":"monica", "authorOrder": 1}, {"lastName":"adams", "firstName":"richard"} ],}"authorList" : [ {"lastName":"hawking", "firstName":"stephan", "authorOrder": 1}, {"lastName":"adams", "firstName":"mark"}, {"lastName":"frey", "firstName":"richard"} ]},{ "authorList" : [ {"lastName":"roger", "firstName":"christina", "authorOrder": 1}, {"lastName":"freud", "firstName":"damian"} ]}


