Elasti c search - обработка условия с помощью запроса «должен или не должен» - PullRequest
0 голосов
/ 05 августа 2020

У нас есть требование, если есть newId, тогда мы должны получить данные меньше, чем сегодняшняя дата, и если поле newId отсутствует в данных, мы должны получить данные до даты истечения + 2Months. Я пытался выполнить запрос ниже, но результат не соответствует ожиданиям.

 {
    "id":"234",
    "startDate":"23/07/2020",
    "endDate":"24/09/20202",
    "newId":"2345"
    },
   {
    "id":"234",
    "startDate":"23/07/2020",
    "endDate":"24/09/20202",
    "newId":null
    },
{
    "id":"235",
    "startDate":"23/07/2020",
    "endDate":"24/06/2020",
    "newId":"2345"
    },

Запрос, который я пытался

{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        },
        {
          "bool": {
            "must": [
             
              {
                "bool": {
                  "must": [
                    {
                      "exists": {
                        "field": "newId"
                      }
                    },
                    {
                      "range": {
                        "endDate": {
                          "gte":"now/d"
                        }
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must_not": [
                       {
                      "exists": {
                        "field": "newId"
                      }
                    },
                   
                    {
                      "range": {
                        "endDate": {
                          "gte": "now-2M"
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Ожидаемый результат

{"id": "234", "startDate": "23.07.2020", "endDate": "24.09.20202", "newId": "2345"}, {" id ":" 234 "," startDate ":" 23.07.2020 "," endDate ":" 24.09.20202 "," newId ": null},

1 Ответ

1 голос
/ 05 августа 2020

Отличное начало! Ваш запрос почти правильный, но вам нужно еще несколько настроек, а именно использовать should вместо must, потому что оба подзапроса никогда не будут выполняться одновременно:

{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "must": [
              {
                "exists": {
                  "field": "newId"
                }
              },
              {
                "range": {
                  "endDate": {
                    "gte": "now/d"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "range": {
                  "endDate": {
                    "gte": "now-2M"
                  }
                }
              },
              {
                "bool": {
                  "must_not": [
                    {
                      "exists": {
                        "field": "newId"
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
...