Запрос Elasticsearch не дает ожидаемого результата

Это документ, который у меня есть в моем индексе (их тоже может быть несколько):

{
        "_index" : "meeting",
        "_type" : "meeting",
        "_id" : "27",
        "_score" : 1.0,
        "_source" : {
          "createTime" : "2020-07-20T14:49:05.803",
          "createTimeInMs" : 1595234945803,
          "createdBy" : "[email protected]",
          "editTime" : "2020-07-20T14:49:05.803",
          "editTimeInMs" : 1595234945803,
          "editedBy" : "[email protected]",
          "versionId" : 1,
          "id" : "27",
          "projectId" : "62",
          "projectName" : "sdfsdf",
          "meetingName" : "meeting1",
          "agenda" : "string",
          "startDateString" : "2020-07-20T00:45:19.604",
          "userId" : 3,
          "memberList" : [
            3,
            4
          ],
          "status" : "ACTIVE",
          "timeZone" : "Asia/Dhaka",
          "startDate" : "2020-07-20T00:45:19.604",
          "endDate" : "2020-07-20T01:45:19.604",
          "dateInMS" : 1595227519000,
          "meetingPlace" : "string",
          "endDateString" : "2020-07-20T01:45:19.604"
        }
      }

По логике вещей я пытаюсь создать такое состояние:

if((projectId==62 && startDate>=inputFrom && startDate <=inputTo) && (status==ACTIVE ||status==POSTPONED))

Мой запрос (из кибаны):

GET /meeting/_search?pretty
{
  "query": 
  {
    "bool" : {
    "must" : [
      {
        "term" : {
          "projectId" : {
            "value" : "62",
            "boost" : 1.0
          }
        }
      },
      {
        "terms" : {
          "status" : [
            "ACTIVE",
            "POSTPONED"
          ],
          "boost" : 1.0
        }
      },
      {
        "range" : {
          "startDate" : {
            "from" : "2020-07-19T23:45:19.604Z",
            "to" : "2020-07-20T00:49:19.604Z",
            "include_lower" : true,
            "include_upper" : true,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
  }
}

Я сравниваю запрос диапазона для поля startDate в указанном диапазоне с другими полями must выше. Но не получил ни единого удара! Я хочу получить документы, для которых startDate находится в пределах заданной даты from и to.
Поскольку я совершенно неопытен в этой области, не знаю, почему не работает! Пожалуйста, помогите, как исправить этот запрос, чтобы сделать это?


person user404    schedule 20.07.2020    source источник


Ответы (1)


Таким образом можно объединить несколько запросов с помощью bool. Предложение must будет работать как логическое И и обеспечит соблюдение всех условий.

Чтобы вернуть документы, содержащие термины в указанном диапазоне, обратитесь к этой официальной документации ES на Запрос диапазона

Поскольку вы не предоставили никакого сопоставления для проиндексированных данных, я не указал никакого явного сопоставления для индекса.

Приведенный ниже поисковый запрос даст вам ожидаемый результат в соответствии с вашим состоянием, указанным в вопросе.

Поисковый запрос:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "projectId": "62"
          }
        },
        {
          "range": {
            "startDate": {
              "gte": "2020-07-20T00:44:19.604",
              "lte": "2020-07-21T00:45:19.604"
            }
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "status.keyword": "ACTIVE"
                }
              },
              {
                "term": {
                  "status.keyword": "POSTPONED"
                }
              }
            ]
          }
        }
      ]
    }
  }
}
person ESCoder    schedule 21.07.2020
comment
Благодарю. Позже я последовал этому подходу только без bool для предложения should и служил моим целям! - person user404; 21.07.2020
comment
@ user404 в порядке :) Поскольку вы не предоставили никакого собственного ответа (и этот ответ также решает вашу проблему), можете ли вы принять этот ответ, так как это поможет другим также решить их проблему, если они застряли в подобном типе вопроса :) И спасибо, что проголосовали за ответ :) - person ESCoder; 21.07.2020
comment
Ценю твои старания! И принимая, что мое и твое почти одинаковы - person user404; 21.07.2020