弹性搜索查询索引中的数组

时间:2019-03-15 13:11:52

标签: elasticsearch

我有一个索引(默认架构),其中包含字段“人员”,并且该字段是一个数组。

在索引中有两个对象:

{"took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.8630463,
    "hits": [
      {
        "_index": "warehouse",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.8630463,
        "_source": {
          "order": 2,
          "status": "done",
          "personnel": [
            {
              "name": "mike",
              "function": "packer"
            },
            {
              "name": "henry",
              "function": "checker"
            } ] }
      },
      {
        "_index": "warehouse",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.8630463,
        "_source": {
          "order": 1,
          "status": "done",
          "personnel": [
            {
              "name": "jon",
              "function": "packer"
            },
            {
              "name": "mike",
              "function": "checker"
            }
 ] } } ] } }

我想查询它以获取订单,其中状态已完成,打包此订单的人是麦克。

我查询很多,但是我总是得到两个命令,因为迈克在两个命令中都存在(巫婆功能不同)

示例查询:

{"query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "status": "done"
                    }
                },
                {
                    "bool": {
                        "must": [
                            {
                                "term": {
                                    "personnel.name": "mike"
                                }
                            },
                            {
                                "term": {
                                    "personnel.function": "packer"
                                }
            } ] } } ] } } }

我的问题是,如何准备查询以仅向我返回一个订单(麦克是包装工)

1 个答案:

答案 0 :(得分:0)

好吧,我的回答只是一个猜测,因为您没有提供所遇到问题的描述。但是您查询的嵌套部分应该是这样的:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "status": "done"
                    }
                },
                {
                    "nested": {
                        "path": "personnel",
                        "query": {
                            "bool": {
                                "must": [
                                    {
                                        "term": {
                                            "personnel.name": "mike"
                                        }
                                    },
                                    {
                                        "term": {
                                            "personnel.function": "packer"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}