基于嵌套对象的集合对文档进行排序

时间:2016-02-18 09:05:40

标签: sorting elasticsearch

我想根据它们的嵌套属性对文档进行排序。 鉴于我有以下文件:

{
    "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。

1 个答案:

答案 0 :(得分:0)

您可以尝试在两个查询中执行此操作。以下都没有经过测试,它只是为了给你一个考虑的方向。

第一个查询是一个聚合,用于获取attribute.name

的不同列表

第二个包含您的实际查询,其中包含sort的以下内容(您必须根据上述结果生成此类别)

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