嵌套文档不会保存为简单的数组或列表。它们由 Elasticsearch 内部管理:
Elasticsearch 基本上仍然是扁平的,但它管理嵌套
内部关系以给出嵌套层次结构的外观。什么时候
你创建一个嵌套文档,Elasticsearch 实际上索引了两个
单独的文档(根对象和嵌套对象),然后关联
两个内部。 (更多here)
我认为您需要向 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);
请注意,SortBuilder 具有 .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"}
]
}