ElasticSearch:如何查询精确的嵌套数组

Ham*_*bot 4 elasticsearch

我正在尝试在我的索引中查询某种类型的文档。

让我们看看下面的文档:

{
  "id": 1,
  "title": "My first Collection",
  "items": [
    {
      "code": "SB",
      "order": 1,
      "random": "something random"
    },
    {
      "code": "BB",
      "order": 2,
      "random": "something random"
    },
    {
      "code": "FO",
      "order": 3,
      "random": "something random"
    },
    {
      "code": "RA",
      "order": 4,
      "random": "something random"
    },
    {
      "code": "FO",
      "order": 5,
      "random": "something random"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

items场是一个nested场。

我想查询所有与确切模式匹配的文章:

{
  "items": [
    {
      "code": "SB",
      "order": 1
    },
    {
      "code": "BB",
      "order": 2
    },
    {
      "code": "FO",
      "order": 3
    },
    {
      "code": "RA",
      "order": 4
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

查询的文档将包含所有这 4 个项目,并具有这种精确的字段组合。但他们也可以拥有更多。上面描述的文档将匹配查询。

我搜索了整个文档,特别是在嵌套查询部分,我没有找到任何让它工作的方法。

甚至可能还是应该实现我自己的算法/脚本?

编辑:

我尝试了以下但没有成功:

{
  "query": {
    "nested": {
      "path": "items",
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "items.code:SB AND items.order:1"
              }
            },
            {
              "query_string": {
                "query": "items.code:BB AND items.order:2"
              }
            },
            {
              "query_string": {
                "query": "items.code:FO AND items.order:3"
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

dav*_*ide 6

此查询有效:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "items",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "items.code": "SB"
                    }
                  },
                  {
                    "term": {
                      "items.order": "1"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "items",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "items.code": "BB"
                    }
                  },
                  {
                    "term": {
                      "items.order": "2"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "items",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "items.code": "FO"
                    }
                  },
                  {
                    "term": {
                      "items.order": "3"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这基本上是您使用的那个,但是nested为每个子查询而不是整体指定了。

当您使用nested关键字时,您是在告诉 ElasticSearch 尝试在与主文档分离的嵌套文档中进行匹配。当然,考虑到你的榜样,一个项目不能有所有的代码顺序夫妇"SB"-1"BB"-2"FO"-3在同一时间。但是您可以使用 3 个嵌套查询分别要求它们。