ElasticSearch 查询嵌套数组中的文档

时间:2021-04-28 09:17:15

标签: elasticsearch elasticsearch-query elasticsearch-7

我在弹性搜索索引中有一条记录:-

 "hits" : {
"total" : {
  "value" : 1,
  "relation" : "eq"
},
"max_score" : 0.0,
"hits" : [
  {
    "_index" : "index",
    "_type" : "_doc",
    "_id" : "C3wfF3kBVSP1PGuoao73",
    "_score" : 0.0,
    "_source" : {
      "rId" : 1066,
      “categoriesData" : [
        {
          "categoryNumber" : 13,
          "depNumber : 98,
          "storeIds" : [
            "3", 
            "6"
          ],
          "fData" : {
            "Type" : “Single
          }
        },
        {
          "categoryNumber" : 12,
          "depNumber" : 97,
          "storeIds" : [
            "3629",
            "3628"
          ],
          "Data" : {
            "Type" : “DOUBLE
          }
        }
      ],
      "sId" : "35EB8012-AA52-4872-A1A2-92522BD3925F"
    }
  }
]

}

这里的类别数据是嵌套的。我正在尝试查询 categoryNumber 13 和 depNumber 98。我只想要带有 categoryNumber 13 和 depNumber 98 的 dict 对象

    This is my query:- 
    GET /index/_search
     {
     "query": {
       "bool": {
         "must": [
        {
          "nested": {
             "path": "categoriesData",
            "query": {
             "bool": {
              "must": [
              {
                "term": {
                  "categoriesData.categoryNumber": 13
                }
              },
              {
                "term": {
                  "categoriesData.depNumber": 98
                }
              }
            ]
          }
        }
      }
    }
  ]
  }
  }
 }

当尝试上面的查询时,它给了我所有的文件。我的要求是只获取带有 depNumber 和分类号的文件 预期输出:- 嵌套字段中只有一个对象。

   "categoriesData" : [
    {
      "categoryNumber" : 13,
      "depNumber : 98,
      "storeIds" : [
        "3", 
        "6"
      ],
      "fData" : {
        "Type" : “Single
      }
    }

我的映射:-

     {"mappings": {"properties": 
                                    {"rId": {  "type": "integer"},
                                    "sId": { "type": "keyword" },
                                    "CategoriesData" : {"type":"nested","properties" :{"depnumber”: {"type":"integer"},"categoryNumber”: {"type":"integer"},"storeIds": {"type":"keyword"},"fData" : {"type":"object"}}}}}}

有什么方法可以编写查询以仅获取具有匹配项的特定对象

1 个答案:

答案 0 :(得分:1)

您可以使用 inner_hits 从嵌套文档中仅获取完全匹配的对象

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "categoriesData",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "categoriesData.categoryNumber": 13
                    }
                  },
                  {
                    "term": {
                      "categoriesData.depNumber": 98
                    }
                  }
                ]
              }
            },
            "inner_hits":{}         // note this
          }
        }
      ]
    }
  }
}