Sorting 根据嵌套对象的集合对文档进行排序
我想根据文档上的嵌套属性对文档进行排序。 鉴于我有以下文件:Sorting 根据嵌套对象的集合对文档进行排序,sorting,elasticsearch,Sorting,elasticsearch,我想根据文档上的嵌套属性对文档进行排序。 鉴于我有以下文件: { "id": 1, "attributes": [ { "name": "a", "value": 1 }, { "name": "b", "value": 2 } ] } { "id": 2, "attributes": [
{
"id": 1,
"attributes": [
{
"name": "a",
"value": 1
},
{
"name": "b",
"value": 2
}
]
}
{
"id": 2,
"attributes": [
{
"name": "a",
"value": 2
},
{
"name": "b",
"value": 2
}
]
}
{
"id": 3,
"attributes": [
{
"name": "b",
"value": 1
}
]
}
排序应该比较相同属性的值,因此它应该首先比较属性“a”的值
如果组“a”的值相同,则应继续比较属性“b”
如果缺少整个组,则缺少该属性的文档将丢失比较
属性可以有任何名称和值,因此事先不知道属性名称
我已经在我的客户端应用程序中编写了这个算法,我只需要一种使用ElasticSearch的方法就可以了。您可以在两个查询中尝试这样做。下面没有一个是测试过的,它只是想给你一个考虑的方向。 第一个查询是一个聚合,用于获取
属性的不同列表。name
第二个包含您的实际查询,对于sort
(您必须基于上述agg的结果构建此排序)
您可以尝试在两个查询中执行此操作。下面没有一个是测试过的,它只是想给你一个考虑的方向。 第一个查询是一个聚合,用于获取
属性的不同列表。name
第二个包含您的实际查询,对于sort
(您必须基于上述agg的结果构建此排序)
你知道有多少属性吗?你如何定义每个属性被考虑的顺序?我不知道之前有多少个属性。属性的比较顺序应该按属性名称的字母顺序排列。那么我认为你不能用ES来进行比较。如果我以另一种方式存储数据,我可以这样做吗?你知道有多少属性吗?你如何定义每个属性被考虑的顺序?我不知道之前有多少个属性。属性比较的顺序应该是按属性名称的字母顺序。那么我认为你不能用ES来做这件事。如果我用另一种方式存储数据,我能做些什么吗?
{
"query": {"match_all": {}},
"sort": [
{
"attributes.value": {
"nested_path": "attributes",
"nested_filter": {"term": {"attributes.name": "a"}}
}
},
{
"attributes.value": {
"nested_path": "attributes",
"nested_filter": {"term": {"attributes.name": "b"}}
}
},
...
]
}