Документы ElasticSearch Query во вложенном массиве

У меня есть запись в индексе эластичного поиска: -

 "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"
    }
  }
]

}

Здесь categoryData вложены. Я пытаюсь запросить categoryNumber 13 и depNumber 98. Мне нужен только этот объект dict с categoryNumber 13 и depNumber 98.

    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"}}}}}}

      

Есть ли способ написать запрос, чтобы получить только определенные объекты с совпадающими терминами


person CodeCool    schedule 28.04.2021    source источник


Ответы (1)


Вы можете использовать inner_hits. чтобы получить только объект с точным соответствием из вложенных документов

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "categoriesData",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "categoriesData.categoryNumber": 13
                    }
                  },
                  {
                    "term": {
                      "categoriesData.depNumber": 98
                    }
                  }
                ]
              }
            },
            "inner_hits":{}         // note this
          }
        }
      ]
    }
  }
}
person ESCoder    schedule 28.04.2021
comment
@CodeCool, пожалуйста, ответьте и дайте мне знать, решит ли это вашу проблему? - person ESCoder; 28.04.2021
comment
любезно посоветуйте мне это stackoverflow.com/questions/67298541/ - person Denn; 28.04.2021
comment
@ESCoder Это будет работать. но это дает несколько ударов. Как это будет работать в случае больших наборов данных - person CodeCool; 28.04.2021