Как мы можем уменьшить количество предложений по эластичным запросам? - PullRequest
0 голосов
/ 15 января 2020

Мы написали запрос эластичного поиска для получения сгруппированных данных из индекса для указанного c диапазона дат. Однако если мы увеличим диапазон дат, размер нашего запроса увеличится с помощью динамически добавленных предложений диапазона дат. динамически увеличивающийся пример запроса

 "query": {
"bool": {
  "filter": [
    {
      "bool": {
        "minimum_should_match": 1,
        "must": [
          {
            "range": {
              "startDate": {
                "gte": "2018-05-28T21:00:00Z",
                "lte": "2021-04-04T20:59:59Z"
              }
            }
          }
        ],
        "should": [
          {
            "bool": {
              "must": [
                {
                  "range": {
                    "startDate": {
                      "gte": "2019-12-24T04:30:00Z",
                      "lte": "2019-12-24T14:00:00Z"
                    }
                  }
                }
              ]
            }
          },
          {
            "bool": {
              "must": [
                {
                  "range": {
                    "startDate": {
                      "gte": "2020-11-09T04:30:00Z",
                      "lte": "2020-11-09T14:00:00Z"
                    }
                  }
                }
              ]
            }
          },
          {
            "bool": {
              "must": [
                {
                  "range": {
                    "startDate": {
                      "gte": "2020-07-28T14:00:00Z",
                      "lte": "2020-07-28T20:59:00Z"
                    }
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "term": {
        "tenantId": {
          "value": "b29aadd8-b1bb-4754-ab26-b59eebe6d86a"
        }
      }
    },
    {
      "term": {
        "status.keyword": {
          "value": "ProductionEnd"
        }
      }
    },
    {
      "range": {
        "startDate": {
          "gte": "2018-05-28T21:00:00Z",
          "lte": "2021-04-04T20:59:59Z"
        }
      }
    }
  ]
}},

У нас есть данные на основе времени, и мы хотим отфильтровать их по дате и времени, как описано выше, но мы хотим отфильтровать данные за 3 месяца, и будет слишком большой фильтр диапазона, и мы получим ошибка ( "too_many_clauses" ) из-за размера запроса. Итак, мы хотим уменьшить количество запросов. Как мы можем переписать запрос?

Спасибо

1 Ответ

1 голос
/ 15 января 2020

Я думаю, что один из вариантов для вас - разделить такой большой запрос следует на меньшие куски запросов. Таким образом, запрос bool не расширяет лимит в 1024 предложения.

bool
|___should
|   |___should query with 1024 range queries 
|   |___should query with 1024 range queries 
|   |___...  range queries 

Вот простой пример того, о чем я говорю

var ranges = Enumerable.Range(0, 3000).Select((x, i) =>
    new QueryContainer(new DateRangeQuery {Name = $"query_{i}", Field = $"date", GreaterThan = "now"}));

var part1 = ranges.Take(1024)
    .Aggregate((agg, q) => agg || q);
var part2 = ranges.Skip(1024).Take(1024)
    .Aggregate((agg, q) => agg || q);

var searchResponse = await client.SearchAsync<object>(s => s
    .Query(q => q.Bool(b => b.Should(part1, part2))));

Надеюсь, это поможет.

...