过滤以获取嵌套文档的长度与数字匹配的文档

时间:2016-11-21 13:58:01

标签: elasticsearch

我有一个弹性搜索索引,它有一个名为 plateformes 的嵌套对象。它的子文档数量可能会有所不同,如下所示:

{
  "action" : "clean",
  "plateformes" : [
    {
        "plateforme" : "myplateforme1",
        "status" : "failure"
    },
    {
        "plateforme" : "myplateforme2",
        "status" : "succes"
    },
    {
        "plateforme" : "myplateforme3",
        "status" : "succes"
    }
  ]
},
{
  "action" : "activate",
  "plateformes" : [
    {
        "plateforme" : "myplateforme1",
        "status" : "failure"
    },
    {
        "plateforme" : "myplateforme2",
        "status" : "succes"
    }
  ]
},
{
  "action" : "delete",
  "plateformes" : [
    {
        "plateforme" : "myplateforme1",
        "status" : "succes"
    }
  ]
}

现在,我想只获取 plateformes 完全(让我们说)一个嵌套文档的文档。通过上面的示例,查询必须只返回此文档:

{
  "action" : "delete",
  "plateformes" : [
    {
        "plateforme" : "myplateforme1",
        "status" : "succes"
    }
  ]
}

有办法吗?

2 个答案:

答案 0 :(得分:1)

如果所有对象都具有状态,则可以使用exist检查对象是否存在,然后使用sum进行计算计数,然后使用脚本分数选择所需的条件。像下面的代码

{
  "query": {
    "function_score": {
      "query": {
        "nested": {
          "path": "plateformes",
          "query": {
            "exists": {
              "field": "plateformes.status"
            }
          },
          "score_mode": "sum"
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "_score == 1 ? 1 : 0"
            }
          }
        }
      ],
      "boost_mode": "replace"
    }
  },
  "min_score": 1
}

答案 1 :(得分:0)

您可以在索引时添加另一个字段plateformesCount,在该索引编制时存储文档包含的platformes个数。然后,只需将该字段与某个数字进行比较即非常快。

{
  "action" : "clean",
  "plateformesCount": 3,
  "plateformes" : [
    {
        "plateforme" : "myplateforme1",
        "status" : "failure"
    },
    {
        "plateforme" : "myplateforme2",
        "status" : "succes"
    },
    {
        "plateforme" : "myplateforme3",
        "status" : "succes"
    }
  ]
},
{
  "action" : "activate",
  "plateformesCount": 2,
  "plateformes" : [
    {
        "plateforme" : "myplateforme1",
        "status" : "failure"
    },
    {
        "plateforme" : "myplateforme2",
        "status" : "succes"
    }
  ]
},
{
  "action" : "delete",
  "plateformesCount": 1,
  "plateformes" : [
    {
        "plateforme" : "myplateforme1",
        "status" : "succes"
    }
  ]
}