elasticsearch,Sorting,elasticsearch" /> elasticsearch,Sorting,elasticsearch" />

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"}}
            }
        },
        ...
    ]
}