В моем сопоставлении Elasti c есть вложенный объект. Я пытаюсь создать запрос фильтра для этого вложенного объекта - PullRequest
0 голосов
/ 26 мая 2020

Насколько я знаю, когда я объявил объект как вложенный, он создал массив, подобный структуре, для хранения нескольких объектов этого типа. Это пример сопоставления файла json.

{
    "employee": {
        "dynamic": "strict",
        "properties": {
            "id": {
                "type": "keyword"
            },
            "name": {
             "type": "keyword"
            },
            "previous_job_documents": {
                "type": "nested",
                "properties": {
                    "id": {
                        "type": "keyword"
                    },
                    "status": {
                        "type": "keyword"
                    },
                    "type": {
                        "type": "integer"
                    }
                   }
                  }
                }}}

Образцы данных, извлеченные из elasti c.

  "data": {
    "nodes": {
      "totalCount": 465,
      "edges": [
        {
          "id": "b6ecb8aa-4d12-44d6-8ed7-9ee1003d0d54",
          "name": "test",
          "previous_job_documents": [
            {
              "type": "RELIEVING_LETTER",
              "status": "NOT_SUBMITTED"
            },
            {
              "type": "OFFER_LETTER",
              "status": "SUBMITTED"
            },
            {
              "type": "PAYSLIP_FIRST_MONTH",
              "status": "VERIFIED"
            },
            {
              "type": "PAYSLIP_SECOND_MONTH",
              "status": "NOT_SUBMITTED"
            },
            {
              "type": "PAYSLIP_THIRD_MONTH",
              "status": "NOT_SUBMITTED"
            }
          ]
        }
        ]
        }}}

Проблема: я хочу написать фильтр, который найдет всех сотрудников, чье имя - test, а RELIEVING_LETTER НЕ_ПОДАЧЕНО и OFFER_LETTER ОТПРАВЛЕНО.

Это то, что я пробовал в фильтре:

{
  "filters": {
    "Employee": 
    {"AND": [{"name": "test"},
      {
        "path": "previous_job_documents"
        "AND": [
            {
              "term": {
                "previous_job_documents.type": {
                  "value": "RELIEVING_LETTER"
                }
              }
            },
            {
              "term": {
                "previous_job_documents.status": {
                  "value": "NOT_SUBMITTED"
                }
              }
            },


          {
              "term": {
                "previous_job_documents.type": {
                  "value": "OFFER_LETTER"
                }
              }
            },
            {
              "term": {
                "previous_job_documents.status": {
                  "value": "SUBMITTED"
                }
              }
            }
        ]
      }
        ]
    }
  }
}

1 Ответ

0 голосов
/ 31 мая 2020

Вам необходимо использовать вложенный запрос для вложенных полей внутри запроса на совпадение (поскольку вложенные поля будут храниться отдельно).

 {
"query":{
"bool":{
"must":[
{
    "match":{"name":"user2"}
},    
{
        "nested":{
            "path": "previous_job_documents",
            "query":{
            "bool":{
                "must":[
                    {"match": {"previous_job_documents.type": "RELIEVING_LETTER"}},
                    {"match":{"previous_job_documents.status":"NOT_SUBMITTED"}}
                ]
            }
        }
    }
    },
    {
        "nested":{
            "path": "previous_job_documents",
            "query":{
            "bool":{
                "must":[
                    {"match": {"previous_job_documents.type": "OFFER_LETTER"}},
                    {"match":{"previous_job_documents.status":"SUBMITTED"}}
                ]
            }
        }
    }
}
]
}
}
}
...