Elasticsearch嵌套排序

我正在尝试在Elasticsearch中进行嵌套排序,但到目前为止没有成功。

我的数据结构:

{ "_id" : 1,

"authorList" : [

{"lastName":"hawking", "firstName":"stephan"},

{"lastName":"frey", "firstName":"richard"}

]

}

{ "_id" : 2,

"authorList" : [

{"lastName":"roger", "firstName":"christina"},

{"lastName":"freud", "firstName":"damian"}

]

}

我想根据文档中第一作者的姓氏对文档进行排序。

使用的映射:

"authorList" : { "type" : "nested", "properties" : {"lastName":{"type":"keyword"}}}

使用SearchRequestBuilder(JAVA)进行排序:

    searchRequestBuilder.addSort(

SortBuilders.fieldSort("authorList.lastName")

.order(SortOrder.ASC)

.sortMode(SortMode.MIN)

.setNestedPath("authorList")

)

这行得通,但没有给出想要的结果(例如,首先是“叫卖”,然后是“罗杰”)。

我错过了什么吗?有没有办法表明Elasticsearch访问数组authorList的index = 0?是否有任何映射/规范化器分别索引数组的第一个条目?

回答:

嵌套文档不会保存为简单数组或列表。它们由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)表示

。如果没有它,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"}

]

}

以上是 Elasticsearch嵌套排序 的全部内容, 来源链接: utcz.com/qa/419811.html

回到顶部